ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

嗨,我有同样的问题,你在清单文件中使用了哪个标志,你能帮我解决这个问题吗
此问题在此处重复:stackoverflow.com/questions/5516216/…

W
Watachiaieto

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

查看 official documentation 了解更多信息。

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

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

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

内容被粉碎在一起 内容挂在屏幕上 内容因位于键盘下方而无法访问

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


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

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

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

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

在我的例子中,按钮被推上去的原因是因为它们上方的视图是 ScrollView,并且无论我设置什么值 android:windowSoftInputMode,它都会在键盘上方被推上的按钮折叠起来。

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


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

您可以尝试动态添加此属性,方法是将以下代码放入 Activity 的 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()...。作品
a
amalBit

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

android:windowSoftInputMode="adjustResize"

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


这对我来说几乎是完美的。唯一的问题是键盘的建议栏/行仍然隐藏了我的布局。你遇到过这样的问题吗?
对于那些可能面临类似问题的人来说,这可能是由于TabLayout。一旦我将其可见性设置为 View.GONE,问题就消失了。可能是时候重新设计我的布局了。
这个可以在不与嵌套滚动视图底部的按钮重叠的情况下工作。然而,“adjustPan”与底部按钮重叠
C
ChaturaM

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

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

把它放在 onResume()


S
Suresh Pattu

这个对我有用

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

d
duggu

只需添加一行...

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

我刚刚解决了:) :)


P
Petro

对于未来的读者。

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

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

            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 Adobe XD 具有导出到 Flutter 的功能,请查看...可能会让您的生活更轻松
M
Michael McDowell

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

android:windowSoftInputMode="adjustResize"

T
Tushar patel

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

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

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


J
Jaiprakash Soni

这是最适合我的

android:windowSoftInputMode="adjustNothing"

试试看!


J
Jose Kurian

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

android:windowSoftInputMode="adjustResize"

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

此代码有效。


我认为 android:windowSoftInputMode="stateHidden|adjustPan" 也应该工作。
A
Ali Nawaz

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

android:isScrollContainer="false"

祝你好运!


Z
Zoe stands with Ukraine
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

这个对我有用。


M
MILLION GASHAW

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

 android:windowSoftInputMode="adjustNothing" 

在清单文件中添加。

并使 Recyclerviews 约束 isScrollContainer 为 false 。

android:isScrollContainer="false"

a
arghtype

尝试使用这个:

android:windowSoftInputMode="stateHidden|adjustPan"

d
duggu

对于滚动视图:

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

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

检查你的 xml 你的按钮在哪里,并确保它在你的滚动视图支架下而不是在它外面。

希望这会有所帮助。 :D


B
Bö macht Blau

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

android:windowSoftInputMode="stateHidden|adjustResize"

P
Petro

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

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

android:windowSoftInputMode="stateHidden|adjustPan"

S
Saljith Kj

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

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

            }
        }
    });

}

J
Johan Fick

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

android:windowSoftInputMode="stateHidden|adjustPan|adjustResize"

祝你好运


u
user3243900

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

android:windowSoftInputMode="adjustPan"

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


R
Radouane ROUFID

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

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

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

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

android:windowSoftInputMode="adjustPan"

J
Juan Mendez

@manifest 在您的活动中:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

R
Ramzan

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

   android:windowSoftInputMode="adjustPan"

如以下代码所示,我已添加到注册活动中。

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

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

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