为什么我在 Android Studio 的 SearchView 和 OnQueryTextListener 中收到此错误?
Why am I getting this error in Android Studio on SearchView and OnQueryTextListener?
一段时间以来,我一直在尝试在此应用程序中构建一个可搜索的界面,并且我一直在使用很多 Android 开发人员指南来提供帮助,但我最近 运行这个错误与我不知道如何解决的 SearchView 和 OnQueryTextListener 有关,但它正在从 运行.
停止我的应用程序
这是我的 MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.overflow, menu);
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setOnQueryTextListener((OnQueryTextListener) searchView);
//this is where the program crashes
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
searchView.setSearchableInfo(info);
return true;
}
public boolean onQueryTextSubmit(String query) {
// User pressed the search button
return false;
}
public boolean onQueryTextChange(String newText) {
// User changed the text
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.constants:
startActivity(new Intent(MainActivity.this, FundamentalPhysicalConstants.class));
return true;
case R.id.joes_rules:
//go to rules
return true;
case R.id.home:
//Go back to the home screen
return true;
case R.id.search:
//open search
return true;
default:
// If we got here, the user's action was not recognized.
// Invoke the superclass to handle it.
return super.onOptionsItemSelected(item);
}
}
}
这是我的 SearchableActivity:
public class SearchableActivity extends ListActivity {
DatabaseTable db= new DatabaseTable(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_searchable);
// get the intent sent when user searches from search widget, verify the action and exxtract what is typed in
Intent intent = getIntent();
handleIntent(intent);
}
public void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
Cursor c = db.getWordMatches(query, null);
//still need to process Cursor and display results
}
}
public void onListItemClick(ListView l,
View v, int position, long id) {
// call detail activity for clicked entry
}
private void doSearch(String queryStr) {
// get a Cursor, prepare the ListAdapter
// and set it
}
}
这是我的 searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint">
</searchable>
这是我的 logcat:
06-08 14:57:09.581 28388-28388/com.gmd.referenceapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gmd.referenceapplication, PID: 28388
java.lang.ClassCastException: android.support.v7.widget.SearchView cannot be cast to android.support.v7.widget.SearchView$OnQueryTextListener
at com.gmd.referenceapplication.MainActivity.onCreateOptionsMenu(MainActivity.java:55)
at android.app.Activity.onCreatePanelMenu(Activity.java:2846)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:340)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:258)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar.run(ToolbarActionBar.java:61)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我已经尝试对此进行了大量研究,但我没有任何运气。对于此事的任何帮助,我将不胜感激,谢谢。
这一行错了:
searchView.setOnQueryTextListener((OnQueryTextListener) searchView);
您不能将searchView
转换为OnQueryTextListener
。而是给它一个适当的参数作为匿名 class 像这样:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//your logic
}
@Override
public boolean onQueryTextChange(String newText) {
//your logic
}
});
我现在看到您曾尝试在 Activity 中添加这两种方法,但这不是正确的做法。您要么需要创建实现此 SearchView.OnQueryTextListener
接口的自定义 class,然后说:
searchView.setOnQueryTextListener(new MyClassThatImplementsTheInterface);
或者按照我给你的第一个解决方案的方法来做。这是更常见的方法,使用 anonymous classes.
从您将 SearchView 投射到错误的侦听器的日志中可以清楚地看到错误尝试类似
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});`
一段时间以来,我一直在尝试在此应用程序中构建一个可搜索的界面,并且我一直在使用很多 Android 开发人员指南来提供帮助,但我最近 运行这个错误与我不知道如何解决的 SearchView 和 OnQueryTextListener 有关,但它正在从 运行.
停止我的应用程序这是我的 MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.overflow, menu);
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setOnQueryTextListener((OnQueryTextListener) searchView);
//this is where the program crashes
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
searchView.setSearchableInfo(info);
return true;
}
public boolean onQueryTextSubmit(String query) {
// User pressed the search button
return false;
}
public boolean onQueryTextChange(String newText) {
// User changed the text
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.constants:
startActivity(new Intent(MainActivity.this, FundamentalPhysicalConstants.class));
return true;
case R.id.joes_rules:
//go to rules
return true;
case R.id.home:
//Go back to the home screen
return true;
case R.id.search:
//open search
return true;
default:
// If we got here, the user's action was not recognized.
// Invoke the superclass to handle it.
return super.onOptionsItemSelected(item);
}
}
}
这是我的 SearchableActivity:
public class SearchableActivity extends ListActivity {
DatabaseTable db= new DatabaseTable(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_searchable);
// get the intent sent when user searches from search widget, verify the action and exxtract what is typed in
Intent intent = getIntent();
handleIntent(intent);
}
public void onNewIntent(Intent intent) {
setIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
Cursor c = db.getWordMatches(query, null);
//still need to process Cursor and display results
}
}
public void onListItemClick(ListView l,
View v, int position, long id) {
// call detail activity for clicked entry
}
private void doSearch(String queryStr) {
// get a Cursor, prepare the ListAdapter
// and set it
}
}
这是我的 searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint">
</searchable>
这是我的 logcat:
06-08 14:57:09.581 28388-28388/com.gmd.referenceapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gmd.referenceapplication, PID: 28388
java.lang.ClassCastException: android.support.v7.widget.SearchView cannot be cast to android.support.v7.widget.SearchView$OnQueryTextListener
at com.gmd.referenceapplication.MainActivity.onCreateOptionsMenu(MainActivity.java:55)
at android.app.Activity.onCreatePanelMenu(Activity.java:2846)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:340)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:258)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
at android.support.v7.app.ToolbarActionBar.run(ToolbarActionBar.java:61)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我已经尝试对此进行了大量研究,但我没有任何运气。对于此事的任何帮助,我将不胜感激,谢谢。
这一行错了:
searchView.setOnQueryTextListener((OnQueryTextListener) searchView);
您不能将searchView
转换为OnQueryTextListener
。而是给它一个适当的参数作为匿名 class 像这样:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//your logic
}
@Override
public boolean onQueryTextChange(String newText) {
//your logic
}
});
我现在看到您曾尝试在 Activity 中添加这两种方法,但这不是正确的做法。您要么需要创建实现此 SearchView.OnQueryTextListener
接口的自定义 class,然后说:
searchView.setOnQueryTextListener(new MyClassThatImplementsTheInterface);
或者按照我给你的第一个解决方案的方法来做。这是更常见的方法,使用 anonymous classes.
从您将 SearchView 投射到错误的侦听器的日志中可以清楚地看到错误尝试类似
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});`