5

由于不推荐使用 TabActivity,因此我需要找到一种使用 Fragments 的方法。在我知道它是如何工作之前,我已经使用过 Fragments,但我需要一个指南来使用 FragmentActivities 创建我的标签主机。我在互联网上找到了几个示例,它们都是关于将片段放入选项卡的容器中。

我想要的是为每个选项卡放置 FragmentActivities。因为在我的应用程序中,我将使用 4 个选项卡,每个选项卡中都有非常复杂的内容。因此,我需要为每个选项卡设置一个 FragmentActivity 来管理我将放置在单独容器中的每个选项卡下的片段。

解决方案:

在互联网上回答和搜索后,我最终得到了一个解决方案。根据我找到的解决方案,我在标签主机下的每个标签的单独堆栈中跟踪片段。是我的 GitHub 存储库,我为这个问题创建了一个小示例应用程序。

4

2 回答 2

9

由于不推荐使用 TabActivity,因此我需要找到一种使用 Fragments 的方法。

如果您不想使用TabActivity- 忘记放入FragmentActivities选项卡的内容。

我提醒您可以TabWidget不使用TabActivity. 所以你可以试试这个解决方案:

  1. 只创建一个FragmentActivity.
  2. 放入TabWidget' FragmentActivitys 布局。使TabWidget内容的高度 = 0。
  3. TabWidgetXML 中为您声明容器FragmentFrameLayout例如)。
  4. FragmentActivity 只需处理选择了哪个选项卡 ( TabHost.OnTabChangeListener) 并将需要的选项Fragment放入容器中 。
  5. 将程序逻辑(在不同活动中较早)放入不同的片段中。

或者您可以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活着。看看片段生命周期。当你一个片段到另一个片段时,只有片段的OnCreateViewonDestroyView方法会一次又一次地调用。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- 系统将尝试保存片段的状态(包含所有输入数据)。链接到描述

于 2012-09-10T09:08:18.913 回答
1

将选项卡内容放入单独的活动的方法已被弃用,因为现在我们有了 Fragment 框架。您应该将选项卡的复杂内容放入片段中,并在用户选择选项卡时交换这些片段。

推荐的解决方案是使用带有 Tab 导航的 ActionBar,而不是使用 TabHost 小部件。

于 2012-09-10T08:37:33.290 回答