由于 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
。所以你可以试试这个解决方案:
- 只创建一个
FragmentActivity
。 - 将
TabWidget
放入FragmentActivity
的布局中。使TabWidget
的内容的高度 = 0。 - 在
TabWidget
下,在 XML 中为您的Fragment
声明容器(例如FrameLayout
)。 - 在
FragmentActivity
中,只需处理选择了哪个选项卡 (TabHost.OnTabChangeListener
) 并将所需的Fragment
放入容器中。 - 将程序逻辑(在不同的 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 的OnCreateView
和onDestroyView
方法会一次又一次地调用。
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());
}
您可以在保存前检查数据。我希望我的观点现在很清楚。
此外,如果您在 fragment
的 onCreateView()
方法中调用 setRetainInstance(true)
- 系统将尝试保存 fragment 的状态(包含所有输入数据)。 link to description
关于android - 用 FragmentActivity 和 Fragments 替换 TabActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12347886/