我正在处理的Android应用程序只有一个MainActivity,应用程序的每个屏幕都实现为Fragment.每个片段在MainActivity中实例化为私有类变量:
public class MainActivity extends Activity implements MainStateListener {
private FragmentManager fm = getFragmentManager();
private BrowseFragment browseFragment = BrowseFragment.newInstance();
...
Run Code Online (Sandbox Code Playgroud)
有一个"片段帧"可以加载每个屏幕片段.在应用程序中切换屏幕时,会调用此代码来加载片段:
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.frag_frame, incoming);
ft.addToBackStack(null);
ft.commit();
fm.executePendingTransactions();
Run Code Online (Sandbox Code Playgroud)
每个屏幕片段都有一个监听器,使片段能够调用MainActivity中的各种方法:
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mainStateListener = (MainStateListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement MainStateListener");
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是从MainActivity中退出的导航抽屉更新片段的一个方面.导航抽屉必须更新片段,并使用此代码执行此操作:
navigationDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
browseFragment.doSomethingOnBrowserFragment();
}
});
Run Code Online (Sandbox Code Playgroud)
在您更改方向之前,情况正常.然后当前屏幕片段加载正常(browseFragment).但是当你单击导航抽屉导致doSomethingOnBrowserFragment()方法执行时,由于mainStateListener对象本身(在browseFragment中附加)为null,我得到一个空指针异常.根据我对Fragment生命周期的了解,这个变量不应该为null,因为onAttach()方法首先执行任何操作并设置mainStateListener变量.此外,如果我在该browserFragment上有一个使用mainStateListener对象的按钮(在方向更改后),单击该按钮永远不会出现此空指针问题.
堆栈跟踪:
08-04 …Run Code Online (Sandbox Code Playgroud)