android-fragments getfragmentmanager () - Android Fragmentのバックスタックに関する問題




4 Answers

右!!! 多くの髪を引っ張った後、私は最終的にこれを適切にする方法を研究しました。

あなたが手作業で行う必要があるので、背中を押すと、フラグメント[3]がビューから削除されないようです。

まず第一に、replace()を使わず、代わりにremoveとaddを使います。 replace()が正しく動作しないようです。

次の部分は、onKeyDownメソッドをオーバーライドし、戻るボタンが押されるたびに現在のフラグメントを削除することです。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
    if (keyCode == KeyEvent.KEYCODE_BACK)
    {
        if (getSupportFragmentManager().getBackStackEntryCount() == 0)
        {
            this.finish();
            return false;
        }
        else
        {
            getSupportFragmentManager().popBackStack();
            removeCurrentFragment();

            return false;
        }



    }

    return super.onKeyDown(keyCode, event);
}


public void removeCurrentFragment()
{
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

    Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);


    String fragName = "NONE";

    if (currentFrag!=null)
        fragName = currentFrag.getClass().getSimpleName();


    if (currentFrag != null)
        transaction.remove(currentFrag);

    transaction.commit();

}

お役に立てれば!

getbackstackentrycount (); tag

私はアンドロイドの断片のバックスタックがうまくいくと思われる方法に大きな問題を抱えており、提供されているヘルプに対して最も感謝しています。

3つの断片があると想像してください

[1] [2] [3]

ユーザーは[1] > [2] > [3]をナビゲートすることができますが、戻って(戻るボタンを押す) [3] > [1]

これは、XMLで定義されたフラグメントホルダにfragment [2]を持ち込むトランザクションを作成するときに、 addToBackStack(..)addToBackStack(..)ないことで実現できます。

これは、 [3]ボタンを押したときに[2]が再び表示されないようにaddToBackStackと、フラグメント[3]を表示するトランザクションでaddToBackStackを呼び出す必要はないとaddToBackStackられます。 これは全く直感的ではないようです(おそらく、iOSの世界から来ている)。

とにかく私がこのようにすれば、 [1] > [2]から戻ってくると、私は期待通りに[1]戻ってきます。

私が[1] > [2] > [3]してから戻ると、私は( [1]戻ります。 今、 [1]からもう一度[2]ジャンプしようとすると、奇妙な動作が起こります。 まず、 [2]が表示される前に、まず[3]が表示されます。 この時点で[3]を押して戻ると、もう一度押すとアプリが終了します。

誰も私がここで何が起こっているのか理解するのを助けることができますか?


そして、私の主な活動のレイアウトXMLファイルは次のとおりです:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >

<fragment
        android:id="@+id/headerFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.fragment_test.FragmentControls" >
    <!-- Preview: layout=@layout/details -->
</fragment>
<FrameLayout
        android:id="@+id/detailFragment"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"

        />



更新これはnav heirarchyでビルドするために使用しているコードです

    Fragment frag;
    FragmentTransaction transaction;


    //Create The first fragment [1], add it to the view, BUT Dont add the transaction to the backstack
    frag = new Fragment1();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.commit();

    //Create the second [2] fragment, add it to the view and add the transaction that replaces the first fragment to the backstack
    frag = new Fragment2();

    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.addToBackStack(null);
    transaction.commit();


    //Create third fragment, Dont add this transaction to the backstack, because we dont want to go back to [2] 
    frag = new Fragment3();
    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.commit();


     //END OF SETUP CODE-------------------------
    //NOW:
    //Press back once and then issue the following code:
    frag = new Fragment2();
    transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.detailFragment, frag);
    transaction.addToBackStack(null);
    transaction.commit();

    //Now press back again and you end up at fragment [3] not [1]

どうもありがとう




私はそれが古い質問であることを知っているが、私は同じ問題を抱えており、これを次のように修正する:

まず、名前を付けてBackStackにFragment1を追加します(例: "Frag1")。

frag = new Fragment1();

transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.detailFragment, frag);
transaction.addToBackStack("Frag1");
transaction.commit();

そして、あなたがFragment1に戻るときは(その上に10個のフラグメントを加えた後でも)、名前をつけてpopBackStackImmediateを呼ぶだけです:

getSupportFragmentManager().popBackStackImmediate("Frag1", 0);

それが誰かを助けることを願って:)




addToBackStack()&popBackStack()で苦労しているのであれば、

FragmentTransaction ft =getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, new HomeFragment(), "Home");
ft.commit();`

あなたのアクティビティでOnBackPressed()タグでfargmentを見つけて、次にあなたのものを行います

Fragment home = getSupportFragmentManager().findFragmentByTag("Home");

if (home instanceof HomeFragment && home.isVisible()) {
    // do you stuff
}

詳細については、 https://github.com/DattaHujare/NavigationDrawerhttps://github.com/DattaHujare/NavigationDrawer 。フラグメントを処理するためにaddToBackStack()を使用することはありません。




私は同じActivity [M1.F0] - > [M1.F1] - > [M1.F2]で3つの連続した断片があり、それに続いて新しいActivity [M2]が呼び出された同様の問題を抱えていました。 ユーザーが[M2]でボタンを押した場合、私は[M1、F2]の代わりに[M1、F1]に戻りたいと思います。

これを達成するには、[M1、F2]を削除し、[M1、F1]でshowを呼び出し、トランザクションをコミットしてから、[M1、F2]をhideと呼んで追加します。 これにより、残っていた余分なバックプレスが取り除かれました。

// Remove [M1.F2] to avoid having an extra entry on back press when returning from M2
final FragmentTransaction ftA = fm.beginTransaction();
ftA.remove(M1F2Fragment);
ftA.show(M1F1Fragment);
ftA.commit();
final FragmentTransaction ftB = fm.beginTransaction();
ftB.hide(M1F2Fragment);
ftB.commit();

こんにちはこのコードを実行した後:私はバックキーを押してFragment2の値を見ることができません。 私のコード:

FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.frame, f1);
ft.remove(f1);

ft.add(R.id.frame, f2);
ft.addToBackStack(null);

ft.remove(f2);
ft.add(R.id.frame, f3);

ft.commit();

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event){

        if(keyCode == KeyEvent.KEYCODE_BACK){
            Fragment currentFrag =  getFragmentManager().findFragmentById(R.id.frame);
            FragmentTransaction transaction = getFragmentManager().beginTransaction();

            if(currentFrag != null){
                String name = currentFrag.getClass().getName();
            }
            if(getFragmentManager().getBackStackEntryCount() == 0){
            }
            else{
                getFragmentManager().popBackStack();
                removeCurrentFragment();
            }
       }
    return super.onKeyDown(keyCode, event);
   }

public void removeCurrentFragment()
    {
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        Fragment currentFrag =  getFragmentManager().findFragmentById(R.id.frame);

        if(currentFrag != null){
            transaction.remove(currentFrag);
        }
        transaction.commit();
    }



Related