【问题标题】:Android: How do I prevent the soft keyboard from pushing my view up?Android:如何防止软键盘将我的视图向上推?
【发布时间】:2011-05-11 14:36:36
【问题描述】:

我的应用底部有一个垂直滑动抽屉。当软键盘打开时,它会将抽屉的标签向上推,因此它位于键盘顶部。我实际上希望它保留在屏幕底部,在显示键盘时隐藏。

还有其他人遇到过这个问题吗?知道如何解决吗?

【问题讨论】:

标签: android layout keyboard view


【解决方案1】:

您只需在活动标签内的AndroidMainfest.xml 文件中将活动的windowSoftInputMode标志切换为adjustPan

查看official documentation 了解更多信息。

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

如果您的容器没有改变大小,那么您可能将高度设置为“匹配父级”。如果可能,将父级设置为“Wrap Content”,或者将约束布局设置为父级的顶部和底部。

父容器将缩小以适应可用空间,因此您的内容可能应该位于 scolling 视图内以防止(取决于手机制造商和选择的布局...)

  1. 内容被拼凑在一起
  2. 内容挂在屏幕外
  3. 内容因位于键盘下方而无法访问

即使它所在的布局是相对布局或约束布局,内容也可能出现问题 1-3。

【讨论】:

  • 我不想让视图平移,我希望它在原处保持静止,只要让键盘盖住它要盖住的东西。
  • 平移意味着视图将被滚动以使您正在输入的视图可见。换句话说,如果刚刚出现的键盘没有掩盖焦点视图,它将保持静态。
  • 我也面临同样的问题。在清单文件中将 windowSoftInputMode 标志设置为“adjustPan”。但不起作用。如何解决它
  • 在我的屏幕底部有一排按钮和它们上方的 ScrollView 的情况下没有帮助。无论 windowSoftInputMode 中的值是什么,按钮都会向上推。
  • 我发现只要您的活动不是全屏,这种通用方法就可以工作
【解决方案2】:

没有一个答案对我有用,但这成功了,将此属性添加到 AndroidManifest.xml 中的 activity 标记中:

<activity
     ...
   android:windowSoftInputMode="adjustNothing"> 
</activity>

【讨论】:

  • 这会使键盘看起来覆盖内容,而不会使布局重新计算其高度。
  • 这解决了键盘将内容向上推的问题,尽管这是我和 OP 想要实现的。
  • 借用@Dom,您可以使用getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); 以编程方式设置此值
  • 这个对我有用,不像其他答案(果冻豆4.1)
  • 完美!它也适用于我的情况。我正在显示一个对话框,里面有一个edittext。对话框一打开,键盘也出现了。我试过“adjustPan”,但它阻止了键盘出现功能。所以,“adjustNothing”在我的情况下效果更好。
【解决方案3】:

在我的情况下,按钮被向上推的原因是因为它们上方的视图是ScrollView,并且无论我设置的android:windowSoftInputMode 的值是什么,它都会在键盘上方向上推按钮时折叠。

通过在按钮上方的ScrollView 上设置android:isScrollContainer="false",我能够避免底部的一排按钮被软键盘向上推。

【讨论】:

  • 但在这种情况下,软键盘覆盖了部分屏幕,无法向下滚动。看起来只有一种方法可以防止底部面板出现在键盘顶部 - 当键盘打开时隐藏它......
  • 就是这样!这个设置在我看来非常有趣,因为这是我发现实现“adjustNothing”缺失属性效果的唯一方法!
  • 仅供参考,这也适用于包含滚动行为的元素,例如listview
  • 只是添加注释,对于WebViews,除了android:isScrollContainer="false"之外,您还需要添加android:windowSoftInputMode="adjustPan"&gt;
【解决方案4】:

您可以尝试动态添加此属性,方法是将以下代码放入您的活动的onCreate 方法中:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

这对我有用,但是:

android:windowSoftInputMode="adjustPan"

没有。

【讨论】:

  • 您是否在 AndroidManifest.xml 中添加了android:windowSoftInputMode="adjustPan"
  • 不,因为它对我没有任何影响。第一行代码完成了这项工作。 :) @HabeebPerwad
  • 我在 AndoidManifest.xml 文件中添加了秒行。我认为在那之后只有它起作用了。所以就问了。
  • @Dom,如何在片段中使用“getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);”?
  • 终于!这行得通!我有一个控制器(从FragmentActivity 扩展)和一些附加到它的视图(视图从RelativeLayout 扩展)。所以在麻烦的观点中,我像你说的那样做了controller.getWindow()...。作品
【解决方案5】:

这里的这些答案对我没有帮助。所以我尝试了这个:

android:windowSoftInputMode="adjustResize"

这就像一个魅力,现在我的应用程序的标题并没有消失。它更流畅。

【讨论】:

  • 这对我来说几乎是完美的。唯一的问题是键盘的建议栏/行仍然隐藏了我的布局。你遇到过这样的问题吗?
  • 我没有遇到过这个问题。 @苏菲安
  • 那时我没有遇到任何问题。现在我不确定。 @苏菲安
  • 对于那些可能遇到类似问题的人,可能是由于TabLayout。一旦我将其可见性设置为View.GONE,问题就消失了。可能是时候重新设计我的布局了。
【解决方案6】:

要在片段中以编程方式执行此操作,您可以使用以下代码

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

把它放在 onResume() 中

【讨论】:

    【解决方案7】:

    这个对我有用

    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
    

    【讨论】:

      【解决方案8】:

      只需添加一行...

      manifest file 的必需活动中添加android:windowSoftInputMode="stateHidden|adjustPan"

      我刚刚解决了:) :)

      【讨论】:

        【解决方案9】:

        为未来的读者。

        我想对这个问题进行具体控制,所以我就是这样做的:

        从片段或活动中,隐藏您的其他视图(在键盘启动时不需要),然后恢复它们以解决此问题:

                    rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                        @Override
                        public void onGlobalLayout() {
                            Rect r = new Rect();
                            rootView.getWindowVisibleDisplayFrame(r);
                            int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);
        
                            if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                            //ok now we know the keyboard is up...
                                view_one.setVisibility(View.GONE);
                                view_two.setVisibility(View.GONE);
        
                            }else{
                            //ok now we know the keyboard is down...
                                view_one.setVisibility(View.VISIBLE);
                                view_two.setVisibility(View.VISIBLE);
        
                            }
                        }
                    });
        

        【讨论】:

        • @Skynet 你完全正确!这是我用于解决我自己的问题的自定义解决方案。
        • 嘿,这太棒了。但是,在键盘关闭的情况下,视图会在短时间内(毫秒)切换到可见状态。因此,我没有直接设置可见性,而是使用view.post(Runnable runnable) 并从那里设置可见性。结果对我来说很棒
        • @Andrew 我切换到 Flutter 再开心不过了,代码也干净多了
        • 是的,这将是我永远的最后一个 android 项目。之后,我将切换到 iOS 或完全停止编写应用程序。这太可怕了。
        • @Andrew Adob​​e XD 有一个导出到 Flutter 的功能,检查一下...可能会让你的生活更轻松
        【解决方案10】:

        到目前为止,答案对我没有帮助,因为我在 textView 下方有一个按钮和一个 textInput 字段(并排),它们一直被键盘隐藏,但这解决了我的问题:

        android:windowSoftInputMode="adjustResize"
        

        【讨论】:

          【解决方案11】:

          对于 xamarin 用户,将此代码添加到 MainActivity 类的 Activity 属性中,

          WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing
          

          或者您可以将此代码Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing) 添加到 MainActivity 类的 OnCreate 方法中。

          【讨论】:

            【解决方案12】:

            这对我来说是最好的

            android:windowSoftInputMode="adjustNothing"
            

            试试吧!

            【讨论】:

              【解决方案13】:

              将以下代码添加到清单文件的“活动”中。

              android:windowSoftInputMode="adjustResize"
              

              【讨论】:

              • 这很好用。但是,仅作为建议,当您使用百分比时它效果不佳。因为它重新调整了一些元素。所以,如果你有带百分比的约束元素,你就会遇到问题。改用 wrap_content 效果会很好。
              【解决方案14】:
              android:windowSoftInputMode="stateHidden|adjustNothing"
              

              此代码有效。

              【讨论】:

              • 我认为 android:windowSoftInputMode="stateHidden|adjustPan" 也应该可以工作。
              【解决方案15】:

              好吧,我已经看过这些答案,但在我的情况下,我陷入了同样的问题,并通过一个非常方便和最简单的解决方案获得了庇护,该解决方案涉及在驻留在 xml 文件中的 Scrollview 标记中放置一个非常小的无辜属性。那是

              android:isScrollContainer="false"
              

              祝你好运!

              【讨论】:

                【解决方案16】:
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
                

                这个对我有用。

                【讨论】:

                  【解决方案17】:

                  尝试使用这个:

                  android:windowSoftInputMode="stateHidden|adjustPan"
                  

                  【讨论】:

                    【解决方案18】:

                    对于滚动视图:

                    如果在您的 Android Manifest 中添加 android:windowSoftInputMode="stateHidden|adjustPan" 后仍然无法正常工作。

                    它可能会受到影响,因为当键盘出现时,它将进入滚动视图,如果您的按钮/任何对象不在您的滚动视图中,那么这些对象将跟随键盘并移动其位置。

                    检查您的按钮所在的 xml,并确保它在您的滚动视图支架下,而不是超出它。

                    希望这会有所帮助。 :D

                    【讨论】:

                      【解决方案19】:

                      在我的情况下,我需要键盘保持隐藏状态,并且在单击按钮后我的布局需要调整,所以我只是在清单中添加了这个命令,它非常正确。

                      android:windowSoftInputMode="stateHidden|adjustResize"
                      

                      【讨论】:

                        【解决方案20】:

                        当你想在打开键盘时隐藏视图。

                        将此添加到清单文件中的 Activity 中

                        android:windowSoftInputMode="stateHidden|adjustPan"
                        

                        【讨论】:

                          【解决方案21】:

                          它们都不适合我,试试这个

                           private void scrollingWhileKeyboard() {
                              drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                                  @Override
                                  public void onGlobalLayout() {
                          
                                      Rect r = new Rect();
                                      try {
                                          drawerlayout.getWindowVisibleDisplayFrame(r);
                                          int screenHeight = drawerlayout.getRootView().getHeight();
                                          int keypadHeight = screenHeight - r.bottom;
                                          if (keypadHeight > screenHeight * 0.15) {
                                              tabLayout.setVisibility(View.GONE);
                                          } else {
                                              tabLayout.setVisibility(View.VISIBLE);
                                          }
                                      } catch (NullPointerException e) {
                          
                                      }
                                  }
                              });
                          
                          }
                          

                          【讨论】:

                            【解决方案22】:

                            我已经通过添加解决了我的问题

                             android:windowSoftInputMode="adjustNothing" 
                            

                            在清单文件中添加。

                            并使 Recyclerviews 约束 isScrollContainer 为 false 。

                            android:isScrollContainer="false"
                            

                            【讨论】:

                              【解决方案23】:

                              Activity 的主窗口不会调整大小来为软键盘腾出空间。相反,窗口的内容将自动平移,这样当前的焦点就不会被键盘遮挡,用户可以随时看到他们正在输入的内容。

                              android:windowSoftInputMode="adjustPan"
                              

                              这可能是您想要的更好的解决方案。

                              【讨论】:

                                【解决方案24】:

                                此代码可能会对您有所帮助。在您的 oncreate 方法中使用它。

                                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
                                

                                【讨论】:

                                • 我试过这个,但我遇到了视图切断了视图底部的一部分并推动视图覆盖上面时间的问题?关于布局更改或需要什么的任何想法? stackoverflow.com/questions/39909897/…
                                【解决方案25】:

                                在清单文件中包含要显示的活动。但请确保不要使用全屏活动

                                android:windowSoftInputMode="adjustPan"
                                

                                【讨论】:

                                  【解决方案26】:

                                  @manifest 在你的活动中:

                                  android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
                                  

                                  【讨论】:

                                    【解决方案27】:

                                    我为这个问题苦苦挣扎了一段时间。一些解决方案有效,但是我的一些观点仍然被推高,而另一些则没有......所以它并没有完全解决我的问题。最后,工作是在我的清单中添加以下代码行...

                                    android:windowSoftInputMode="stateHidden|adjustPan|adjustResize"
                                    

                                    祝你好运

                                    【讨论】:

                                      【解决方案28】:

                                      有两种方法可以解决这个问题。 转到 AndroidManifist.xml,并以您的活动名称添加此行

                                         android:windowSoftInputMode="adjustPan"
                                      

                                      在下面的代码中,我已经添加到了Register Activity中。

                                       <activity android:name=".Register"
                                                  android:windowSoftInputMode="adjustPan">
                                      

                                      在第二种方法中,转到您的活动,并在您的 onCreate 方法中添加此代码。

                                      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2013-03-26
                                        • 2021-03-22
                                        • 1970-01-01
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多