Android:如何防止软键盘将视图向上推?


385

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

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


1
嗨,我在清单文件中使用了哪个标志时遇到了同样的问题,请您帮我解决一下
Nixit Patel 2012年

1
这个问题是在这里重复:stackoverflow.com/questions/5516216/...
创造奇迹的

Answers:


654

您只需将活动的切换windowSoftInputMode标志adjustPanAndroidMainfest.xml您的活动标签内的文件。

查看官方文档以获取更多信息。

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

43
我不想平移视图,我希望它在原处保持静态,只是让键盘遮盖住要遮盖的一切。
Christopher Perry

5
通过平移,这意味着该视图将被滚动以使您正在键入的视图可见。换句话说,如果刚出现的键盘没有掩盖聚焦视图,它将保持静态。
亚历山大·奥利尼科夫

18
我正面临着同样的问题。在清单文件中将windowSoftInputMode标志设置为“ adjustPan”。但不起作用。如何解决
2011年

20
在屏幕底部有一行按钮而在屏幕上方有ScrollView的情况下,这无济于事。无论windowSoftInputMode中的值是多少,按钮都会被上推。
Artem Russakovskii 2011年

3
不能零碎工作。怎么做?
Prashanth Debbadwar '16

175

没有答案对我有用,但这确实成功了:

android:windowSoftInputMode="adjustNothing"

6
这使键盘看起来像覆盖内容,而无需进行布局来重新计算其高度。
2014年

13
这解决了键盘推高内容的问题,尽管这是我和OP想要实现的目标。
Daniel Douglas

8
您可以从@Dom借用getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);以编程方式设置此值
Bron Davies

1
这其中确实为我工作,不像其他答案(果冻豆4.1)
Virus721

完善!就我而言,它也起作用。我正在显示一个对话框,里面有一个edittext。对话框打开后,键盘也会出现。我已经尝试过“ adjustPan”,但是它阻止了键盘的出现功能。因此,在我的情况下,“ adjustNothing”效果更好。
sembozdemir

85

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

我能避免我的按钮的底行得到通过设置由软键盘推android:isScrollContainer="false"ScrollView,上面的按钮旁边。


2
但是在这种情况下,软键盘覆盖了屏幕的一部分,无法向下滚动。似乎只有一种方法可以防止底部面板显示在键盘顶部-在键盘打开时将其隐藏起来...
Dmitry

1
就是这个!我认为此设置非常有趣,因为这是我发现达到“ adjustNothing”缺失属性效果的唯一方法!
rupps

我的TextView工作的伟大TNX使用它
苏尼尔·乔杜里

2
@Artem Russakovskii我不知道您是谁,但我爱您提供此解决方案。非常感谢。
列夫

1
@Artem Russakovskii,这非常好用。非常感谢。
SkypeDogg

72

您可以尝试通过在onCreate活动方法中放置以下代码来动态添加此属性:

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

这对我有用,但是:

android:windowSoftInputMode="adjustPan"

没有。


您是否android:windowSoftInputMode="adjustPan"在AndroidManifest.xml中添加了?
Habeeb Perwad 2014年

不,因为它对我没有任何影响。第一行代码完成了这项工作。:) @HabeebPerwad
Dom

我在AndoidManifest.xml文件中添加了秒行。我认为那之后才奏效。所以问。
Habeeb Perwad 2014年

1
@Dom,如何getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);在片段中使用“ ”?
Tushar Gogna 2014年

1
最后!这可行!我有一个控制器(从扩展FragmentActivity),并附加了一些视图(视图从扩展RelativeLayout)。因此,在麻烦的观点中,我确实controller.getWindow()...如您所说。作品
Alaa M.

39

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

android:windowSoftInputMode="adjustResize"

这就像一个魅力,现在我的应用程序的标题不会消失。它更平滑。


这对我来说几乎完美。唯一的问题是键盘的建议栏/行仍然隐藏了我的布局。你有遇到这样的问题吗?
苏菲安

我还没有遇到这个问题。@Sufian
amalBit

那时我还没有遇到任何问题。现在我不确定。@Sufian
amalBit

对于那些可能面临类似问题的人,这可能是由于TabLayout。一旦我将可见性设置为,问题就消失了View.GONE。现在可能是重新设计布局的时候了。
Sufian

13

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

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

放在onResume()


11

对于未来的读者。

我希望对此问题进行特定控制,所以我做了以下操作:

在片段或活动中,隐藏其他视图(键盘弹起时不需要),然后还原它们以解决此问题:

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

                    }
                }
            });

1
@天网你是绝对正确的!这是我用于自己的问题的自定义解决方案。
Petro 2016年

7
嘿,这真是太好了。但是,在键盘关闭的情况下,视图会在很短的时间内(毫秒)切换到可见状态。因此,我没有直接设置可见性,而是view.post(Runnable runnable)从那里使用并设置了可见性。事实证明对我来说很棒
daisura99

9

只需添加一行...

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

我刚刚解决了:) :)


8

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

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

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



7

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

android:windowSoftInputMode="adjustResize"

7

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

android:windowSoftInputMode="adjustResize"

这很好。但是,仅建议一下,当您使用百分比时效果并不理想。因为它重新调整了一些元素。因此,如果您具有约束元素的百分比,您将有问题。请改用wrap_content,它会很好地工作。
Thiago Silva



4

好吧,我已经看过这些答案了,但就我而言,我遇到了同样的问题,并通过一个非常方便,最简单的解决方案避难了,该解决方案涉及将一个很小的无辜属性放入xml文件中的Scrollview标记中。那是

android:isScrollContainer="false"

祝好运!


4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

这个正在为我工​​作。


2

对于滚动视图:

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

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

检查您的按钮所在的xml,并确保它位于滚动视图括号内,而不是超出它。

希望这会有所帮助。:D


2

在我的情况下,我需要使键盘保持隐藏状态,并且在单击按钮后就需要调整布局,因此我只在清单中添加了此命令,它就变得非常正确。

android:windowSoftInputMode="stateHidden|adjustResize"

2

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

将此添加到清单文件中的“活动”中

android:windowSoftInputMode="stateHidden|adjustPan"

2

他们都没有为我工作,试试这个

 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) {

            }
        }
    });

}

1

活动的主窗口不会调整大小以为软键盘腾出空间。而是,窗口的内容将自动平移,以使当前焦点不会被键盘遮挡,并且用户始终可以看到他们在键入什么。

android:windowSoftInputMode="adjustPan"

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



1

此代码可以为您提供帮助。在您的oncreate方法中使用它。

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

我尝试了这个,但是我遇到了一个问题,即视图将视图的底部切掉了一部分,并迫使视图覆盖上面的时间?关于什么布局更改或需要什么的任何想法?stackoverflow.com/questions/39909897/...
Lion789

1

将清单文件包含在要显示的活动下,但请确保不要使用“全屏活动”

android:windowSoftInputMode="adjustPan"


1

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

 android:windowSoftInputMode="adjustNothing" 

在清单文件中添加。

并使Recyclerviews约束isScrollContainer为false。

android:isScrollContainer="false"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.