Fragment インスタンスがバック スタックに追加されたときに破棄されないことはよく知られています (参照: Fragment の作成)。
私のフラグメントには複雑なビューがありました。私の意図は、より迅速にレンダリングするために、フラグメントがバックスタックからレイアウトに戻ったときにビューが再作成されないようにすることでした。
Fragment 拡張機能のクラスには、次のようなコードがありました。
View firstView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (firstView == null) {
firstView = inflater.inflate(R.layout.first_view, container, false);
Button btn_read = (Button)firstView.findViewById(R.id.btn_read);
btn_read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do something
}
});
}
return firstView;
}
そして、私の Fragment がバックスタックに追加されました。
ただし、「戻る」を押してバックスタックをポップアップすると、次の例外が発生しました。明らかに、以前に onCreateView で作成されたビューはまだどこかにアタッチされており、新しい親に再利用できませんでした。
フラグメントを使用する「一般的なパターン」に従わないのは賢明ではないことを理解しています。Fragmentのパフォーマンスを向上させるために、BIGビューが再作成されないようにする方法に興味があります。
- - - - - - - 例外 - - - - - - - -
03-25 23:55:38.354: W/dalvikvm(314): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
03-25 23:55:38.354: E/AndroidRuntime(314): Uncaught handler: thread main exiting due to uncaught exception
03-25 23:55:38.445: E/AndroidRuntime(314): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.ViewGroup.addViewInner(ViewGroup.java:1861)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.ViewGroup.addView(ViewGroup.java:1756)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.ViewGroup.addView(ViewGroup.java:1713)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.ViewGroup.addView(ViewGroup.java:1693)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:874)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:697)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1465)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:447)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:164)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.app.Activity.onKeyUp(Activity.java:1863)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.KeyEvent.dispatch(KeyEvent.java:1061)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.app.Activity.dispatchKeyEvent(Activity.java:2043)
03-25 23:55:38.445: E/AndroidRuntime(314): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1631)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2368)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2338)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.view.ViewRoot.handleMessage(ViewRoot.java:1641)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.os.Handler.dispatchMessage(Handler.java:99)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.os.Looper.loop(Looper.java:123)
03-25 23:55:38.445: E/AndroidRuntime(314): at android.app.ActivityThread.main(ActivityThread.java:4363)
03-25 23:55:38.445: E/AndroidRuntime(314): at java.lang.reflect.Method.invokeNative(Native Method)
03-25 23:55:38.445: E/AndroidRuntime(314): at java.lang.reflect.Method.invoke(Method.java:521)
03-25 23:55:38.445: E/AndroidRuntime(314): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-25 23:55:38.445: E/AndroidRuntime(314): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-25 23:55:38.445: E/AndroidRuntime(314): at dalvik.system.NativeStart.main(Native Method)
03-25 23:55:38.445: I/Process(52): Sending signal. PID: 314 SIG: 3