6

私の Android アプリケーションには、特定の を占めるActionBarが変更されています。タブが変更されたときにフラグメントの状態を保存して、で回復できるようにしようとしています。FragmentFrameLayoutonSaveInstanceStateonCreateView

問題は、onSaveInstanceState決して呼び出されないことです。とメソッドが呼び出されますが、Fragment指定された toは null のままです。onDestroyViewonCreateViewBundleonCreateView

onSaveInstanceStateが実際に呼び出されたとき、タブを切り替えたときに確実に呼び出されるようにする方法、またはFragment切り離されて再接続されたときに状態を保存および復元するためのベストプラクティスを誰かに説明してもらえますか?

断片:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.event_log, container, false);

    // Retrieve saved state
    if (savedInstanceState != null){
        System.out.println("log retrieved");
    } else {
        System.out.println("log null");
    }

    return view;
}

@Override
public void onSaveInstanceState(Bundle outState) {
    System.out.println("log saved");
    super.onSaveInstanceState(outState);
    // more code
}

アクティビティ:

/**
 * Detach the current Fragment, because another one is being attached.
 */
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    if (tab.getText().equals(getString(R.string.tab_events))){
        if (frEventLog != null) {
            ft.detach(frEventLog);
    }
}
4

1 に答える 1

8

Fragment#onSaveInstanceStateActivityホスティングFragmentが破棄され、かつ同じアクティビティに戻る可能性があり、フラグメントがまだ に追加されている場合にのみ呼び出されますFragmentManager。最も一般的なケースは、画面の回転です。

たとえば、あなたFragmentも行う必要があると思います。ただし、その点については正確にはわかりません。setRetainInstance(true)onCreate

たとえば、ホームボタンを押したときにこのメソッドが呼び出されることも確認できます。これによりアクティビティが破棄されますが、たとえばタスク リストを使用してアクティビティに戻ることができます。

フラグメントだけの場合detach()は、元に戻すために必要なことは、に依頼するFragmentManagerことだけです。

あなたが見なければならない2つの例があります:

ActionBarFragmentTabsTabHostFragmentTabs

TabHost例では

ft.add(containerId, fragment, tag);
// later
fragment = mActivity.getSupportFragmentManager().findFragmentByTag(tag);

Fragment以前に追加されたのインスタンスを見つけるにはremove()Fragment


onCreateView/についてonDestroyView: フラグメントがデタッチされると呼び出されます。これは、次にアタッチするときに新しいView. はまだ にアタッチされているため、フラグメントのFragment#onDetached()場合は呼び出されません。ビュー階層から切り離されるだけです。detach()Activity


フラグメントの状態を保持する方法/フラグメントを使用して状態を保持する方法に関する別の良い例が Android Training - Caching Bitmapsにあります。

ただし、その例には重要な行がありません。

public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) {
    RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG);
    if (fragment == null) {
        fragment = new RetainFragment();
        fm.beginTransaction().add(fragment, TAG).commit(); // << add this
    }
    return fragment;
}
于 2012-08-27T18:05:26.310 に答える