Android SearchView imeOptions和onQueryTextSubmit支持

Android SearchView imeOptions和onQueryTextSubmit支持,android,actionbarsherlock,searchview,Android,Actionbarsherlock,Searchview,我目前正在使用和它的小部件在我的应用程序 我想让它提交查询,即使它是空的。我试图设置imeOptions和OnKeyListener,但它们都被无缘无故地忽略了 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { Log.d(TAG, "onCreateOptionsMenu"); inflater.inflate(R.menu.interactive_map, menu);

我目前正在使用和它的小部件在我的应用程序

我想让它提交查询,即使它是空的。我试图设置imeOptions和OnKeyListener,但它们都被无缘无故地忽略了

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d(TAG, "onCreateOptionsMenu");
    inflater.inflate(R.menu.interactive_map, menu);
    mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

    mSearchView.setImeOptions(EditorInfo.IME_ACTION_GO);
    mSearchView.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            Log.d(TAG, "keyCode: " + keyCode); 
            Log.d(TAG, "Action: " + event.getAction());
            if(keyCode == EditorInfo.IME_ACTION_SEARCH){
                onQueryTextSubmit(""+mSearchView.getQuery());
            }

            return false;
        }
    });


    super.onCreateOptionsMenu(menu, inflater);
}
onKey不会被触发,因为两个Logcat条目都不会出现在Logcat窗口中。不确定这是否是夏洛克碎片内部的问题

菜单项也没有做什么特别的事情

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_search"
          android:title="@string/app_name"
          android:icon="@android:drawable/ic_menu_search"
          android:showAsAction="always"
          android:actionViewClass="com.actionbarsherlock.widget.SearchView" />
</menu>


有没有办法绕过这个问题?或者,当查询为空时,是否有更简单的方法来启用提交?不过,它似乎不支持源代码中的任何配置。

我改为通过ActionMode放置SearchView。我现在接受这个答案,直到有人对这个问题有了更好的解决方案

private void showActionMode(){
    MainActivity a = (MainActivity)getActivity();
    a.startActionMode(new SearchActionMode());
}

private class SearchActionMode implements ActionMode.Callback{

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        Log.d(TAG, "onCreateActionMode creating inflater");
        MenuInflater inflater = new MenuInflater(getActivity());
        Log.d(TAG, "onCreateActionMode inflating");
        inflater.inflate(R.menu.interactive_map, menu);
        Log.d(TAG, "onCreateActionMode finding SearchView");
        mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

        Log.d(TAG, "mSearchView: " + mSearchView);
        setupSearchView();
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        Log.d(TAG, "onPrepareActionMode");
        //TODO add searchView once working
        mSearchView.requestFocus(); 
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        Log.d(TAG, "onActionItemClicked");
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        Log.d(TAG, "onDestroyActionMode");
        closeTopTray();
        closeListView();
    }

}


private void setupSearchView() {

    mSearchView.setIconifiedByDefault(false);
    mSearchView.setId(ID_SEARCH_VIEW);
    mSearchView.setOnSearchClickListener(this);
    mSearchView.setOnQueryTextListener(this);
    mSearchView.setOnCloseListener(this);
    mSearchView.setImeOptions(EditorInfo.IME_ACTION_SEARCH);

    // To automatically display keyboard when display SearchView
    mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            Log.d(TAG, "mSearchView focus changed: " + hasFocus);
            if (hasFocus) {
                showInputMethod(v.findFocus());
            }
        }
    });

    mSearchView.setQueryHint("Type keyword");
    mSearchView.setQuery((TextUtils.isEmpty(searchQuery)? "": searchQuery), false);
}

我也有同样的问题,问题出在SearchView.java中的submitquery()上

private void onSubmitQuery() {
    CharSequence query = mQueryTextView.getText();
    if (query != null && TextUtils.getTrimmedLength(query) > 0) {
不支持空查询,因此我必须下载并使用,然后修改此方法

这就是我的onSubmitQuery()现在的样子

private void onSubmitQuery() {
     CharSequence query = mQueryTextView.getText();
     if (query == null) {query = "";}
     if (mOnQueryChangeListener == null
             || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) {
         if (mSearchable != null) {
             launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString());
             setImeVisibility(false);
         }
         dismissSuggestions();
     }
 }

希望这有帮助。

这里是另一个解决方案。使用更少的代码。