ListPopupWindow:getWindowVisibleDisplayFrame(Rect)空指针异常

6
当我在我的工具栏中点击一个项目时,我希望展开一个列表弹出窗口,但它不起作用。
在onOptionsItemSelected(MenuItem item)方法内部。
ListPopupWindow popup = new ListPopupWindow(getBaseContext());
popup.setAdapter(new ArrayAdapter<>(getBaseContext(), R.layout.dialog_checkview, R.id.checkview_title, stringList));
popup.setAnchorView(item.getActionView());
popup.setModal(true);
popup.show();

// ...

Exception

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getWindowVisibleDisplayFrame(android.graphics.Rect)' on a null object reference
        at android.widget.PopupWindow.getMaxAvailableHeight(PopupWindow.java:1368)
        at android.widget.PopupWindow.getMaxAvailableHeight(PopupWindow.java:1346)
        at android.support.v7.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1174)
        at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:584)
        at com.mysecretpackage.android.activities.MainActivity.onOptionsItemSelected(MainActivity.java:271)
        at android.app.Activity.onMenuItemSelected(Activity.java:2895)
        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:353)
        at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:144)
        at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:99)
        at android.support.v7.internal.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:99)
        at android.support.v7.internal.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:72)
        at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:164)
        at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:740)
        at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
        at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
        at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948)
        at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:598)
        at android.support.v7.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139)
        at android.view.View.performClick(View.java:4785)
        at android.view.View$PerformClick.run(View.java:19884)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
3个回答

15

问题在于您的锚点视图无效。 我曾经也遇到过同样的问题,并使用以下解决方案进行修复:

popup.setAnchorView(getActivity().findViewById(R.id.idOfYourMenuItem));

1
当您使用菜单项调用setAnchorView时,还要确保菜单已被填充。 - Papa Smurf

5

当使用显示下拉列表的AutoCompleteTextView并且AutoCompleteTextView包含android:dropDownAnchor引用的外部资源ID时,会出现此问题。

由于某种原因,只有在使用buildToolsVersion '26.0.2'时才会发生。以下是一个示例:

res/layout/my_layout.xml:

<AutoCompleteTextView
    android:id="@+id/text_field"
    android:dropDownAnchor="@id/external_id"
    ...
/>

res/values/dimens.xml:

<resources>
    <!-- https://developer.android.com/guide/topics/resources/more-resources.html#Id -->
    <item type="id" name="external_id">@+id/text_field</item>
</resources>

在Android 6/7上,当尝试显示下拉列表时,会发生这样的崩溃:
java.lang.NullPointerException: Attempt to invoke virtual method
  'void android.view.View.getWindowVisibleDisplayFrame(android.graphics.Rect)'
  on a null object reference

在安卓8系统上,它会出现如下崩溃情况:
java.lang.NullPointerException: Attempt to invoke virtual method 
  'android.os.IBinder android.view.View.getApplicationWindowToken()'
  on a null object reference

为避免崩溃,您应该将外部ID转换为常规内部ID,或使用Java代码:textField.setDropDownAnchor(...);
旧版本的构建工具没有这个问题。

0

是的,问题是因为传递给 setAnchorView 的视图无效。

要轻松解决此问题,请将点击事件处理程序中的视图传递给 setAnchorView

例如

public void handlerName(View view) {
        ListPopupWindow popup = new ListPopupWindow(getBaseContext());
        popup.setAdapter(new ArrayAdapter<>(getBaseContext(), R.layout.dialog_checkview, 
        R.id.checkview_title, stringList));
        popup.setAnchorView(view);
        popup.setModal(true);
        popup.show();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接