void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView$OnQueryTextListener)
void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView$OnQueryTextListener)
我正在 CustomAdapter 上执行 SearchView,它将在其中搜索门名称。在我尝试 运行 应用程序后,它突然崩溃并给我如上所述的错误。我不知道我什至做错了哪一部分导致我每次尝试 运行 我的应用程序时都会出现此问题。
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: Attempt to invoke virtual method 'void
android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView$OnQueryTextListener)'
on a null object reference
也说明错误也是出自这行代码:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
我希望有人能够提供解决方案来解决我的问题。
像这样在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;
}
将您的 android:actionViewClass
更改为 app:actionViewClass
,因为您正在使用来自支持库
的 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">
我遇到了同样的问题,我的代码在调试时工作正常,但是当我构建 apk 时 运行 它崩溃了。
我在 build.gradle 文件中使用了 minifyEnabled false,它工作正常
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
为可能面临类似问题的其他人张贴此信息。
跟进 Jasmin John 的观点,我通过添加
解决了 pro-guard 规则的问题
-keep class android.support.v7.widget.SearchView { *; }
我的 Menu.xml 文件有问题,所以我更改了这个:
app:actionViewClass="android.support.v7.widget.SearchView"
在此:
app:actionViewClass="androidx.appcompat.widget.SearchView" />
别忘了在您的(菜单-> yourfilename.xml
)
中添加这个
app:actionViewClass="androidx.appcompat.widget.SearchView"
请确保您在 .java
文件中使用的 class 与 searchview
相同。
我正在 CustomAdapter 上执行 SearchView,它将在其中搜索门名称。在我尝试 运行 应用程序后,它突然崩溃并给我如上所述的错误。我不知道我什至做错了哪一部分导致我每次尝试 运行 我的应用程序时都会出现此问题。
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: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setOnQueryTextListener(android.support.v7.widget.SearchView$OnQueryTextListener)' on a null object reference
也说明错误也是出自这行代码:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
我希望有人能够提供解决方案来解决我的问题。
像这样在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;
}
将您的 android:actionViewClass
更改为 app:actionViewClass
,因为您正在使用来自支持库
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">
我遇到了同样的问题,我的代码在调试时工作正常,但是当我构建 apk 时 运行 它崩溃了。
我在 build.gradle 文件中使用了 minifyEnabled false,它工作正常
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
为可能面临类似问题的其他人张贴此信息。
跟进 Jasmin John 的观点,我通过添加
解决了 pro-guard 规则的问题-keep class android.support.v7.widget.SearchView { *; }
我的 Menu.xml 文件有问题,所以我更改了这个:
app:actionViewClass="android.support.v7.widget.SearchView"
在此:
app:actionViewClass="androidx.appcompat.widget.SearchView" />
别忘了在您的(菜单-> yourfilename.xml
)
app:actionViewClass="androidx.appcompat.widget.SearchView"
请确保您在 .java
文件中使用的 class 与 searchview
相同。