web-dev-qa-db-ja.com

onCreateView()バンドルのフラグメント。それはどこから来たのですか?

私は通常の方法でアクティビティを開始しています:

_Intent startIntent = new Intent(this, DualPaneActivity.class);
startIntent.putExtras(((SearchPageFragment) currentFragment).getPageState());
startActivity(startIntent);
_

このアクティビティが読み込まれると、次のようにフラグメントがフレームに配置されます。

_FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();   
Fragment currentFragment = fragment;
currentFragment.setArguments(getIntent().getExtras());
transaction.replace(R.id.singlePane, currentFragment);  
transaction.commit();
_

簡単そうですね。

ただし、onCreateView()メソッド内で、3つの個別のバンドル(フラグメントのonCreate(Bundle savedInstanceState)に含まれているバンドルを含める場合は4つ)にアクセスできます。

_@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    // Fill state information
    Bundle bundle;
    if(savedInstanceState != null)  bundle = savedInstanceState; // 1       
    else if(getArguments() != null) bundle = getArguments();     // 2
    else                            bundle = getActivity().getIntent().getExtras(); // 3
    setPageState(bundle);   
}
_

上記の例では、試行錯誤の結果、必要なバンドルは2番目のバンドル、つまりgetArguments()から取得したバンドルであることがわかりました。

私の理解では、getActivity().getIntent().getExtras();の3番目のものは、実際には、アクティビティの格納を開始するために使用されるインテントからバンドルを呼び出しています。また、実験から、savedInstanceStateは常にnullのように見えることもわかっています。しかし、それはどこから来ているのでしょうかなぜはnullですか?

ドキュメント はこれを言います:

savedInstanceState null以外の場合、このフラグメントは、ここに示すように、以前に保存された状態から再構築されます。

それは私を助けません-それは私が先に進むのを止める以上に私を悩ませています。誰かがこの迷惑を手伝ってくれる?

25
Graeme

私の知る限り、onCreateViewonCreate()は両方ともonSaveInstanceState()からバンドルを渡されます。

したがって、onSaveInstanceState()をオーバーライドしてデータをバンドルに入れると、onCreateView()でデータを取得できるはずです。そのため、ドキュメントには、フラグメントが以前に保存された状態から再構築されたときにバンドルがnull以外になると記載されています。

12
theisenp