void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView $ OnQueryTextListener)

时间:2017-07-24 10:02:31

标签: android nullpointerexception searchview

我正在CustomAdapter上执行SearchView,它将搜索Gate Name。我尝试运行应用程序后,它突然崩溃,并给我如上所述的错误。我不知道哪个部分甚至做错了导致每次我试图运行我的应用程序时出现此问题。

MainActivity.java

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.main_menu, menu);

    MenuItem searchItem = menu.findItem(R.id.item_search);
    SearchView searchView = (SearchView) searchItem.getActionView();

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            List<Gate> gateSearchList = new ArrayList<Gate>();

            for (Gate gate : gateList) {
                if (gate.getGateName().toLowerCase().contains(newText.toLowerCase())) {
                    gateSearchList.add(gate);
                }
            }

            adapter = new GateAdapter(MainActivity.this, gateSearchList);
            lv.setAdapter(adapter);
            return true;
        }
    });

    return super.onCreateOptionsMenu(menu);
}
 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_logout) {
        logout();
    }
    return super.onOptionsItemSelected(item);
}

main_menu.xml

 <item
    android:id="@+id/item_search"
    android:icon="@drawable/ic_action_search"
    android:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="ifRoom|collapseActionView"
    android:title="Search">

</item>
<item android:id="@+id/action_logout"
    android:title="Log Out"
    app:showAsAction="never"/>

这是logcat中的错误消息:

  

java.lang.NullPointerException:尝试调用虚方法'void   android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView $ OnQueryTextListener)”   在空对象引用上

它还表明错误也来自这行代码:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

我希望有人能够为我提供解决问题的解决方案。

6 个答案:

答案 0 :(得分:3)

将您的android:actionViewClass更改为app:actionViewClass,因为您使用的是来自支持lib的SearchView

<item
    android:id="@+id/item_search"
    android:icon="@drawable/ic_action_search"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="ifRoom|collapseActionView"
    android:title="Search">

答案 1 :(得分:3)

在此处将其发布给可能会遇到类似问题的其他人。

按照Jasmin John的观点,我通过添加保卫规则解决了这个问题

-keep class android.support.v7.widget.SearchView { *; }

答案 2 :(得分:2)

当我调试它时,我遇到了同样的问题,我的代码工作正常,但是当我构建一个apk并运行它崩溃时。

我在build.gradle文件中使用了 minifyEnabled false 并且它正常工作

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

答案 3 :(得分:1)

res/values/xml/searchable.xml中创建一个文件

<?xml version="1.0" encoding="utf-8"?>
 <searchable xmlns:android="http://schemas.android.com/apk/res/android"
  android:hint="search hint"
  android:label="@string/app_name" />

并在此应用标记文件的清单中添加此元数据标记

        <meta-data android:name="android.app.searchable"
        android:resource="@xml/searchable" />

像这样更改你的oncreate菜单

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

    final MenuItem item = menu.findItem(R.id.R.id.item_search);
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);

    return true;

}

答案 4 :(得分:0)

我的Menu.xml文件中有问题,所以我做了以下更改:

app:actionViewClass="android.support.v7.widget.SearchView"

在这里:

app:actionViewClass="androidx.appcompat.widget.SearchView" />

答案 5 :(得分:0)

不要忘记在您的(菜单-> yourfilename.xml)中添加它

app:actionViewClass="androidx.appcompat.widget.SearchView"

请确保您在searchview文件中也使用了相同的.java类。