簡體   English   中英

為什么在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>

這是我的日志:

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)

我已經嘗試對此進行了大量研究,但我沒有任何運氣。 非常感謝您在此問題上的幫助。

這行是錯誤的:

searchView.setOnQueryTextListener((OnQueryTextListener) searchView);

不能searchView OnQueryTextListener轉換為OnQueryTextListener 而是給它一個適當的參數作為這樣的匿名類:

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

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

現在,我看到您已經嘗試在Activity中添加這兩種方法,但這不是正確的方法。 您要么需要創建實現此SearchView.OnQueryTextListener接口的自定義類,然后說:

searchView.setOnQueryTextListener(new MyClassThatImplementsTheInterface);

或者按照我作為第一個解決方案的方式進行操作。 這是使用匿名類執行此操作的更常見方法

錯誤是從您將SearchView投射到偵聽器的日志中清除的,嘗試類似

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM