在info.targetView上获取null异常

时间:2015-06-11 22:55:59

标签: java android

我目前正在尝试创建一个上下文菜单。我希望我的上下文菜单能够捕获产生菜单的View中的文本。这是我正在使用的代码:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    AdapterView.AdapterContextMenuInfo info =
            (AdapterView.AdapterContextMenuInfo) menuInfo;
    selectedOption = ((TextView) info.targetView).getText().toString();
    menu.setHeaderTitle(selectedOption);
}

执行应用时,我收到以下错误:

Caused by: java.lang.NullPointerException: Attempt to read from field 'android.view.View android.widget.AdapterView$AdapterContextMenuInfo.targetView' on a null object reference
        at com.conversions.rolando.conversions.MainActivity.onCreateContextMenu(MainActivity.java:172)

...指向:selectedOption = ((TextView) info.targetView).getText().toString();

因此错误基本上意味着“info”为空,因为“menuInfo”也为空?我试图通过阅读What is a NullPointerException, and how do I fix it?来理解为什么,但似乎无法找到解决方案,或者理解问题。

这就是我打电话registerForContextMenu()的方式:

public void onButtonClickEvent(View sender)
    {
        registerForContextMenu(sender);
        openContextMenu(sender);
        unregisterForContextMenu(sender);
    }

我的main.xml

中的TextView正在调用此方法

谢谢!

2 个答案:

答案 0 :(得分:0)

您似乎理解了这个问题:infonull,因为menuInfonull。而你正试图取消引用info。也就是说,访问null对象上的字段。由于该对象不存在(即。null),因此该字段不能存在且不得使用。 Java运行时已检测到此null的取消引用,并抛出相关的异常,NullPointerException

要避免此错误,您应该在尝试访问其字段之前检查info是否为null,例如:

if (info != null) {
    selectedOption = ((TextView) info.targetView).getText().toString();
    menu.setHeaderTitle(selectedOption);
}

答案 1 :(得分:0)

论证menuInfo总是被android传递为null,而这可能是因为你应该调用某个registerForContextMenu()方法解释here