Android 不再调用 onDestroy 之后的 onCreateView 片段
Android Fragment onCreateView after onDestroy not called again
根据 Android 片段生命周期,我希望在 onDestroy
之后片段将被重新创建,或者至少 onCreateView
被再次调用。
我有一个 Activity A 开始另一个 Activity B 作为结果,Activity B 创建一个片段 F.
public class A extends FragmentActivity {
...
public void onButonClick() {
Intent intent = new Intent(this, B.class);
startActivityForResult(intent, REQUEST_B);
}
}
public class B extends FragmentActivity {
...
public void onCreate(Bundle savedInstanceState) {
...
this.currentFragment = Fragment.instantiate(this, name);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(this.view.getFragmentContainerId(), this.currentFragment, taskName);
transaction.commit();
}
}
public class F extends Fragment {
@override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.view = new MyView();
}
@override
public void onResume() {
this.view.doSomething();
}
@override
public void onDestroy() {
this.view = null;
}
}
第一次创建片段时一切正常,显示视图。离开应用程序(例如转到系统设置)会影响片段的 onDestroy
被调用而没有 onDestroyView
被调用 ,但是当我返回时我的应用程序 onCreateView
未再次调用 ,这会导致 NullpointerException,因为我仅在 onCreateView
中实例化视图。
在 onDestroyView
中重置视图我认为可以解决问题,但我想知道生命周期这里出了什么问题以及我是否做错了什么。
谢谢。
这是 logcat 输出。
03-11 11:22:47.565 6594-6594/com.xy.android.app I/ActivityA Perform button click.
03-11 11:22:47.595 6594-6594/com.xy.android.app V/ActivityA Pausing activity
03-11 11:22:47.605 6594-6594/com.xy.android.app D/ActivityB Creating activity
03-11 11:22:48.075 6594-6594/com.xy.android.app V/ActivityB Starting activity
03-11 11:22:48.105 6594-6594/com.xy.android.app I/ActivityB Resuming activity
03-11 11:22:48.476 6594-6594/com.xy.android.app I/ActivityB Starting task FragmentF.
03-11 11:22:48.536 6594-6594/com.xy.android.app I/FragmentF Attached to activity.
03-11 11:23:02.350 6594-6594/com.xy.android.app I/FragmentF Creating fragment
03-11 11:23:02.390 6594-6594/com.xy.android.app I/FragmentF Creating view for fragment
03-11 11:23:02.420 6594-6594/com.xy.android.app V/FragmentF View for fragment created
03-11 11:23:02.430 6594-6594/com.xy.android.app D/FragmentF Activity created.
03-11 11:23:02.441 6594-6594/com.xy.android.app V/FragmentF Starting fragment
03-11 11:23:02.741 6594-6594/com.xy.android.app V/ActivityA Saving activity instance state.
03-11 11:23:02.761 6594-6594/com.xy.android.app I/ActivityA Stopping activity
03-11 11:23:07.686 6594-6594/com.xy.android.app V/FragmentF Pausing fragment.
03-11 11:23:07.696 6594-6594/com.xy.android.app V/ActivityB Pausing activity
03-11 11:23:08.517 6594-6594/com.xy.android.app D/FragmentF Save instance state.
03-11 11:23:08.567 6594-6594/com.xy.android.app D/ActivityB Saving activity instance state.
03-11 11:23:08.597 6594-6594/com.xy.android.app I/FragmentF **Destroying fragment**
03-11 11:23:08.627 6594-6594/com.xy.android.app I/ActivityB Stopping activity
03-11 11:23:14.033 6594-6594/com.xy.android.app V/FragmentF Starting fragment
03-11 11:23:14.043 6594-6594/com.xy.android.app V/ActivityB Starting activity
03-11 11:23:14.063 6594-6594/com.xy.android.app I/ActivityB Resuming activity
03-11 11:23:14.063 6594-6594/com.xy.android.app I/FragmentF **Resuming fragment**
经过一段时间的调查后,我最终 "solved" 通过在 onCreateView
中创建视图并在 onDestroyView
中销毁它来解决问题,但不理解为什么系统没有按照描述调用回调在 sdk 文档中。
根据 Android 片段生命周期,我希望在 onDestroy
之后片段将被重新创建,或者至少 onCreateView
被再次调用。
我有一个 Activity A 开始另一个 Activity B 作为结果,Activity B 创建一个片段 F.
public class A extends FragmentActivity {
...
public void onButonClick() {
Intent intent = new Intent(this, B.class);
startActivityForResult(intent, REQUEST_B);
}
}
public class B extends FragmentActivity {
...
public void onCreate(Bundle savedInstanceState) {
...
this.currentFragment = Fragment.instantiate(this, name);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(this.view.getFragmentContainerId(), this.currentFragment, taskName);
transaction.commit();
}
}
public class F extends Fragment {
@override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
this.view = new MyView();
}
@override
public void onResume() {
this.view.doSomething();
}
@override
public void onDestroy() {
this.view = null;
}
}
第一次创建片段时一切正常,显示视图。离开应用程序(例如转到系统设置)会影响片段的 onDestroy
被调用而没有 onDestroyView
被调用 ,但是当我返回时我的应用程序 onCreateView
未再次调用 ,这会导致 NullpointerException,因为我仅在 onCreateView
中实例化视图。
在 onDestroyView
中重置视图我认为可以解决问题,但我想知道生命周期这里出了什么问题以及我是否做错了什么。
谢谢。
这是 logcat 输出。
03-11 11:22:47.565 6594-6594/com.xy.android.app I/ActivityA Perform button click.
03-11 11:22:47.595 6594-6594/com.xy.android.app V/ActivityA Pausing activity
03-11 11:22:47.605 6594-6594/com.xy.android.app D/ActivityB Creating activity
03-11 11:22:48.075 6594-6594/com.xy.android.app V/ActivityB Starting activity
03-11 11:22:48.105 6594-6594/com.xy.android.app I/ActivityB Resuming activity
03-11 11:22:48.476 6594-6594/com.xy.android.app I/ActivityB Starting task FragmentF.
03-11 11:22:48.536 6594-6594/com.xy.android.app I/FragmentF Attached to activity.
03-11 11:23:02.350 6594-6594/com.xy.android.app I/FragmentF Creating fragment
03-11 11:23:02.390 6594-6594/com.xy.android.app I/FragmentF Creating view for fragment
03-11 11:23:02.420 6594-6594/com.xy.android.app V/FragmentF View for fragment created
03-11 11:23:02.430 6594-6594/com.xy.android.app D/FragmentF Activity created.
03-11 11:23:02.441 6594-6594/com.xy.android.app V/FragmentF Starting fragment
03-11 11:23:02.741 6594-6594/com.xy.android.app V/ActivityA Saving activity instance state.
03-11 11:23:02.761 6594-6594/com.xy.android.app I/ActivityA Stopping activity
03-11 11:23:07.686 6594-6594/com.xy.android.app V/FragmentF Pausing fragment.
03-11 11:23:07.696 6594-6594/com.xy.android.app V/ActivityB Pausing activity
03-11 11:23:08.517 6594-6594/com.xy.android.app D/FragmentF Save instance state.
03-11 11:23:08.567 6594-6594/com.xy.android.app D/ActivityB Saving activity instance state.
03-11 11:23:08.597 6594-6594/com.xy.android.app I/FragmentF **Destroying fragment**
03-11 11:23:08.627 6594-6594/com.xy.android.app I/ActivityB Stopping activity
03-11 11:23:14.033 6594-6594/com.xy.android.app V/FragmentF Starting fragment
03-11 11:23:14.043 6594-6594/com.xy.android.app V/ActivityB Starting activity
03-11 11:23:14.063 6594-6594/com.xy.android.app I/ActivityB Resuming activity
03-11 11:23:14.063 6594-6594/com.xy.android.app I/FragmentF **Resuming fragment**
经过一段时间的调查后,我最终 "solved" 通过在 onCreateView
中创建视图并在 onDestroyView
中销毁它来解决问题,但不理解为什么系统没有按照描述调用回调在 sdk 文档中。