java - 带有 SearchView 的 Android abs,onQueryTextListener 不工作

标签 java android actionbarsherlock searchview searchable

我正在尝试将 SearchView Support v4 版本与操作栏 sherlock 一起使用。

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

我的问题是我需要使用 onQueryTextSubmit 和 onQueryTextChange 监听器,但它们从未被触发。我需要使用 searchh 查询字符串并用它做一些自定义的事情。

这是完整的 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);
    }

最佳答案

您正在尝试使用新的 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) { }

关于java - 带有 SearchView 的 Android abs,onQueryTextListener 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854212/

相关文章:

java - 如何更好地在OptaPlanner中应用过度约束规划?

java - 无法解析方法 setVisibility(int)

android - 如何在 SherlockFragment 中包含 MapView?

java - 自动解决 PMD 违规问题?

java - 代号一 : AutoCompleteTextField refresh list on textfield text change

java - 如何在 spring 中查询 postgres 整数数组

android - Ionic App 未安装在 Android 设备中

android - UDP 适用于 Android 2.3 但不适用于 Android 2.2

java - 获取类之外的选项卡位置

java - 重构名称后出现 NoClassDefFoundError