0

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

4

2 に答える 2

0

はい、最初の部分は完了です。コンテナを呼び出して、以下を使用してロードします: mtabHost.setCurrentTabByTag("Activecontainer");

Activecontainer は、sharedpreferences から取得した文字列で、フラグメント名でタグ付けされています。

これで、フラグメントを設定するだけです。なにか提案を?ありがとうございました。

于 2013-08-23T16:34:33.700 に答える
0

何をすべきかのヒントを教えてください:

Whole App に 3 つのタブがあるとします。

1 つのメイン アクティビティ = TabActivity 次のように、このアクティビティに 3 つのタブを追加します。 タブ 1 = FragmentActivity タブ 2 = FragmentActivity タブ 3 = FragmentActivity

タブ 1 -> 異なるフラグメント タブ 2 -> 異なるフラグメント タブ 3 -> 異なるフラグメント

等々 :

各フラグメントで設定を保存します

次に、アプリの2回目の起動時に、以前に選択されたタブがわかっているため、その FragmentActivity のインテントをトリガーすると、そのタブにいて、そのアクティビティで尊重されるフラグメントをトリガーします..

注:古いバックスタックを回復することを真剣に考えている場合、OSがFragmentActivityのバックスタックを自己処理するため、そうはなりません..

于 2013-08-15T12:23:18.407 に答える