如何解决在工具栏中的 SearchView 打开的情况下更新 RecyclerView 视图后关闭软键盘?
8/6/21 在下面添加了其他代码更新,但也未成功。令人惊讶的是,以前的 stackoverflow 成员已经尝试过很多潜在的解决方案,但没有一个适用于我的用例......除了 Android 令人沮丧。
我正在尝试添加代码以在这些用户事件后关闭软键盘:
-
我工具栏中的 SearchView 从 RecyclerView 列表中的全套 CardView 中返回满足用户搜索文本条件的 CardView 过滤列表。
-
用户开始向左滑动以从过滤列表中删除过滤的 CardView 之一。
-
用户通过使用 DialogFragment 对话框单击“确定”来确认 Cardview 删除。
-
视图按预期更新并返回过滤后的剩余 CardView
-
工具栏正确显示 SearchView 仍然打开,搜索文本仍然显示在 mSearchView 的 EditText 行
但是当过滤的列表视图更新时,软键盘会弹出。那么如何在视图更新时防止软键盘弹出?
我在 MainActivity 中尝试的代码不起作用:
1)
// this keeps the soft keyboard from opening but it closes the
// SearchView in the Toolbar and I'd like to keep it open for the user
// with the user's
if (mSearchView != null) {
mSearchView.clearFocus();
}
2)
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0);
}
8/6/21 更新:
这些在 removeItem() 中都不起作用,使用“View viewRemove = MainActivity.this.getCurrentFocus();”
mSearchEditText.onEditorAction(EditorInfo.IME_ACTION_GO);
immMain.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
immMain.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),inputMethodManager.HIDE_NOT_ALWAYS);
immMain.hideSoftInputFromWindow(viewRemove.getWindowToken(),0);
immMain.hideSoftInputFromWindow(mSearchView.getWindowToken(),0);
immMain.hideSoftInputFromWindow(mSearchEditText.getWindowToken(),0);
immMain.hideSoftInputFromWindow(viewRemove.getApplicationWindowToken(),0);
immMain.hideSoftInputFromWindow(mSearchView.getApplicationWindowToken(),0);
immMain.hideSoftInputFromWindow(mSearchEditText.getApplicationWindowToken(),0);
我在 DialgoFragment 中尝试的代码不起作用:
1)
InputMethodManager imm =
(InputMethodManager) rootView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);
}
2)
View view = getActivity().getCurrentFocus();
if (view == null) view = new View(activity); {
InputMethodManager imm = (InputMethodManager)
getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm == null) {
return;
}
else {
imm.hideSoftInputFromWindow(view.getWindowToken(),0);
}
}
3)
View view = getActivity().getCurrentFocus();
if (view == null) view = new View(activity); {
InputMethodManager imm = (InputMethodManager)
getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm == null) {
return; }
else {
imm.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
8/6/21 Update:
These also did not work in the Fragement:
((MainActivity) getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Objects.requireNonNull(this.getDialog().getWindow()).setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
What am I missing here?
MainActivity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mainactiv_menu,menu);
searchItem = menu.findItem(R.id.action_search);
menu.findItem(R.id.action_search).setVisible(false);
SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);
if (searchItem != null) {
mSearchView = (SearchView) searchItem.getActionView();
// Sets up a new a new SearchViewFocusListener so it can capture
// a Back Button press by the member.
mSearchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(searchItem));
// Associate the SearchView with the searchable configuration using
// setSearchableInfo(getSearchableInfo).
if (mSearchView != null) {
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
EditText mSearchEditText = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text); mSearchEditText.setInputType(android.text.InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
// use the link to EditText of the SearchView so that a
// TextWatcher can be used.
mSearchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
... // search criteria code
if (!mSearchView.isIconified() && searchList.size() > 0) {
cardsAdapter.setFilter(searchList,s.toString());
if (immMain != null) {
immMain.hideSoftInputFromWindow(mSearchView.getWindowToken(),0);
}
return super.onCreateOptionsMenu(menu);
}
DeleteCardViewFragment
public class DeleteCardViewFragment extends DialogFragment {
public DeleteCardViewFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
if (getActivity() != null) {
Button btnOK = rootView.findViewById(R.id.btnOK);
btnOK.setOnClickListener(v -> {
((MainActivity) getActivity()).removeItem(card);
}
// close soft keyboard from the Fragment code was unsuccessfully tried here
}
dismiss();
MainActivity removeItem code:
public void removeItem(@NonNull final Card card) {
// code to remove the CardView from the RecyclerView list
mRecyclerView.scrollToPosition(0);
// MainActivity code was unsuccessfully added here to try to close the soft keyboard
}
// please note that a regular left-swipe by the user on a CardView,// without an active SearchView open works as expected; that is,the
// CardView is deleted and the user is returned to the updated
// CardView list and the soft keyboard does not open. So the
// SearchView is probably causing the problem and something to do
// with the focus after the view is updated.
解决方法
在片段中尝试使用此代码关闭键盘:
/*--for hiding keyboard on click--*/
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view,so we can grab the correct window token from it.
View view = getActivity().getCurrentFocus();
//If no view currently has focus,create a new one,just so we can grab a window token from it
if (view == null) {
view = new View(getActivity());
}
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(),0);
Activity 中键盘关闭的代码:
/*--for hiding keyboard on click--*/
InputMethodManager imm=(InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view,so we can grab the correct window token from it.
View view = getCurrentFocus();
//If no view currently has focus,just so we can grab a window token from it
if (view == null){
view = new View(this);
}
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(),0);
在 MainActivity
的清单中添加此代码
android:windowSoftInputMode="stateAlwaysHidden
,
您可以尝试的一些解决方案
- 使用 stateHidden 设置 windowSoftInputMode
<activity android:name=".MainActivity" android:windowSoftInputMode="stateHidden">
- 将这些属性添加到父视图中
android:focusable="true" android:focusableInTouchMode="true"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。