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"