从ViewPager Fragments中隐藏Android应用程序中的软键盘

时间:2012-08-28 20:57:53

标签: android android-fragments android-viewpager android-softkeyboard

我有一个包含带有2个片段的ViewPager的Android应用。第一个片段包含EditText字段。当应用程序启动时,该字段立即获得焦点并启动软键盘(我想要发生)。第二个片段仅包含一个列表(没有可编辑的文本字段)。当我从片段1滑动到片段2时,我希望键盘消失。我尝试过的任何东西似乎都没有用。键盘不仅保持在视图中,还会继续更新片段1的EditText字段。

我想我要么使用不正确的代码隐藏键盘或将其放在错误的位置。如果任何人都可以发布正确实现的示例,将非常感谢!

我最近的尝试是放置应该在片段1的onDetach()方法中隐藏键盘的代码:

@Override
public void onDetach()
{
    super.onDetach();

    InputMethodManager imm = (InputMethodManager) this.context.getSystemService(Context.INPUT_METHOD_SERVICE);

    // I'VE TRIED ALL THREE BELOW, NONE OF THEM WORK...

        // imm.hideSoftInputFromWindow(this.messageView.getWindowToken(), 0);
        // imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
        // this.context.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}

3 个答案:

答案 0 :(得分:11)

请参阅this answer.基本上,您需要让ViewPager的OnPageChangeListener为您隐藏键盘。 (如果您希望滑动动画保持平滑,请在onPageScrollStateChanged而不是onPageSelected中执行此操作。)

@Override
public void onPageScrollStateChanged(int state)
{
    if (state == ViewPager.SCROLL_STATE_IDLE)
    {
        if (mViewPager.getCurrentItem() == 0)
        {
            // Hide the keyboard.
            ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE))
                .hideSoftInputFromWindow(mViewPager.getWindowToken(), 0);
        }
    }
}

答案 1 :(得分:0)

在AndroidManifest中你应该添加到Activity声明android:windowSoftInputMode =" stateHidden":

<activity 
        android:name="YourActivity"            
        android:windowSoftInputMode="stateHidden">           
</activity>

在你的布局中,从EditText的子项中删除requestFocus:

<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="15dp"
    android:ems="10" >
    <requestFocus />
</EditText>

答案 2 :(得分:0)

    getActivity().getWindow().setSoftInputMode(
                  WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);