Ако сте следвали този урок, трябва да направите някои настройки може да използва SearchView в лента с действия вместо EditText.
Променените методи са registerEditText и onKey в OnKeyBoardActionListener:
registerEditText, сега registerSearchView
public void registerSearchView(SearchView searchView, final MenuItem searchMenuItem){
SearchManager searchManager = (SearchManager) mHostActivity.getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(mHostActivity.getComponentName()));
this.searchMenuItem = searchMenuItem;
final IBinder searchToken = searchView.getWindowToken();
searchView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
Log.d("Focus change", "hasFocus: " + hasFocus);
if (hasFocus) {
showCustomKeyboard(v);
}
else
hideCustomKeyboard();
}
});
//The searchview clicked after the it is already in focus
searchView.setOnClickListener(onClickListener);
//When the searc view is clicked before it is focused
searchView.setOnSearchClickListener(onClickListener);
searchView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("Touch", event.getAction() + "");
SearchView searchViewTemp = (SearchView) v;
int inType = searchViewTemp.getInputType(); //backup the input type
searchViewTemp.setInputType(InputType.TYPE_NULL); //Disable standard keyboard
searchViewTemp.onTouchEvent(event);
searchViewTemp.setInputType(inType);
return true;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
searchMenuItem.collapseActionView(); //collapsing the searchview after search
return false;
}
@Override
public boolean onQueryTextChange(String s) {
return false;
}
});
//Disable spell check
searchView.setInputType(searchView.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
}
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("onClick", v.getLayerType()+"");
showCustomKeyboard(v);
InputMethodManager imm = (InputMethodManager) mHostActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
};
onKey
@Override
public void onKey(int primaryCode, int[] keyCodes) {
View focusCurrent = mHostActivity.getWindow().getCurrentFocus();
Class currentClass = focusCurrent.getClass();
Class searchClass = mHostActivity.findViewById(R.id.action_line_search).getClass();
SearchView.SearchAutoComplete sac = new SearchView.SearchAutoComplete(mHostActivity);
Class searchAutoCompleteClass = sac.getClass();
EditText editText = (EditText)mHostActivity.findViewById(R.id.edittext_search_lines);
Class editTextClass = editText.getClass();
if( focusCurrent.getClass() == SearchView.SearchAutoComplete.class) {
SearchAutoComplete searchView = (SearchAutoComplete) focusCurrent;
Editable editable = searchView.getText();
int start = searchView.getSelectionStart();
if (primaryCode == Keyboard.KEYCODE_DONE) {
Log.d("onKey", "Search Clicked");
mHostActivity.sendQuery(editable);
hideCustomKeyboard();
} else if (primaryCode == Keyboard.KEYCODE_DELETE) {
Log.d("onKey", "Deleting input");
if (editable != null && start > 0)
editable.delete(start - 1, start);
} else {
Log.d("onKey", "Letter or number clicked");
editable.insert(start, Character.toString((char) primaryCode));
}
}
}
След това, когато искате да регистрирате вашия SearchView, вие използвате новия registerSearchView във вашата дейност или фрагмент.
Но възниква нов проблем: софтуерната клавиатура по подразбиране се появява върху персонализираната клавиатура. Ако разберете как да го премахнете, моля, кажете ми! :Д
person
SNB
schedule
18.03.2015