android - 用 FragmentActivity 和 Fragments 替换 TabActivity

标签 android android-fragments android-tabhost android-fragmentactivity

由于 TabActivity 已被弃用,我需要找到一种方法来使用 Fragments 来完成它。在我知道它是如何工作之前,我已经使用过 Fragments,但我需要一个指南来使用 FragmentActivities 创建我的选项卡主机。我在 Internet 上找到了几个示例,它们都是关于将 fragment 放入选项卡的容器中。

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

解决方案:

在回答并在互联网上搜索后,我找到了一个解决方案。根据我找到的解决方案,我为选项卡主机下的每个选项卡跟踪单独堆栈中的 fragment 。 Here是我的 GitHub 存储库,我为这个问题创建了一个小示例应用程序。

最佳答案

Since TabActivity is deprecated I need to find a way to do it with Fragments.

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

我提醒你可以在没有TabActivity的情况下使用TabWidget。所以你可以试试这个解决方案:

  1. 只创建一个 FragmentActivity
  2. TabWidget 放入 FragmentActivity 的布局中。使 TabWidget 的内容的高度 = 0。
  3. TabWidget 下,在 XML 中为您的 Fragment 声明容器(例如 FrameLayout)。
  4. FragmentActivity 中,只需处理选择了哪个选项卡 (TabHost.OnTabChangeListener) 并将所需的 Fragment 放入容器中。
  5. 将程序逻辑(在不同的 Activity 中较早)放入不同的 fragment 中。

或者你可以用TabWidget创建FragmentActivity,而不是切换Fragment你可以直接把Fragment进入每个选项卡的内容。

例如,如果您有 3 个选项卡和 3 个 fragment ,请尝试我所做的。当您需要将一个 fragment 更改为另一个 fragment 时,调用 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);
}
}

如果这样做,每次将它们放入 fragment_container 时,您的 fragmentX 变量都不会被删除。它们将在您的 FragmentActivity 运行时运行。看看fragments lifecycle . 当您将一个 fragment 替换到另一个 fragment 时,只有 fragment 的OnCreateViewonDestroyView 方法会一次又一次地调用。

fragment 也有它们的 onSaveInstanceState 方法,您可以在其中保存 fragment 的状态。例如:用户在 fragment1 的 editText 中输入了他的名字。如果您想在用户发现其他 fragment 时保留此数据(名称字符串)

1.在fragment1的onSaveInstanceState方法中保存名称字符串
2. 进入 fragment1 的 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);

    //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());
}

您可以在保存前检查数据。我希望我的观点现在很清楚。

此外,如果您在 fragmentonCreateView() 方法中调用 setRetainInstance(true) - 系统将尝试保存 fragment 的状态(包含所有输入数据)。 link to description

关于android - 用 FragmentActivity 和 Fragments 替换 TabActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12347886/

相关文章:

android - 如何使用 getFragmentManager 将包传递给另一个 fragment

android - 如何在调用 popBackStack() 后将所选项目从 ListFragment 传递到上一个 Fragment?

android:layout_marginBottom 底部不留空间

android - 为什么我的 ServiceConnection 方法从未执行过?

android - Eclipse add tabhost to project报错

android - Braintree Paypal.Authorize() 不起作用

android - 在 AutocompleteTextView 中单击“完成”时未隐藏软键盘

android - EditText 在 fragment 内不可点击

Android:如何使用View的setTag、getTag和findViewWithTag方法?

android - 内存压力测试工具?