当我的应用程序开始时,主片段中会显示一个列表(list_main)。当我点击主列表片段中的第一个列表项时,还应该打开第二个列表片段,但是在单击第一个列表项后,主列表片段DOES消失但第二个列表没有出现因此主片段仍然是空白。此外,当我单击后退按钮时,主列表不再出现。有谁知道为什么会出现这些问题以及如何解决这些问题?
主要活动XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:showDividers="middle"
tools:context=".MainActivity" >
<fragment
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/master_container"
android:name="com.apptacularapps.exitsexpertlondonlite.FragmentMainList"/>
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:id="@+id/detail_container"/>
</LinearLayout>
主要列表片段XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragmentmainlist">
<ListView
android:id="@+id/list_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="false"
android:layout_centerHorizontal="true"/>
</LinearLayout>
主要列表片段类
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class FragmentMainList extends android.support.v4.app.Fragment {
ListView list_main;
String[] listContent = {
"Item 1",
"Item 2",
"Item 3"
};
private boolean mTwoPane;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment_main_list, container, false);
list_main = (ListView)v.findViewById(R.id.list_main);
list_main = (ListView)findViewById(R.id.list_main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listContent);
list_main.setAdapter(adapter);
list_main.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if (mTwoPane) {
for (int j = 0; j < adapterView.getChildCount(); j++)
adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT);
// change the background color of the selected list view item
view.setBackgroundColor(Color.parseColor("#00BCD4"));
}
if (position == 0) {
if (mTwoPane) {
FragmentItem1 newFragment = new FragmentItem1();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
list_main.setVisibility(View.GONE);
transaction.replace(R.id.master_container, newFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.addToBackStack(null);
transaction.commit();
} else {
}
}
if (position == 1) {
}
if (position == 2) {
}
}
});
return v;
}
}
主要活动类
public class MainActivity extends ActionBarActivity {
ListView list_main;
String[] listContent = {
"Station Chooser",
"Item 2",
"Item 3"
};
private boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list_main = (ListView)findViewById(R.id.list_main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listContent);
list_main.setAdapter(adapter);
list_main.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
if (position == 0) {
if (mTwoPane) {
FragmentStationChooser newFragment = new FragmentStationChooser();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.master_container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
getSupportFragmentManager().executePendingTransactions();
} else {
}
}
if (position == 1) {
}
if (position == 2) {
}
}
});
if (findViewById(R.id.detail_container) != null) {
mTwoPane = true;
}
}
}
电台选择器片段
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_linechooser"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="false"
android:layout_centerHorizontal="true"/>
</LinearLayout>
Station Chooser片段类
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentStationChooser extends android.support.v4.app.Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_station_chooser, container, false);
}
}
Station Chooser Activity class
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class StationChooserActivity extends ActionBarActivity {
ListView list_linechooser;
String[] listContent = {
"Line 1",
"Line 2",
"Line 3"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_station_chooser);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(false);
list_linechooser = (ListView)findViewById(R.id.list_linechooser);
list_linechooser.setAdapter(adapter);
list_linechooser.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
}
});
}
@Override
public void onBackPressed() {
if (mTwoPane) {
FragmentMainList newFragment = new FragmentMainList();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
list_main.setVisibility(View.VISIBLE);
transaction.replace(R.id.master_container, newFragment).commit();
transaction.addToBackStack(null);
}
}
}
答案 0 :(得分:1)
由于您过去的评论以及我建议将代码从 StationChooserActivity .java移至 FragmentStationChooser
FragmentStationChooser 类的代码:
String[] listContent = {
"Line 1",
"Line 2",
"Line 3"
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_station_chooser, container, false);
ListView list_linechooser = (ListView) v.findViewById(R.id.list_linechooser);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.fragment_station_chooser, listContent);
list_linechooser.setAdapter(adapter);
return v;
}
这是一个开始。我尽力了解你的帖子和问题。祝你好运。
答案 1 :(得分:1)
在弹出backstack时片段未显示的主要问题是你试图在另一个片段id中膨胀该片段,这是代码的这一部分:
transaction.replace(R.id.master_container, newFragment);
您不需要一个全新的活动来托管您在FragmentStationChooser
中所做的另一个片段。
现在您需要做的是拥有一个容器来托管您的活动主体中的片段,而不是使用片段标签将其替换为容器,例如相对布局:
替换这个:
<fragment
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/master_container"
android:name="com.apptacularapps.exitsexpertlondonlite.FragmentMainList"/>
到
<RelativeLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/master_container"/>
执行此操作后,在您的主要活动中删除所有列表视图代码并将其传输到您在充气时使用该视图的FragmentMainList
:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View v = inflater.inflate(R.layout.fragment_main_list, container, false);
list_main = (ListView)v.findViewById(R.id.list_main);
.//the logic from your activity main transfered here in the FragmentMainList
.
.
return v;
}
最后在您的FragmentStationChooser
中执行相同操作,并且不要使用活动StationChooserActivity
将其从项目中移除
编辑:
删除list_main.setVisibility(View.GONE);
,因为它会在片段膨胀时被片段替换
编辑2:
在主要活动的onCreate中添加:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentMainList newFragment = new FragmentMainList();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.master_container, newFragment);
transaction.commit();
}
答案 2 :(得分:0)
似乎StationChooserActivity
是您的主要活动,并且没有其他活动。你没有提到那个。
您的应用程序唯一能做的就是根据数组listContent将“Line 1”,“Line 2”和Line 3显示在Listview中。这是由代码MyColoringAdapter adapter = new MyColoringAdapter(this,listContent)
引起的。
另一方面,当用户点击后退键时,如果mTwoPane为true,则可能会显示新的Fragment FragmentMainList,但不确定。之后我认为您的应用会退出。
注意:主要活动没有太大作用。我不认为这是意图。您需要确定如何处理它。这是我最好的建议。