屏幕方向后无法访问 Fragment 的 public 个字段
Unable to access public fields of Fragment after screen orientation
我有一个片段被加载到 ViewPager
:
public class mFragment extends Fragment {
public ArrayList<String> mArrayList;
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putStringArrayList("KEY", mArrayList);
super.onSaveInstanceState(outState);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
mArrayList = savedInstanceState.getStringArrayList("KEY");
} else {
mArrayList = new ArrayList<>();
}
...
}
}
以及我的 activity class 的 onCreate()
方法内部:
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mFragment currentFragment = (mFragment) mFragmentPagerAdapter.getItem(mViewPager.getCurrentItem());
currentFragment.mArrayList.clear();
}
});
我可以通过单击 mButton
清除 ArrayList
,但是在更改屏幕方向后我收到以下错误:
06-14 17:35:08.274 1995-1995/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: a.wallpaper, PID: 1995
java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.ArrayList.clear()' on a null object reference
at a.wallpaper.MainActivity.onClick(MainActivity.java:123)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
基于 this answer,在 mFragmentPagerAdapter
class 中覆盖 instantiateItem()
方法后,错误消失了:
@Override
public Object instantiateItem(ViewGroup container, int position) {
GalleryFragment fragment = (GalleryFragment) super.instantiateItem(container, position);
fragments[position] = fragment;
return fragment;
}
我有一个片段被加载到 ViewPager
:
public class mFragment extends Fragment {
public ArrayList<String> mArrayList;
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putStringArrayList("KEY", mArrayList);
super.onSaveInstanceState(outState);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
mArrayList = savedInstanceState.getStringArrayList("KEY");
} else {
mArrayList = new ArrayList<>();
}
...
}
}
以及我的 activity class 的 onCreate()
方法内部:
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mFragment currentFragment = (mFragment) mFragmentPagerAdapter.getItem(mViewPager.getCurrentItem());
currentFragment.mArrayList.clear();
}
});
我可以通过单击 mButton
清除 ArrayList
,但是在更改屏幕方向后我收到以下错误:
06-14 17:35:08.274 1995-1995/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: a.wallpaper, PID: 1995
java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.ArrayList.clear()' on a null object reference
at a.wallpaper.MainActivity.onClick(MainActivity.java:123)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
基于 this answer,在 mFragmentPagerAdapter
class 中覆盖 instantiateItem()
方法后,错误消失了:
@Override
public Object instantiateItem(ViewGroup container, int position) {
GalleryFragment fragment = (GalleryFragment) super.instantiateItem(container, position);
fragments[position] = fragment;
return fragment;
}