63

この問題をしばらく探していましたが、今は役に立ちません:

フラグメントがバックスタックから復元されていることを確認する方法は? FragmentActivity 内で互換性ライブラリと ListFragment を使用しています。ListFragment 内の項目が選択されると、新しい Fragment が開始され、ListFragment が置き換えられます。

FragmentActivity が一時停止すると、Fragment の onSaveInstanceState が呼び出されることに気付きました。しかし、フラグメントが FragmentTransaction を介してバック スタックに置かれると、onSaveInstanceState は呼び出されず、ライフサイクル メソッド onCreateView および onActivityCreated が null savedInstanceState Bundle で呼び出されます。

フラグメントが作成または復元されたときにデータをロードしたいので、これを求めていますが、ユーザーが戻ってきたときはロードしません。バックスタック。

フラグメントがバックスタックから復元されたかどうかを確認する方法を見てきましたか? しかし、これが答えを誘発することを期待して、さらに詳細を追加したいと思います.

編集: http://developer.android.com/reference/android/app/Fragment.html#onSaveInstanceState(android.os.Bundle) が言うことに気づきました

ただし、このメソッドは onDestroy() の前にいつでも呼び出すことができます。フラグメントがほとんど破棄される状況 (UI が表示されていない状態でバック スタックに配置された場合など) は多数ありますが、所有するアクティビティが実際にその状態を保存する必要があるまで、その状態は保存されません。

したがって、 onSaveInstanceState は間違いなく問題外です...

4

6 に答える 6

44

最も簡単な方法は、たとえば onViewCreated() メソッドでこれを行うことだと思います:

if (savedInstanceState == null && !mAlreadyLoaded) {
    mAlreadyLoaded = true;

    // Do this code only first time, not after rotation or reuse fragment from backstack
}

Android がフラグメントをバックスタックに配置すると、そのビューのみが破棄され、インスタンス自体は強制終了されないため、フラグメントがバックスタックから復元されるときに mAlreadyLoaded が true のままになるためです。

于 2012-07-22T19:26:25.880 に答える
32
getSupportFragmentManager().addOnBackStackChangedListener(new OnBackStackChangedListener() {    
            public void onBackStackChanged() {
                Log.i(TAG, "back stack changed ");
                int backCount = getSupportFragmentManager().getBackStackEntryCount();
                if (backCount == 0){
                                   // block where back has been pressed. since backstack is zero.
                }
            }
        });

このaddOnBackStackChangedListenerを使用します。

于 2011-10-27T17:18:13.807 に答える
8

主要な編集: 2013 年 10 月 15 日

前の説明 (参照用に以下に保持) は、アプリケーションがバックグラウンドに置かれ、フォアグラウンドに戻されると失敗します。

代わりに、バックスタックの現在のサイズを、フラグメントが作成されてバックスタックに置かれたときのサイズと比較することをお勧めします。


http://developer.android.com/guide/components/fragments.html#Creatingの図 2 をよく見てください。

この図から分かることは、フラグメントがバックスタックから復元されるとき、その onCreate() は呼び出されず、その onCreateView() は呼び出されるということです。


したがって、次のようなことをしたいかもしれません:

public class MyFragment extends Fragment {
    int mBackStackSize = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBackStackSize = getFragmentManager().getBackStackEntryCount();
    }

    public boolean isRestoredFromBackstack() {
        return mBackStackSize > getFragmentManager().getBackStackEntryCount();
    }
}
于 2013-03-24T12:11:44.290 に答える
4

フラグメントをバックスタックに追加し、何らかの操作を行った後、fragmentTransaction.hide(fragment) を使用して非表示にし、fragmentTransaction.show(fragmentManager.findFragmentByTag(fragment.getName())); のようにバックスタックから復元した場合。onHiddenChanged(boolean hidden) をオーバーライドできます

@Override
public void onHiddenChanged(boolean hidden) {
    // TODO Auto-generated method stub
    super.onHiddenChanged(hidden);
    if (!hidden) {
        //fragment became visible
        //your code here
    }
}
于 2013-09-25T14:34:51.713 に答える
0

場合によっては、isVisibleメソッドを使用して、フラグメントが最初に表示されるのか、バックスタックから復元されるのかを理解できます。

于 2012-08-16T10:35:14.533 に答える