我已经实现了一个片段容器来更改标签内的片段。 (见:android, dynamically change a fragment inside a tab)
我正在使用片段标签主机和framelayout(它在一个单独的活动上)将片段加载到其中。我的片段中有一个按钮正在转换为另一个片段。我已经实现了该方法,并解决了重叠片段问题。事情是,现在,每次按下后退按钮,我的应用程序都会退出(无论我的片段在哪里)。
我已经检查过,在提交之前,tx.addToBackStack(curFrag.getClass().getSimpleName())
甚至尝试使用tx.addBackStack(null)
,但仍然没有做任何事情。谁能帮助我?谢谢。
编辑:
我已经在我的tabhost中添加了一个标签。 这是我的FragmentTabMenu.java
setContentView(R.layout.activity_fragment_tab_menu);
Resources res = getResources();
mtabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); //id from the activity that hosts the tabwidget
mtabHost.setup(this, getSupportFragmentManager(), R.id.FrameLayout1); //id from the other activity that only hosts the framelayout
//passing the class that my container will execute on the onResume method
Bundle args1=new Bundle();
args1.putSerializable(PARAM_CONTENT_FRAGMENT,RegistoUtilizador.class);
//creating the tab
mtabHost.addTab(
mtabHost.newTabSpec("RegistoUti").setIndicator("Tab 1",
res.getDrawable(R.drawable.tab_icon_rui)),
ContentorFragRegistoUti.class, args1);
这是我的容器类
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag_container, null);
}
public void replaceContent(Class<? extends Fragment> clz, Bundle args) {
FragmentTransaction tx = getChildFragmentManager().beginTransaction();
tx.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// save
Fragment curFrag = getChildFragmentManager().findFragmentById(R.id.FrameLayout1);
tx.addToBackStack(curFrag.getClass().getSimpleName());
// change
try {
Fragment newFragment = clz.newInstance();
newFragment.setArguments(args);
tx.replace(R.id.FrameLayout1, newFragment, clz.getClass().getSimpleName());
tx.commit();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void onResume() {
super.onResume();
Fragment f = getChildFragmentManager().findFragmentById(R.id.FrameLayout1);
if (f == null) {
Class<? extends Fragment> claz = (Class<? extends Fragment>) getArguments().getSerializable(
PARAM_CONTENT_FRAGMENT);
FragmentTransaction tx = getChildFragmentManager().beginTransaction();
try {
f = claz.newInstance();
f.setTargetFragment(this, 0);
tx.add(R.id.FrameLayout1, f);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
也许我错过了什么Framelayout id,我应该调用我的方法?
答案 0 :(得分:0)
让我给你一些提示:
假设整个应用程序中有3个选项卡:
一个主要活动= TabActivity 在此活动中添加三个选项卡 喜欢 : 标签1 = FragmentActivity 标签2 = FragmentActivity 标签3 = FragmentActivity
标签1 - &gt;不同的碎片 标签2 - &gt;不同的碎片 标签3 - &gt;不同的碎片
等等:
在每个片段中保存您的偏好
然后,在第二次启动应用程序时,您知道之前选择了哪个选项卡,因此触发了FragmentActivity的意图,现在您在该选项卡中然后触发该活动中受尊重的片段..
注意:说真的,如果你想恢复旧的后台堆栈,那么它就不会发生,因为它自己处理了FragmentActivity的后台堆栈。
答案 1 :(得分:0)
Activecontainer是我从sharedpreferences得到的字符串已被片段名称标记。
现在我只需要设置片段。有什么建议吗? 谢谢。