2012-11-23 29 views
3

我目前在我的应用中使用ActionBarSherlock 4.2和它的SearchView小部件。SearchView imeOptions和onQueryTextSubmit支持

我想让它提交查询,即使它是空的。我试图设置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); 
} 

由于两个Logcat条目从不出现在Logcat窗口中,因此onKey从不会被触发。不知道SherlockFragment中是否存在这个问题。

对菜单项也没有特别的做法。

<?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> 

有没有办法解决这个问题?还是有更简单的方式来使查询为空时提交?它似乎并不支持源代码中的任何配置。

回答

1

我转而把通过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); 
} 
+0

这里是另一种解决方案。使用较少的代码工作。 http://stackoverflow.com/a/32023365/1987045 –

0

我有同样的问题,这个问题在SearchView.java

在于onSubmitQuery()
private void onSubmitQuery() { 
    CharSequence query = mQueryTextView.getText(); 
    if (query != null && TextUtils.getTrimmedLength(query) > 0) { 

空查询的不支持,所以我不得不下载和使用ActionBarSherlock,然后修改这个方法。

这是我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(); 
    } 
} 

希望这有助于。