在我的应用程序中,我正在制作一个搜索接口,其中SearchView分别在失去焦点和获得焦点时折叠和扩展。然而,失去焦点的事情只在两种情况下发生:
SearchView旁边的主页图标被按下时。如果用户不仅点击这两件事,而且点击屏幕上的任何其他地方(例如,任何按钮或屏幕上没有视图的任何空白部分),我希望它失去焦点(从而崩溃)。
发布于 2013-07-11 10:55:23
我找到了下面的解决方案。我在每个不是搜索视图实例的视图上使用setOnTouchListener来折叠搜索视图。对我来说是完美的。下面是代码。
public void setupUI(View view) {
if(!(view instanceof SearchView)) {
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
searchMenuItem.collapseActionView();
return false;
}
});
}
//If a layout container, iterate over children and seed recursion.
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
View innerView = ((ViewGroup) view).getChildAt(i);
setupUI(innerView);
}
}
}这是我提到的答案。
发布于 2018-08-02 04:04:28
好吧,我还有一种更简单更整洁的方法。如果您使用搜索小部件作为工具栏(https://developer.android.com/guide/topics/search/search-dialog#UsingSearchWidget)中的操作视图,则可能希望使SearchView失去焦点,并在用户触摸屏幕上其他任何位置时隐藏键盘。
除了SearhView之外,您不必在层次结构中的每个视图上迭代和设置触摸侦听器,您可以简单地使用这个解决方案,因为SearchView中有一个AutoCompleteTextView。
步骤1:通过添加以下属性,使父视图(活动的内容视图)可单击和可聚焦
android:clickable="true"
android:focusableInTouchMode="true"步骤2:在SearchView AutoCompleteTextView上设置OnFocusChangeListener
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem search = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) search.getActionView();
// get a reference of the AutoCompleteTextView from the searchView
AutoCompleteTextView searchSrcText = searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
searchSrcText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
});
return super.onCreateOptionsMenu(menu);
}就这样!希望这对将来的读者有用:)
发布于 2019-12-06 17:01:39
在我的例子中,我必须停止搜索并关闭键盘,每当用户单击任何其他视图时,这对我都是有效的。
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View view = getCurrentFocus();
if (view != null && view instanceof EditText) {
Rect r = new Rect();
view.getGlobalVisibleRect(r);
int rawX = (int) ev.getRawX();
int rawY = (int) ev.getRawY();
if (!r.contains(rawX, rawY)) {
hideSoftKeyboard(MainActivity.this);
}
}
}
return super.dispatchTouchEvent(ev);
}https://stackoverflow.com/questions/17590874
复制相似问题