私は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を表示しています。
前もって感謝します。
私の場合、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();
}
}
_
同様の問題があります。おかげで この答え 私はフラグメントの代わりに私のアクティビティで以下のコードを作成し、この解決策はうまくいきます:
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();
}
});
これを試して:
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);
フラグメントを置き換える場合は、バックスタックにないことを確認してください:)
問題は、フラグメントを追加および削除する方法にあります。
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
googleはgetFragmentManager()
を廃止したので、常にgetSupportFragmentManager()
を使用してください
ここをチェック 詳細については。
私の例では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 。
getFragmentManager()
をgetSupportFragmentManager()
に置き換えるだけです。シンプルなソリューション。それは私のために働いています。あなたはあなたの活動でそれを行う必要があります