2

メイン アクティビティに 2 つのフラグメントがあります (1 番目のフラグメント、2 番目のフラグメント)。onCreateメイン アクティビティのメソッドで、最初のフラグメントをコンテナー ビューに置き換えます。

2 番目のフラグメントには があり、ListViewその項目をクリックすると、新しいアクティビティが詳細として開始されます。

しかし、メインのアクティビティに戻ると、It is in onCreate イベントのために最初のフラグメントが表示されます。

バックスタックに最後のフラグメントがあり、それを表示するかのようにバックスタックを使用しようとしました。しかし、onCreate メソッドでは、バック スタックは常に null でした。

これが私のonCreateおよびreplaceFragmentsメソッドコードです:

@Override
protected void onCreate(Bundle savedInstanceState) {

    Log.d("activity", "on create called");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();

    int backStackCount = fm.getBackStackEntryCount();
    if (backStackCount > 0){
        for (int entry = 0; entry < fm.getBackStackEntryCount(); entry++) {
            Log.i("back stack", "Found fragment: " + fm.getBackStackEntryAt(entry).getName());
        }
    } else {
        Log.i("back stack", "backstack count is null");
        MainFragment mainFragment = new MainFragment();
        replaceFragments(mainFragment);
    }

    mActionBarMainBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // setButtonsState(mActionMainBtnLineView);

            if(mMainFragment == null){
                mMainFragment = new MainFragment();
            }

            replaceFragments(mMainFragment);
        }
    });

    mActionBarTransBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // setButtonsState(mActionTransactionsBtnLineView);

            if(mTransactionsFragment == null){
                mTransactionsFragment = new TransactionsFragment();
            }

            replaceFragments(mTransactionsFragment);
        }
    });
}

public void replaceFragments(Fragment fragment){
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    String fragmentName = fragment.getClass().getName();

    fragmentManager.beginTransaction()
            .replace(R.id.container, fragment, fragmentName)
            .addToBackStack(fragmentName)

    .commit();

    fragmentManager.executePendingTransactions();

    if (fragmentName.equals(MainFragment.class.getName())) {
        setButtonsState(mActionMainBtnLineView);
    } else {
        setButtonsState(mActionTransactionsBtnLineView);
    }
}

onCreate別のアクティビティから来たときにメソッドでスタック値を取得する方法は?

マイスクリーン スクリーン

4

2 に答える 2

1

アクティビティを再開するときにフラグメント スタックを保持するために、それほど多くのことを行う必要はありません。フラグメントのスタックは、最初のアクティビティの に保存されSavedInstanceState Bundleます。あなたがする必要があるのは、ユーザーが戻るボタンをタップしたときに、アクティビティsavedInstanceStateが Null かどうかを確認する必要があるということです。onCreateNull の場合、Activity は初めて作成されます。そうでない場合は、何もしないでください。以下のコードをチェックして、実装方法を確認してください。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout. activity_main);

    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();

    if (savedInstanceState == null) {
         MainFragment mainFragment = new MainFragment();
         replaceFragments(mainFragment);
    }
}
于 2015-05-20T22:06:06.990 に答える
1

この問題の解決策を見つけました。

アクション バーの [戻る] ボタンを押すと、返されたアクティビティの onCreate メソッドが呼び出され、フラグメントを処理するために bundle が null になります。

これを防ぐために 、マニフェスト ファイルの親アクティビティにandroid:launchMode="singleTop"を追加しました。

マニフェストの使用例

<activity
        android:name=".MainActivity"
        android:launchMode="singleTop" //Here is what I did.
        android:label="@string/app_name"
        android:theme="@style/MyWalletTheme"
        android:uiOptions="splitActionBarWhenNarrow" >
        <meta-data
            android:name="android.support.UI_OPTIONS"
            android:value="splitActionBarWhenNarrow" />

        <intent-filter>
            <action android:name="android.intent.action.MAINACTIVITY" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
于 2015-05-21T19:54:07.623 に答える