【问题标题】:Hide Soft Keyboard In Android App From ViewPager Fragments从 ViewPager 片段中隐藏 Android 应用程序中的软键盘
【发布时间】:2026-02-07 19:10:01
【问题描述】:

我有一个 Android 应用,其中包含一个带有 2 个片段的 ViewPager。第一个片段包含一个 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);
}

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在你的 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 上隐藏它。
      • 这可以防止在 Activity 与您的片段一起加载时显示软键盘。但是,如果您单击某些 EditText,则会显示软键盘。影响 Activity 加载的所有 Fragment。对于始终隐藏并且永远不显示软键盘,在清单中您应该在 android:windowSoftInputMode 中使用 stateAlwaysHidden。对不起我的英语。
      • 几乎可以工作,但是当您切换回不同的片段时,键盘不会隐藏。
      【解决方案3】:
          getActivity().getWindow().setSoftInputMode(
                        WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
      

      【讨论】: