由于不推荐使用 TabActivity,因此我需要找到一种使用 Fragments 的方法。
如果您不想使用TabActivity- 忘记放入FragmentActivities选项卡的内容。
我提醒您可以TabWidget不使用TabActivity. 所以你可以试试这个解决方案:
- 只创建一个
FragmentActivity.
- 放入
TabWidget' FragmentActivitys 布局。使TabWidget内容的高度 = 0。
- 在
TabWidgetXML 中为您声明容器Fragment(FrameLayout例如)。
FragmentActivity 只需处理选择了哪个选项卡 ( TabHost.OnTabChangeListener) 并将需要的选项Fragment放入容器中 。
- 将程序逻辑(在不同活动中较早)放入不同的片段中。
或者您可以FragmentActivity使用TabWidget, 而不是切换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活着。看看片段生命周期。当你一个片段到另一个片段时,只有片段的OnCreateView和onDestroyView方法会一次又一次地调用。replace
Fragments 也有它们的onSaveInstanceState方法,您可以在其中保存片段的状态。例如:用户在 fragment1 的 editText 中输入了他的名字。如果您想在用户发现其他片段时保留此数据(名称字符串),您应该
onSaveInstanceState1.在fragment1的方法中保存名称字符串
2.到fragment1的 onCreateView方法中检查savedInstanceState bundle,如果它不为null - 用从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);
//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());
}
}
您可以在保存前检查数据。我希望我的观点现在很清楚。
此外,如果您调用您setRetainInstance(true) 的onCreateView()方法fragment- 系统将尝试保存片段的状态(包含所有输入数据)。链接到描述