由于TabActivity已被弃用,我需要找到一种用Fragments的方法来实现它。
如果您不想使用TabActivity,请勿将FragmentActivities放入选项卡内容中。
我提醒您可以在没有TabActivity的情况下使用TabWidget。因此,您可以尝试这个解决方案:
1.创建一个FragmentActivity。
2.将TabWidget放入FragmentActivity的布局中。使TabWidget的内容高度为0。
3.在XML中,在TabWidget下声明用于Fragment的容器(例如FrameLayout)。
4.在FragmentActivity中处理选定哪个选项卡(TabHost.OnTabChangeListener),并将所需的Fragment放入容器中。
5.将以前在不同活动中的程序逻辑放入不同的Fragments中。
或者,您可以创建带有TabWidget的FragmentActivity,而不是切换片段,可以直接将片段放入每个选项卡的内容中。
例如,如果您有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) {
super.onCreate(arg0);
setContentView(R.layout.fragmentactivity_layout);
}
}
如果这样做,您的
fragmentX
变量将不会在每次放置它们在
fragment_container
时被删除。只要您的
FragmentActivity
存在,它们就会存在。请查看
片段生命周期。当您将一个片段替换为另一个片段时,只有片段的
OnCreateView
和
onDestroyView
方法会一遍又一遍地调用。
此外,片段还有它们自己的
onSaveInstanceState
方法,您可以在其中保存片段的状态。例如:用户在片段1的editText中输入了他的姓名。如果您想在用户发现其他片段时保留此数据(名称字符串),则应该:
1. 在片段1的
onSaveInstanceState
方法中保存名称字符串
2. 在片段1的
onCreateView
方法中检查savedInstanceState bundle,如果不为空,则使用从bundle获取的字符串填充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);
if(savedInstanceState!=null){
String nameString=(String) savedInstanceState.get("nameString");
nameEditText.setText(nameString);
}
return fragment1View;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("nameString", nameEditText.getText().toString());
}
你可以在保存数据之前进行检查。我希望现在我的观点更清晰了。
此外,如果您在fragment
的onCreateView()
方法中调用setRetainInstance(true)
,系统将尝试保存片段的状态(包括所有输入数据)。链接到说明