在工具栏中的SearchView打开的情况下更新RecyclerView视图后关闭软键盘



8/6/21在下面添加了其他代码更新,但也没有成功。太神奇了,以前的stackoverflow成员尝试过这么多潜在的解决方案,但都不适用于我的用例。。。Android之外的沮丧。

我正在尝试添加代码以在这些用户事件后关闭软键盘:

  • 工具栏中的SearchView从RecyclerView列表中的整套CardViews中返回符合用户搜索文本标准的CardViews筛选列表。

  • 用户启动向左滑动,从过滤列表中删除一个过滤的CardViews。

  • 用户通过点击"确认Cardview删除;好的";使用DialogFragment对话框。

  • 视图按预期更新并返回剩余的已过滤CardViews

  • 工具栏正确显示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/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);

此代码用于在活动中关闭键盘:

/*--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, create a new one, 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"

最新更新