NPE:尝试调用接口方法

时间:2016-01-22 13:05:25

标签: android android-fragments navigation-drawer android-toolbar

我有一个片段&我有以下代码:

NavDrawer listener;
public interface NavDrawer {
     void showNavDrawer(String msg);
}

我为我的片段设置了导航图标。单击图标时,我只称为接口方法。

toolbar.setNavigationIcon(android.R.drawable.ic_menu_directions);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        listener.showNavDrawer("Show Drawer");
    }
});

MainActivity.class中,我实现了界面来打开导航抽屉。

@Override
public void showNavDrawer(String msg) {
    drawer.openDrawer(GravityCompat.START);
}

显示的错误是:

  

java.lang.NullPointerException:尝试调用接口方法

在发布此主题之前,我通过查看并在现有问题中尝试了解决方案来展示了一些努力。但是,到目前为止还无法解决。

2 个答案:

答案 0 :(得分:2)

覆盖你的framgent

中的onAttach
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    try {
        listener= (NavDrawer) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement NavDrawer");
    }
}

并且还在listener.showNavDrawer(“Show Drawer”)之前检查侦听器是否为null;

注意: onAttach(activity)已弃用,您将拥有一个上下文,您可以使用它。您可以检查上下文是否是活动的实例。

只要MainActivity正在实现接口,上述内容就会起作用。

http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity)

更多信息fragmet communication @ http://developer.android.com/training/basics/fragments/communicating.html

答案 1 :(得分:0)

由于您的侦听器为null,因此请在MainActivity中初始化它。

public class MainActivity extends AppCompatActivity implements NavDrawer{

    private NavDrawer listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        .....

        listener= new NavDrawer(this);

    }

}