点击编辑文本时推送内容

60
我已经到处寻找解决我的问题的方法,但是找不到答案。这是问题所在。
我有一个布局看起来像这样。

Image is here

现在,当我点击编辑文本(搜索栏)时,我希望发生以下情况。

Image is here

软键盘基本上需要将整个屏幕的内容向上推,以便搜索栏位于顶部,其列表视图位于其下方,以便在搜索内容时显示结果。我尝试在清单中将android:windowSoftInputMode="adjustPan"设置为Activity,但这没有起作用。我在主布局中的主容器中设置了一个滚动视图,其中包含了片段,但这也没有起作用。我尝试将编辑文本(搜索栏)添加到列表视图中作为标题,但这也没有起作用。每次键盘都会将编辑文本推上去,但遮住了列表视图。有没有办法让它工作?

我有同样的问题,你找到解决方案了吗? - Nikhil
11个回答

76

实际上,如果您想使整个布局向上滑动,则应使用:

SOFT_INPUT_ADJUST_PAN

含义:

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

这将保持键盘关闭,当打开时,它会将整个活动向上推。


但是在编辑框中输入第一个字符时,布局会向上推。 - Nivedh
5
adjustpan 目前工作正常,但同时我也希望我的底部按钮能够放在键盘上方(这可以通过使用 adjustResize 实现),但这样做会导致整个布局不向上推动,最终导致输入数据的文本框被隐藏。有人能帮忙吗? - driftking9987
我正在寻找相同的DriftKing。 - filthy_wizard
相似的问题。我有一个EditText,在其下面有单选按钮以选择表情符号键盘或常规软输入键盘。在某些活动中,仅当选择EditText时,才会将EditText向上推。这会隐藏在其下面的按钮。 - filthy_wizard
我发现如果我从我的oncreate方法中删除这行代码Window.SetSoftInputMode(SoftInput.StateAlwaysHidden);,那么edittext将始终带着其页脚向上推。顺便说一下,我正在使用Xamarin。 - filthy_wizard
但是我应该在哪里编写这段代码呢?我的意思是在onCreate方法中吗? - Akshay Kumar

20

这可以在Fragment类中使用,将编辑文本移到上面并滚动到底部。

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

如果你的片段活动主题不是全屏,那么这肯定会起作用。

希望这可以帮到你!


这个程序运行得很好,但是当在编辑框中输入第一个字符时,布局会向上推。如何解决?如果您知道,请告诉我。 - siva
@siva 我也遇到了同样的问题。 - Nivedh
工作了!非常感谢。 - Vivek Kumar

11

我曾遇到过类似的问题,解决方法很简单。

如果在活动中的主题设置为全屏@android:style/Theme.Holo.NoActionBar.FullScreen,那么键盘就不会将内容向上推。

当我把活动更改为@android:style/Theme.Holo.NoActionBar后,键盘现在可以将活动内容向上推。


谢谢你,伙计!但是你知道怎么将它设置为全屏吗? - Ahmet K
我也想要全屏,甚至活动内容也不应该上移。有什么解决方案吗? - Nikita

11

这对我有用。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

10

试一下

android:windowSoftInputMode="adjustResize"

为我工作。


8
在您的清单文件中尝试android:windowSoftInputMode="adjustResize"。您可能需要执行android:windowSoftInputMode="adjustResize|adjustPan"…我没有任何与您相似的设置来测试...您的问题是由于此引起的(来自adjustPan文档,重点是我的):该活动的主窗口未调整大小以为软键盘腾出空间。相反,窗口的内容会自动平移,以便当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在输入的内容。鉴于此,您的列表因EditText位于顶部而被遮挡。 我目前唯一能想到的是将EditText移动到列表下方。然后在向上推送时,您的列表仍应在EditText上方可见。

谢谢回复。我已经尝试过了,但不起作用。重新调整大小可以工作,但会导致内容在屏幕顶部被挤压,这看起来非常糟糕,而且使用adjustResize时无法显示listview内容。 - the-ginger-geek
更新了我的回答,虽然不是真正的解决方案,但可能是一个可行的解决方法。 - Barak
嗨,Barak,我尝试将EditText移动到列表视图下方,但这并没有起作用。我也认为它应该可以,但它只是将EditText推到了列表视图上方,并隐藏了列表视图的所有内容。 - the-ginger-geek

4

对于片段,这对我有用,只需在清单中声明它与活动一起使用:

android:windowSoftInputMode="adjustPan"

Good Luck!


我有几个ScrollView和相对布局,其中包含我的EditText视图的ScrollView。这绝对有效。我以为我需要把它放在每个edittext中,结果这么简单,呵呵。♥ - iamjoshua

3

我找不到自动更改布局的解决方案,所以我只能使用hack方法。我在我的主活动中使用了我在这里找到的代码来检测键盘何时打开。我只是添加了一些代码来调用一个方法,在打开键盘时隐藏我的前两个片段。这并不是我想要做的事情,但它起作用了。


1
我在我的EditText登录中使用了以下代码:

EditText

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

关于这种方法的一些注意事项:

this 是指上下文,因为 getActivity() 并不总是首选。

.SOFT_INPUT_STATE_HIDDEN  //for default hidden state when activity loads

.SOFT_INPUT_STATE_VISIBLE //for auto open keyboard when activity loads 

每次都有效!


1

如果任何人仍然面临此问题:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/view"
    android:fitsSystemWindows="true"
    android:layout_height="match_parent">

在你的布局中添加:

android:fitsSystemWindows="true"

我希望这能解决你的问题 - 对我很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接