在安卓系统中切换标签时隐藏键盘。

3
我创建了一个带有自定义类的选项卡,每个选项卡中显示一个片段。当键盘打开时,我切换到另一个选项卡,则会调用第二个片段,但键盘不会隐藏。
我在两个片段的onCreateView()中使用下面的代码,但它不起作用:
//To Hide Soft 
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
5个回答

8
onCreateView()中使用该代码的问题是,选项卡内初始化的片段将在父片段/活动中创建选项卡时创建。我研究了选项卡内片段的行为,并意识到如果覆盖许多生命周期方法,如onViewCreated()onResume()等,您会遇到相同的问题。
我发现解决此问题的最佳方法是在要隐藏键盘的片段中重写setUserVisibleHint(boolean isVisibleToUser)。每当片段的可见性更改时,都会调用此方法。
@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            try {
                InputMethodManager mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                mImm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
                mImm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
            } catch (Exception e) {
                Log.e(TAG, "setUserVisibleHint: ", e);
            }
        }
    }

谢谢,这个在切换选项卡片段时对我很有用。 - Meerz
1
setUserVisibleHint() 已经被弃用了一段时间。您可能希望将逻辑简单地移动到 onResume() 中。 - Oke Uwechue

3

使用此类来在运行时隐藏和显示键盘。尝试在onTabChangedListener上调用该方法。希望能帮助您。

public class KeyBoardHandler {

    public static void hideSoftKeyboard(Activity activity) {
        InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
    }

    public static void showSoftKeyboard(Activity activity) {
        InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    }
}

回答了一个未被问到的问题。 - Mitch

1
将这段代码放在片段的onDestroy方法中。
try {
        InputMethodManager mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        mImm.hideSoftInputFromWindow(mView.getWindowToken(), 0);
        mImm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);

    } catch (Exception e) {

    }

0

尝试使用以下代码

接口: ICallBacks

public interface ICallBacks {
  public void isChanged();
}

在您的活动中定义一个变量,如:

public ICallBacks mCallbacks;

在OnPageChangeListener中
 @Override
public void onPageScrolled(int arg0, float arg1, int arg2) {


    if (mCallbacks != null)
        mCallbacks.isChanged();
}

在你的代码片段中,你需要使用ICallBacks接口进行实现。
@Override
public void onAttach(Activity activity) {
    // TODO Auto-generated method stub
    super.onAttach(activity);
    if (activity != null) {
        ((PagerActivity) getActivity()).mCallbacks = this;
    }

}
@Override
public void isChanged() {

    if (isVisible())
        hideKeyboard();
}

    private void hideKeyboard() {
      InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
      View view = this.getCurrentFocus();
      if (view != null) {
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }

@user3138859 - 尝试在每个片段的onDestroyView中隐藏键盘 - user543
当片段可见时,键盘是否启用? - Ramesh
当我在EditText中输入值时,键盘会打开...然后假设我移动到另一个选项卡...第二个片段被调用...即使这样,键盘仍然保持打开状态。 - Ravi Yadav
你正在使用视图翻页器吗? - Ramesh
我认为你需要在实现OnPageChangeListener接口中,在onPageScrolled方法中使用一个接口与你的fragment进行通信,在该方法中调用hide keyboard方法。这个方法对我很有效,如果你感兴趣,我可以发布那段代码。 - Ramesh
显示剩余2条评论

0

如果你像我一样在2022年来到这里,你应该使用 ViewPager2onResume 以及 onPause 方法来知道当前可见的片段。

我在这里找到了答案,而我之所以能找到它,是因为IDE告诉我这个答案中使用的方法已过时,所以感谢答案!

我仍在努力弄清如何不显示它,但我想这可能是因为我在另一个标签上选择了某些内容,结果出现了一些问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接