タブ内のフラグメントを変更するフラグメント コンテナを実装しました。(参照: 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 を誤解している可能性があります。メソッドを呼び出す必要がありますか?