NPE:尝试调用接口方法

NPE : Attempt to invoke interface method

我有一个片段并且我有以下代码:

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: Attempt to invoke interface method

在我 post 这个线程之前,我通过查看和尝试了现有问题中的解决方案来展示了一些努力。但是,至今没能解决。

在您的 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");

之前检查监听器是否为空

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

的实例

只要 MainActivity 正在实现接口,上面的方法也可以工作。

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

更多信息片段交流@http://developer.android.com/training/basics/fragments/communicating.html

由于您的侦听器为空,因此在 MainActivity 中对其进行初始化。

public class MainActivity extends AppCompatActivity implements NavDrawer{

    private NavDrawer listener;

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

        .....

        listener= new NavDrawer(this);

    }

}