【问题标题】:Android abs with SearchView, onQueryTextListener not working带有SearchView的Android abs,onQueryTextListener不起作用
【发布时间】:2013-05-27 02:14:49
【问题描述】:

我正在尝试使用带有操作栏 sherlock 的 SearchView Support v4 版本。

所以我在操作栏中有我的搜索按钮 -> 当我触摸它时,键盘会出现,搜索栏也会出现。

我的问题是我需要使用监听器 onQueryTextSubmit 和 onQueryTextChange 但它们从未被解雇。我需要使用 searh 查询字符串并使用它进行自定义操作。

这里是完整的activity.java

public class ActivityMain extends SherlockFragmentActivity implements OnQueryTextListener, DialogFragmentListener {
    /**
     * PRIVATE ATTRIBUTES
     */
    private static final String TAG                             = "ActivityMain";
    private ViewPager           _viewPager;
    private TabsAdapter         _tabsAdapter;
    private DialogFiltre        _dialogFiltre;
    private String              _searchCurrentQuery;
    // data
    private boolean             _doubleBackToExitPressedOnce    = false;


    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        menu.clear();
        switch ((int) _viewPager.getCurrentItem()) {
            case 0:
                getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
                break;
            case 1:
                getSupportMenuInflater().inflate(R.menu.action_bar_menu, menu);
                break;
            case 2:
                getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
                break;
        }
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getSupportMenuInflater().inflate(R.menu.action_bar_menu, menu);
        MenuItem searchItem = menu.findItem(R.id.search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setSubmitButtonEnabled(true);
        searchView.setOnQueryTextListener(queryTextListener);
        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {

        Log.i(TAG, "onQueryTextSubmit--");
        onSearchClicked(query);
        // hide keyboard
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {

        Log.d(TAG, "onQueryTextChange--");
        _searchCurrentQuery = newText.toString();
        EtablissementApplication._adapter.getFilter().filter(_searchCurrentQuery);
        return true;
    }

    private void onSearchClicked(String query) {

        Log.d(TAG, "onSearchClicked--");
        _searchCurrentQuery = query.toString();
        EtablissementApplication._adapter.getFilter().filter(_searchCurrentQuery);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                break;
            case R.id.search:
                break;
            case R.id.menu_filtre:
                _dialogFiltre = DialogFiltre.newInstance(R.string.menu_filtre, this);
                _dialogFiltre.setValidDialogListener(this);
                _dialogFiltre.show(getSupportFragmentManager(), null);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

【问题讨论】:

    标签: java android actionbarsherlock searchview searchable


    【解决方案1】:

    您正在尝试使用新的 SearchView 而不是使用由 SupportMenuInflater 创建的。 您将侦听器设置为您在屏幕上看到的不同 SearchView。 此外,每次调用 onPrepareOptionsMenu 时,都会创建新的 SearchView,因此它没有设置任何侦听器。

    尝试像这样执行 onPrepareOptionsMenu:

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
    
        menu.clear();
        switch ((int) _viewPager.getCurrentItem()) {
            case 0:
                getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
                break;
            case 1:
                getSupportMenuInflater().inflate(R.menu.action_bar_menu, menu);
                MenuItem searchItem = menu.findItem(R.id.search);
                SearchView searchView = (SearchView) searchItem.getActionView();
                searchView.setSubmitButtonEnabled(true);
                searchView.setOnQueryTextListener(queryTextListener);
                break;
            case 2:
                getSupportMenuInflater().inflate(R.menu.empty_menu, menu);
                break;
        }
        return super.onPrepareOptionsMenu(menu);
    }
    

    并移除被覆盖的方法

    @Override
    public boolean onCreateOptionsMenu(Menu menu) { }
    

    【讨论】:

    • 你的建议不错,我试过了,但我仍然无法获得我的日志。我需要在清单或其他任何可能阻止听众的地方设置什么吗?
    • 从您提供的 sn-p 中,我没有看到任何其他错误。将完整的 Activity 代码与导入一起发布,也许我们会看到一些东西。
    • 我已经复制了整个活动,当问题解决后,我将从帖子中删除...
    • 你是一个救生员,它有效!但我仍然不明白为什么我只需要 onPrepareOptionsMenu()。我认为这两种方法都需要正确设置菜单>.
    • OnCreateOptionsMenu 只调用一次,但每次菜单失效时都可以调用 onPrepareOptionsMenu。 menu.clear();、getSupportMenuInflater().inflate 在 onCreateOptionsMenu 之后被调用了多次,从而创建了一个没有侦听器的新 SearchView 对象。
    【解决方案2】:

    您可能必须在 SearchView 引用上设置 searchView.setOnQueryTextListener(this);

    【讨论】:

      【解决方案3】:

      Google 中的顶级结果,因此添加了一个新的可能原因,这让我很头疼。请注意您引用的 SearchView 实现。

      这对我不起作用(编译,不会崩溃,但监听器不起作用):

          <!--actionbar.xml-->
          ...
          <item android:id="@+id/search"
              android:title="@string/action_search"
              android:icon="@drawable/ic_search"
              app:showAsAction="collapseActionView|ifRoom"
              app:actionViewClass="android.widget.SearchView"/>
          ...
      
          // Activity#onCreateOptionsMenu(android.view.Menu)
          val searchView: SearchView = menu.findItem(R.id.search).actionView as android.widget.SearchView
          searchView.setOnQueryTextListener(...)
      

      这样做(编译,不会崩溃,并且监听器工作):

          <!--actionbar.xml-->
          ...
          <item android:id="@+id/search"
              android:title="@string/action_search"
              android:icon="@drawable/ic_search"
              app:showAsAction="collapseActionView|ifRoom"
              app:actionViewClass="androidx.appcompat.widget.SearchView"/>
          ...
      
          // Activity#onCreateOptionsMenu(android.view.Menu)
          val searchView: SearchView = menu.findItem(R.id.search).actionView as androidx.appcompat.widget.SearchView
          searchView.setOnQueryTextListener(...)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        相关资源
        最近更新 更多