我创建了带自定义类的标签条,我在每个标签中显示一个片段。当键盘打开并切换到tab时,第二个片段被调用,但键盘没有隐藏。
我在两个片段中使用onCreateView()中的代码,但它不起作用:
//To Hide Soft
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
答案 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);
}
}