由于不推荐使用 TabActivity,因此我需要找到一种使用 Fragments 的方法。
如果您不想使用TabActivity
- 忘记放入FragmentActivities
选项卡的内容。
我提醒您可以TabWidget
不使用TabActivity
. 所以你可以试试这个解决方案:
- 只创建一个
FragmentActivity
.
- 放入
TabWidget
' FragmentActivity
s 布局。使TabWidget
内容的高度 = 0。
- 在
TabWidget
XML 中为您声明容器Fragment
(FrameLayout
例如)。
FragmentActivity
只需处理选择了哪个选项卡 ( TabHost.OnTabChangeListener
) 并将需要的选项Fragment
放入容器中 。
- 将程序逻辑(在不同活动中较早)放入不同的片段中。
或者您可以FragmentActivity
使用TabWidget
, 而不是切换Fragment
s 来创建,您可以直接将Fragment
s 放入每个选项卡的内容中。
例如,如果您有 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 中输入了他的名字。如果您想在用户发现其他片段时保留此数据(名称字符串),您应该
onSaveInstanceState
1.在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
- 系统将尝试保存片段的状态(包含所有输入数据)。链接到描述