9

この重複する問題をテストするサンプル アプリを作成しました。

フラグメント タイプ Fragment1 があり、Fragment1 の新しいインスタンスを作成し、実行時にアクティビティの FrameLayout に追加します。いくつかのボタンを使用してフラグメントを追加します。

注: Fragment1 の新しいインスタンスごとに異なる番号 (#1、#2、#3 など) を UI に表示して、表示しているフラグメントを把握できるようにしました。

だから..これが私がすることです:

  1. ボタン 3 をクリックし、Fragment1 の新しいインスタンスを作成して Frame1 に追加します。
  2. ボタン 4 をクリックし、Fragment1 の新しいインスタンスを作成して Frame1 に追加し、フラグメント バックスタックに追加します。
  3. 1と2を繰り返します。
  4. 1と2を繰り返します。

これで、1(#1)、2(#2)、1(#3)、2(#4)、1(#5)、2(#6) の順序でフラグメントができました。

フラグメント #6 を表示しているときに戻るキーを押します。

  1. 戻るキーを押すと、UI が表示されます (#5)。
  2. 戻るキーの押下、UI 表示 (#3 および #5)、
  3. 戻るキーを押すと、UI が表示されます (#1、#3、および #5)

フラグメントが互いの上に表示されているようです。

なぜ?重複する問題はありますか?この重複する問題を解決するにはどうすればよいですか。これは互換性ライブラリの問題だと思っていましたが、3.0 でも同じです。

フラグメントを追加するコード:

public int  doFragmentChange(int cont1, Fragment frag1, String tag1, int cont2, Fragment frag2, String tag2, 
            boolean addToStack, String stackTag) {
        FragmentManager fm = getFragmentManager();// getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        if (frag1 != null) {
            ft.replace(cont1, frag1, tag1);
        }
        if (frag2 != null) {
            ft.replace(cont2, frag2, tag2);
        }
        // add fragment to stack
        if (addToStack)
            ft.addToBackStack(stackTag);
        return ft.commit();
    } 
4

2 に答える 2

1

add2つの呼び出しを次々に実行すると(2つのcommit呼び出し)、はい、フラグメントは効果的に重ねて表示されます。

したがって、(新しい例の場合)バックスタックトランザクションなしで同じフレームでfrag1をfrag2に置き換え、次にfrag3をfrag4に置き換えるとすると、frag2とfrag4がオーバーレイされると予想されます。

さらに、のチェーンには潜在的な問題もありますreplace。それぞれに個別commitに電話する必要があります。Androidを参照してください—フラグメントバックスタックを新しいスタックに置き換えますか?

于 2011-06-24T08:26:16.717 に答える
1

onBackPress()orをオーバーライドしてonKeyUp、一番上のフラグメントを削除するだけです。

于 2012-03-20T10:15:25.173 に答える