2016-06-08 65 views
0

我一直在试图在这个应用程序中构建一个可搜索的界面一段时间,并且我一直在使用很多Android开发人员指南来帮助,但是最近我遇到了这个与我做的SearchView和OnQueryTextListener有关的错误不知道如何解决,但它阻止我的应用程序运行。为什么我在SearchView和OnQueryTextListener上的Android Studio中出现此错误?

这里是我的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$1.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) 

我曾试着对此做过大量的研究,而且我没有任何运气。我非常感谢有关此事的任何帮助,谢谢。

+0

你试试我的答案,并做了记录清晰它适合你的队友? – Vucko

+0

我这么认为!非常感谢你的帮助,我很新。就像一个侧面的问题,你会碰巧有什么好的资源来学习一些关于搜索功能的知识,以及在搜索完成后如何显示数据?再次感谢。 – grassss

+0

非常欢迎。我没有在我的任何项目中使用过它们。我也在YouTube上了解了很多关于观看新波士顿教程的内容。你可能会在任何地方找到资源,只是谷歌:) – Vucko

回答

0

此行是错误的:

searchView.setOnQueryTextListener((OnQueryTextListener) searchView); 

不能施放searchViewOnQueryTextListener。相反,给它一个合适的参数作为这样一个匿名类:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      //your logic 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      //your logic 
     } 
    }); 

我现在看到你已经试过这两种方法在你的活动,这是不这样做的正确方法补充。您可能需要创建一个实现此接口SearchView.OnQueryTextListener您的自定义类,然后说:

searchView.setOnQueryTextListener(new MyClassThatImplementsTheInterface); 

或者做上面我给你的第一个解决方案的方式。这就是这样做的更常见的方式,使用anonymous classes.

-1

的错误是从你铸造搜索查看听者这是错误的尝试像

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

     @Override 
     public boolean onQueryTextChange(String newText) { 
      return false; 
     } 
    });` 
+0

同样的答案我在15分钟之前给了你。 – Vucko

相关问题