我已经实现了一个片段容器来更改我的选项卡中的片段。(请参阅:android,动态更改选项卡内的片段)
我正在使用一个片段选项卡主机和一个框架布局(它在一个单独的活动中)将我的片段加载到其中。我的片段中有一个按钮正在变成另一个片段。我已经实现了该方法,并且解决了重叠片段问题。问题是,现在,每次我按下后退按钮时,我的应用程序都会退出(无论我的片段在哪里)。
我已经检查过我在提交之前是否tx.addToBackStack(curFrag.getClass().getSimpleName())
尝试过tx.addBackStack(null)
,但仍然没有做任何事情。有人可以帮我吗?谢谢你。
编辑:
我已经在我的标签主机中添加了一个标签。这是我的 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,我应该调用我的方法?