これについて間違っている場合は修正してください。どこにも明示的に書かれているのを見たことがないので、これは一種の明確な質問です。
Android 4 では、 を呼び出しsetRetainInstance(true)
て、Fragment
構成の変更 (基本的にはデバイスのローテーションを意味します) でFragment
Java オブジェクトが破棄されず、その新しいインスタンスが作成されないようにすることができます。つまり、インスタンスは保持されます。
これは、すべてのデータを処理してバンドルする必要がないため、Android 1-3 よりもはるかに正気で腹立たしいことではなく、新しい(または) インスタンスに渡して再度バンドルを解除するだけで済みます。それは基本的にあなたが期待することであり、おそらく最初から s がどのように機能するべきだったかです。onRetainNonConfiguration
State
Instance()
Fragment
Activity
Activity
ご想像のとおり、回転時setRetainInstance(true)
にビューも再作成 (onCreateView()
が呼び出されます) されます。そして、リソース解決(layout
vs layout-land
)が機能すると(テストされていませんが)想定しています。
だから私の質問は2つあります:
- なんで
Activities
最初からこうじゃなかったんだろう。 - これがデフォルトではないのはなぜですか?ローテーションで無意味に破壊されて再作成されることを実際に望んでいる理由はありますか?
Fragment
何も思いつかないから。
編集
私がそれを行う方法を明確にするために:
class MyFragment extends Fragment
{
// All the data.
String mDataToDisplay;
// etc.
// All the views.
TextView mViewToDisplayItIn;
// etc.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRetainInstance(true);
mDataToDisplay = readFromSomeFileOrWhatever(); // Ignoring threading issues for now.
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.my_fragment, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
// At this point if mViewToDisplayItIn was not null, the old one will be GC'd.
mViewToDisplayItIn = view.findViewById(R.id.the_text_view);
mViewToDisplayItIn.setText(mDataToDisplay);
}
// Optionally:
@Override
public void onDestroyView()
{
// All the view (and activity) to be GC'd.
mViewToDisplayItIn = null;
}
}