用FragmentActivity和Fragments替换TabActivity

5
由于TabActivity已被弃用,我需要找到一种使用Fragments的方法来实现它。我以前使用过Fragments,知道它的工作原理,但我需要一个指南来创建带有FragmentActivities的选项卡主机。我在互联网上找到了一些示例,它们都是关于将片段放入选项卡的容器中。
我想为每个选项卡放置FragmentActivities。因为在我的应用程序中,我将使用4个选项卡,每个选项卡都有非常复杂的内容。因此,我需要为每个选项卡拥有一个FragmentActivity来管理我将放置在每个选项卡下的Fragments,并将其放置在单独的容器中。 解决方案: 经过答案和互联网搜索,我找到了一个解决方案。根据我找到的解决方案,我在选项卡主机下为每个选项卡跟踪分离的堆栈中的Fragments。这里是我的GitHub存储库,我为这个问题创建了一个小的示例应用程序。
2个回答

9
由于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) {
    // TODO Auto-generated method stub
    super.onCreate(arg0);
    setContentView(R.layout.fragmentactivity_layout);
}
}

如果这样做,您的fragmentX变量将不会在每次放置它们在fragment_container时被删除。只要您的FragmentActivity存在,它们就会存在。请查看片段生命周期。当您将一个片段替换为另一个片段时,只有片段的OnCreateViewonDestroyView方法会一遍又一遍地调用。
此外,片段还有它们自己的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);

    //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),系统将尝试保存片段的状态(包括所有输入数据)。链接到说明


我已经编辑了我的答案。请看一下。还有在示例(“ApiDemos”)中有片段示例。请查看它们。 - ashakirov
我知道这个,但这不是我要问的。我已经使用了fragments并且知道它是如何工作的。我不知道的是:假设我们在第一个选项卡中,并且当用户单击按钮时,我调用另一个fragment,对于第二步,我更改到第二个选项卡,那么这将用第二个选项卡的fragment替换其中的数据,对吗?但我还想保留在第一个选项卡中进行的更改。所以如果我只是在onTabChange中替换fragments,这将不能保留在前一个选项卡中先前更改的内容。有什么想法? - osayilgan
好的,我似乎理解了你的问题。我又编辑了一次我的答案!请查看 :) - ashakirov
我会尽快尝试并告诉你结果。再次感谢你的回答 :) - osayilgan
1
@QadirHussain,请查看我在问题中的编辑。您可以找到包含我的解决方案的示例应用程序。希望它有所帮助。 - osayilgan
显示剩余3条评论

1

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

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


谢谢你的回答,我对使用它有一些担忧。例如,如果我为第一个选项卡放置一个片段,我将需要在同一选项卡内进行导航,据我所知,我们只使用一个容器来包含所有选项卡和其中的片段,因此,在主容器中添加了几个片段后,我将切换到第二个选项卡,这样做时,它将删除我在第一个选项卡中创建并放入容器中的所有片段,并将第二个片段放入主容器中。 - osayilgan
我在第一个选项卡中创建的所有数据都将被删除并替换为第二个片段?如果我回到第一个选项卡,那怎么办?我需要重新创建它吗? - osayilgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接