【问题标题】:Android overflow menu nullPointerException when clicking three dots点击三个点时Android溢出菜单nullPointerException
【发布时间】:2017-06-23 03:28:03
【问题描述】:

普通按钮可以正常工作,但是点击三点按钮会出现异常

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return true;
}

我的 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">


    <item
        android:icon="@drawable/refresh"
        android:id="@+id/action_main_refresh"
        app:showAsAction="always"
        android:title="@string/refresh" />

    <item
        android:id="@+id/action_main_search"
        android:title="@string/search"
        android:icon="@drawable/seach"
        app:showAsAction="always"/>

    <item
        android:id="@+id/action_main_top"
        android:title="@string/sort_top"
        app:showAsAction="never" />


</menu>

日志

06-22 23:12:49.481 1289-1289/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             java.lang.NullPointerException
                                                 at android.support.v7.view.menu.ListMenuItemView.setTitle(ListMenuItemView.java:127)
                                                 at android.support.v7.view.menu.ListMenuItemView.initialize(ListMenuItemView.java:113)
                                                 at android.support.v7.view.menu.MenuAdapter.getView(MenuAdapter.java:100)
                                                 at android.support.v7.view.menu.MenuPopup.measureIndividualMenuWidth(MenuPopup.java:160)
                                                 at android.support.v7.view.menu.StandardMenuPopup.tryShow(StandardMenuPopup.java:153)
                                                 at android.support.v7.view.menu.StandardMenuPopup.show(StandardMenuPopup.java:187)
                                                 at android.support.v7.view.menu.MenuPopupHelper.showPopup(MenuPopupHelper.java:290)
                                                 at android.support.v7.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:175)
                                                 at android.support.v7.widget.ActionMenuPresenter$OpenOverflowRunnable.run(ActionMenuPresenter.java:803)
                                                 at android.os.Handler.handleCallback(Handler.java:730)
                                                 at android.os.Handler.dispatchMessage(Handler.java:92)
                                                 at android.os.Looper.loop(Looper.java:137)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5103)
                                                 at java.lang.reflect.Method.invokeNative(Native Method)
                                                 at java.lang.reflect.Method.invoke(Method.java:525)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                                                 at dalvik.system.NativeStart.main(Native Method)

点击监听器

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    //Log.i(TAG, "sort URL: " + makeUrlCustom(item.getItemId()));
    switch(item.getItemId()){
        case R.id.action_main_refresh:
            if(!adapter.isEmpty()) adapter.clear();
            noData.setVisibility(View.GONE);
            get(url, null);
            return true;
        case R.id.action_main_search:
            AlertDialog.Builder alert = new AlertDialog.Builder(this);

            final EditText dialogText = new EditText(this);

            alert.setView(dialogText);
            alert.setTitle("Search subreddit");

            alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    url = dialogText.getText().toString();
                    if(!adapter.isEmpty()) adapter.clear();
                    noData.setVisibility(View.GONE);
                    Log.i(TAG, "url from searchText is: " + url);
                    if(url.equals("") || url == null){
                        Toast.makeText(MainActivity.this, "Please insert valid subreddit", Toast.LENGTH_SHORT).show();
                    }else{
                        get(url, null);
                    }
                }
            });

            // create alert dialog
            AlertDialog alertDialog = alert.create();
            // show it
            alertDialog.show();
            return true;
        case R.id.action_main_top:
            Log.i(TAG, "sort top");
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

单击菜单溢出会导致 npe(在本例中为 action_main_top)。
点击普通菜单(刷新和搜索)工作正常。

【问题讨论】:

  • 你如何处理点击?
  • 同时显示点击监听器
  • 我已经添加了监听代码。
  • 在 action_main_top 切换案例中返回 true。
  • 也在 android.support.v7.view.menu.ListMenuItemView.initialize(ListMenuItemView.java) 的 android.support.v7.view.menu.ListMenuItemView.setTitle(ListMenuItemView.java:127) :113)

标签: android android-studio menu


【解决方案1】:

在做了详尽的研究后,我在这里找到了这个答案:App Crashes on Clicking Options

该答案解决了我的问题,显然该问题仅适用于 Gradle 版本 2.3.3,您需要降级到 2.2.3 才能修复它。 (希望尽快修复这个bug升级)

这里贴上Alex Bouroff提供的解决方案

我找到的解决方案是将 Gradle 插件从 3.3 降级到 2.14.1

1) 替换顶层build.gradle中的插件版本:

dependencies {
    //REPLACED 2.3.3->2.2.3(MENU ISSUE)
    //classpath 'com.android.tools.build:gradle:2.3.3'
    classpath 'com.android.tools.build:gradle:2.2.3'
    ...
    }

如果你使用包装器 2) 删除 /gradle/wrapper/gradle-wrapper.jar

3) 替换/gradle/wrapper/gradle-wrapper.properties的内容

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

构建-> 清理项目-> 重建项目-> 访问右上角三点菜单时的崩溃已经消失。

【讨论】:

  • 在尝试清理和重建后为我工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多