简体   繁体   中英

Why am I getting this error in Android Studio on SearchView and OnQueryTextListener?

I have been trying to build a searchable interface in this app for a while, and I've been using a lot of the Android developer guides to help, but I recently ran into this error to do with SearchView and OnQueryTextListener that I do not know how to resolve, but it is stopping my app from running.

Here is my 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);

        }
    }
}

Here is my 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
    }   

}

Here is my 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>

Here is my 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)

I have tried to do a lot of research on this, and I haven't had any luck. I would be extremely grateful for any help on this matter, thanks.

This line is just wrong:

searchView.setOnQueryTextListener((OnQueryTextListener) searchView);

You cannot cast the searchView into OnQueryTextListener . Instead give it a proper parameter as an anonymous class like this:

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

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

I now see that you have tried to add these two methods in your Activity, which is not the proper way to do it. You either need to create your custom class that implements this SearchView.OnQueryTextListener interface, and then say:

searchView.setOnQueryTextListener(new MyClassThatImplementsTheInterface);

Or do it the way above that I gave you as the first solution. That is the more common way of doing this, using anonymous classes.

the error is clear from the logs you are casting the SearchView to a listener which is wrong try something like

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM