Android 构建apk后的错误

Android 构建apk后的错误,android,android-actionbar-compat,android-toolbar,Android,Android Actionbar Compat,Android Toolbar,生成签名apk后,操作栏视图(共享操作提供程序和searchview)崩溃。当我从android studio调试应用程序时,它正在工作,但当我生成已签名的apk并将应用程序安装到设备时,会出现如下错误: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setQueryHint(java.lang.CharSequence)' o

生成签名apk后,操作栏视图(共享操作提供程序和searchview)崩溃。当我从android studio调试应用程序时,它正在工作,但当我生成已签名的apk并将应用程序安装到设备时,会出现如下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setQueryHint(java.lang.CharSequence)' on a null object reference
            at tm.veriloft.ertir.ui.SearchActivity.onCreateOptionsMenu(Unknown Source)
            at android.app.Activity.onCreatePanelMenu(Activity.java:2820)
            at android.support.v4.app.o.onCreatePanelMenu(Unknown Source)
            at android.support.v7.app.e.a(Unknown Source)
            at android.support.v7.app.g.a(Unknown Source)
            at android.support.v7.widget.as.a(Unknown Source)
            at android.support.v7.internal.a.a.j(Unknown Source)
            at android.support.v7.internal.a.b.run(Unknown Source)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我正在使用最新版本的支持库和工具栏。(通过设置
设置支持操作栏(mToolbar)

SearchView xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ertir="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:title="@string/title_activity_search"
        ertir:showAsAction="always"
        ertir:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

我怎样才能解决这个问题?如上所述,我只有在签署apk后才会出错

发生这种情况是因为您没有正确配置
程序。在您的
build.gradle
中,在
buildTypes
下,将
runProguard true
更改为
runProguard false
,并生成单个APK和测试。如果工作正常,请尝试学习适当地配置progaurd:)

在proguard-rules.pro中,添加以下行以排除SearchView类: “-保留类android.support.v7.widget.*{*;}”,然后创建构建。我是这样解决的。

这对我很有效

将以下行添加到位于app文件夹内的proguard-rules.pro文件中:


-保持类android.support.v7.widget.SearchView{*}

的可能重复,找出
null
并确保它不是。@323go我知道
(SearchView)searchItem.getActionView()返回空值。但我不知道为什么我在生成apk后会出现此错误。不是在调试时,这不是该问题的重复。您是否正在导出支持库?Progord可能会删除它认为未使用的代码,但您的应用程序可能实际需要它。在这种情况下,您必须识别该类并将其添加到prograurd配置中,如
-keep public class
阅读更多关于更好地使用的信息-keep class android.support.v7.widget.SearchView{*}而不是禁用proguard谢谢你,伙计,你救了我一天,由于这个错误,我打算放弃proguard:)这是一个比禁用proguard更好的答案。非常感谢你!谢谢,非常有帮助。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ertir="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:title="@string/title_activity_search"
        ertir:showAsAction="always"
        ertir:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.search, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        mSearchView = (SearchView) searchItem.getActionView();
        mSearchView.setQueryHint(getString(R.string.search_hint));
        mSearchView.setFocusable(true);
        mSearchView.setIconified(false);
        mSearchView.requestFocusFromTouch();
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                mSearchView.clearFocus(); //Hide keyboard
                search(query, searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType());
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                if (searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType().equals("blogs"))
                    searchAfter(1100, query, searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType());
                else
                    search(query, searchTypeArray.get(searchTypeSpinner.getSelectedItemPosition()).getType());
                return false;
            }
        });
        return true;
    }