由于不推荐使用 TabActivity,我需要找到一种使用 Fragments 的方法。
如果您不想使用TabActivity - 忘记将FragmentActivities 放入标签的内容。
我提醒您可以使用TabWidget 而不使用TabActivity。所以你可以试试这个解决方案:
- 只创建一个
FragmentActivity。
- 将
TabWidget 放入FragmentActivity 的布局中。使TabWidget的内容高度=0。
- 在 XML 中的
TabWidget 下为您声明容器Fragments(例如FrameLayout)。
- 在
FragmentActivity 中,只需处理选择了哪个选项卡(TabHost.OnTabChangeListener)并将所需的Fragment 放入容器中。
- 将程序逻辑(之前在不同活动中)放入不同的片段中。
或者您可以使用TabWidget 创建FragmentActivity,而不是切换Fragments,您可以直接将Fragments 放入每个选项卡的内容中。
例如,如果您有 3 个选项卡和 3 个片段,请尝试我所做的。当您需要将一个片段更改为另一个片段时,请致电showFragmentX。
public class Test extends FragmentActivity {
private Fragment1 fragment1=new Fragment1();
private Fragment2 fragment2=new Fragment2();
private Fragment3 fragment3=new Fragment3();
private void showFragment1(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment1);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
private void showFragment2(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment2);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
private void showFragment3(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment3);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.fragmentactivity_layout);
}
}
如果您这样做,您的fragmentX 变量不会在您每次将它们放入fragment_container 时被删除。他们会在你的FragmentActivity 活着的时候活着。看看fragments lifecycle。
只有OnCreateView 和onDestroyView 片段的方法会在你replace 一个片段到另一个片段时一次又一次地调用。
Fragments 还有他们的onSaveInstanceState 方法,您可以在其中保存片段的状态。例如:用户在 fragment1 的 editText 中输入了他的名字。如果您想在用户发现其他片段时保留此数据(名称字符串),您应该
1.在fragment1的onSaveInstanceState方法中保存名称字符串
2.进入fragment1的onCreateView方法检查savedInstanceState包,如果它不为null - 用你从包中获得的字符串填充edittext。
public class Fragment1 extends Fragment {
EditText nameEditText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View fragment1View=inflater.inflate(R.layout.fragment1_layout, container, false);
nameEditText=(EditText) fragment1View.findViewById(R.id.edittext_name);
//check for saved data. if it is not null - fill your edittext with saved string
if(savedInstanceState!=null){
String nameString=(String) savedInstanceState.get("nameString");
nameEditText.setText(nameString);
}
return fragment1View;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//save data that user have entered
outState.putString("nameString", nameEditText.getText().toString());
}
}
您可以在保存前检查数据。我希望我的观点现在很清楚了。
此外,如果您在fragment 的onCreateView() 方法中调用setRetainInstance(true) - 系统将尝试保存片段的状态(包含所有输入数据)。 link to description