小编Adr*_*nzi的帖子

更新片段以响应Android Navigation Drawer交互

我正在处理的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)

android android-fragments navigation-drawer

7
推荐指数
1
解决办法
979
查看次数