web-dev-qa-db-ja.com

getBackStackEntryCount()は、addToBackStackとexecutePendingTransactions()を追加した後でも常に0を返します

私は2つのアクティビティAとBを持っています。アクティビティAにはmapFragmentがあり、それをバックスタックに追加しています。 BからActvity Aに戻ったとき、フラグメントを残したときと同じ状態で表示したい。しかし、getFragmentManager()。getBackStackEntryCount()は私に0を返します。これが私のコードです。

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.replace(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();

アクティビティBから戻ったとき、getBackStackEntryCount()の数を知るためにこれを持っています:

System.out.println("Number of entries in backstack "+ getFragmentManager().getBackStackEntryCount());

0を表示しています。

前もって感謝します。

23
user3555350

私の場合、getFragmentManager().getBackStackEntryCount()は常にゼロを返していました。

私の問題は、サポートフラグメントを使用していたことです。

_Fragment fragment = new MyFragment();
// note getSupportFragmentManager() instead getFragmentManager()
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame, fragment)
.addToBackStack(null)
.commit();

fragmentManager.executePendingTransactions();
_

私はgetFragmentManager()backStackEntryCountをチェックしています。これは常にゼロを返します(別のフラグメントマネージャーを使用しています)。

_@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0 ) {
        getFragmentManager().popBackStack();            
    }
}
_

正しい数値を返すgetSupportFragmentManagerの代わりに:

_@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0 ) {
        getSupportFragmentManager().popBackStack();         
    }
}
_
57
Neonigma

同様の問題があります。おかげで この答え 私はフラグメントの代わりに私のアクティビティで以下のコードを作成し、この解決策はうまくいきます:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Log.d("ovech", "back stack changed");
            Log.d("ovech", "back stack count = " + getSupportFragmentManager().getBackStackEntryCount());
            if(getSupportFragmentManager().getBackStackEntryCount()>0) {
                toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp);
            } else {
                toolbar.setNavigationIcon(null);
                Log.d("ovech", "hello without icon");
            }
            toolbar.invalidate();
        }
    });
2
Ovechkin Pavel

これを試して:

MapFragment mMapFragment = MapFragment.newInstance();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    mMapFragment.getMapAsync(this);
    fragmentTransaction.add(R.id.container, mMapFragment);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
    getFragmentManager().executePendingTransactions();

私はこの行を変更しました:

fragmentTransaction.replac(R.id.container, mMapFragment);

これに:

fragmentTransaction.add(R.id.container, mMapFragment);

フラグメントを置き換える場合は、バックスタックにないことを確認してください:)

1
apmartin1991

問題は、フラグメントを追加および削除する方法にあります。

supportFragmentManagerを使用して追加する場合は、backStackEntryCountでsupportFragmentManagerを使用する必要があります。

fragmentManagerを使用して追加する場合は、fragmentManagerを使用してフラグメントの量(backStackEntryCount)を取得する必要があります

// **Kotlin**
// AddFragment
val ft = supportFragmentManager.beginTransaction()
ft.replace(R.id.activity_base_content, f)
ft.addToBackStack(null)
ft.commit()

// Get amount of fragments 
supportFragmentManager.backStackEntryCount
0
Jorge Casariego

googleはgetFragmentManager()を廃止したので、常にgetSupportFragmentManager()を使用してください

ここをチェック 詳細については。

0
Shubham Sharma

私の例ではFM.getBackStackEntryCount()も0を返し、FM.executPendingTransactionsが機能しませんでした。

だからここに私が新しいフラグメントを追加する方法があります:

getFragmentManager().beginTransaction()
                        .add(contextLayout.getId(), toolFragment, FRAG_TOOL_TAG)
                        .setCustomAnimations(R.anim.tool_frag_in, R.anim.tool_frag_out)
                        .commit();

そしてここに私がそれを削除する方法があります:

Fragment prevTool = getFragmentManager().findFragmentByTag(FRAG_TOOL_TAG);
        if(prevTool != null){
            getFragmentManager().beginTransaction().remove(prevTool).commit();
        }else {
            intentCANCELED();
        }

最初に設立された here

0
murt

getFragmentManager()getSupportFragmentManager()に置き換えるだけです。シンプルなソリューション。それは私のために働いています。あなたはあなたの活動でそれを行う必要があります

0
Mafujul