在android中切换选项卡时隐藏键盘

时间:2015-02-06 05:02:36

标签: android android-fragments android-softkeyboard android-tabs

我创建了带自定义类的标签条,我在每个标签中显示一个片段。当键盘打开并切换到tab时,第二个片段被调用,但键盘没有隐藏。

我在两个片段中使用onCreateView()中的代码,但它不起作用:

//To Hide Soft 
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

4 个答案:

答案 0 :(得分:7)

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);
            }
        }
    }

答案 1 :(得分: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);
    }
}

答案 2 :(得分: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) {

    }

答案 3 :(得分: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);
        }
    }
相关问题