web-dev-qa-db-ja.com

バックスタックから復元されたフラグメントを判断する方法

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

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

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

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

Fragmentがバックスタックから復元されたかどうかを確認する方法 を見ましたが、これにより回答が得られることを期待して詳細を追加したいと思います。

編集:ちょうど気づいた http://developer.Android.com/reference/Android/app/Fragment.html#onSaveInstanceState(Android.os.Bundle) 言う

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

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

53
dvd

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

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

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

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

38
ATom
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を使用します。

32
Yashwanth Kumar

フラグメントがバックスタックに移動すると、onDestroyView()が呼び出されます。 onDestroy()ではありません。

そして、フラグメントがバックスタックからポップするとonCreateView()が呼び出されます。 onCreate()ではありません。

したがって、boolean mIsRestoredFromBackstack次のように断片化して従います。

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    mIsRestoredFromBackstack = false;
}

@Override
public void onResume()
{
    super.onResume();
    if(mIsRestoredFromBackstack)
    {
        // The fragment restored from backstack, do some work here!
    }
}

@Override
public void onDestroyView()
{
    super.onDestroyView();
    mIsRestoredFromBackstack = true;
}
20
David

メジャー編集: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();
    }
}
8
Giorgos Kylafas

フラグメントをバックスタックに追加し、何らかの操作の後、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
    }
}
4
Inc

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

0
AlexKorovyansky