如何防止底部导航栏在键盘显示时被顶上去。

39

如何创建一个粘性页脚,当软键盘弹出时不会随着视图被向上移动?

下面是我的当前设置和我想要实现的示例图像。我有一个包含页面内容的滚动视图和一个与父元素底部对齐的线性布局,作为导航栏。

Example of what i want it to do

问题是当弹出键盘时,它会将整个视图向上推,包括底部导航栏。我不想禁用通过设置 android:windowSoftInputMode="adjustPan"来自动推送视图的功能,而是希望排除单个元素不被推上去,也就是我的底部导航栏。

我已经测试了 windowSoftInputMode 的解决方案,但它会隐藏我的页面内容。是否有一种方法可以继续推动滚动视图而不是底部导航栏?我的另一个选择是在键盘弹起时设置 visibility: gone,然后在键盘关闭时重新显示它,但是这似乎过于复杂,而且从我所读到的并不总是可靠。

如果有人有任何示例或建议,我都听取。谢谢。


我很晚才回答,但我已经发布了一个答案,所以任何遇到这个问题的人,请仔细阅读我的答案,它可能会节省您的时间和精力。 - gprathour
6个回答

24

要么将此添加为滚动条的XML属性

android:isScrollContainer =“false”

要么将其添加到Manifest中的Activity标签中

android:windowSoftInputMode =“adjustPan”


你应该使用注释而不是在你的答案中提问。 - Vucko
在我的情况下,清单文件中的android:windowSoftInputMode="adjustPan"起到了作用。 - Doilio Matsinhe

11

我尝试了很多在SO上找到的解决方案,只有将android:windowSoftInputMode = "adjustNothing"添加到活动清单中对我起作用:

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="adjustNothing">

我包含相关的布局,因为您的解决方案高度依赖于您的布局,所以该解决方案对我在这种情况下有效:

  <RelativeLayout
     ...
        <android.support.v4.widget.NestedScrollView
           ...
        </android.support.v4.widget.NestedScrollView>
        <android.support.design.widget.BottomNavigationView
             ...
            design:menu="@menu/navigation"/>
    </RelativeLayout>

3
我遇到了与原帖作者相同的问题,虽然 android:windowSoftInputMode="adjustNothing" 可以让键盘覆盖在页脚上(页脚停留在屏幕底部),但 ScrollView 不会上推并且失去了滚动功能,这就意味着它的末尾部分位于键盘后面且无法访问。 - Neph
好观点@Neph - 我也发现解决方案高度依赖于您的整个视图层次结构,一个实例中有效的解决方案在另一个实例中可能会产生不良后果。 - saswanb
你很棒!帮了大忙。 - Mayura Devani

5

只需在onCreate中添加此行代码,即可设置窗口不会因为显示输入法而调整大小:

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

1
在您的活动的onCreate方法中执行此操作。然后,它将适用于该活动中的所有片段。 - timeSmith

3
我很晚才回答,但最近遇到了同样的情况。我采用了另一种方法来解决这个问题,而不是使用RelativeLayout或LinearLayout,而是使用CoordinatorLayout,并将行为应用于BottomNavigtaionView,以便在向上或向下滚动时显示/隐藏它(就像我们看到的CollapsingToolBar或AppBarLayout)。
BottomNavigationView中使用的内置行为是app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
你可以从我的另一个答案这里中详细阅读所有步骤。
附言:我将其发布为答案而不是评论,因为有时我们只寻找答案并忽略评论,我认为这可能是解决此问题的好方法,因此您不应忽略它,至少应该读一次。谢谢。

1
我遇到了一个非常相似的问题,区别在于a) 我一开始没有使用ScrollView,b) 我不想移动的项目是一个简单的TextView。
这是我找到的答案: click 我做的修复方法:
  • 使用adjustResize
  • 使用4个布局:一个周围的布局,1个用于标题,ScrollView和1个用于“底部导航栏”
  • 不要仅依赖于android:layout_alignParentBottom="true",虽然这会将导航栏移动到屏幕底部,但也意味着键盘可以通过“adjustResize”将其向上移动
  • 此外,结合使用android:layout_height="wrap_content"android:layout_below="@id/MyScrollView"(这样布局将利用ScrollView和屏幕底部之间的所有可用空间)以及android:gravity="bottom",可以使所有内容都位于布局底部。
  • 您还可以尝试使用android:layout_height="match_parent"而不是android:layout_alignParentBottom="true"android:layout_height="wrap_content",但我没有完全测试过。
  • 就像我说的那样,这将使“底部导航栏”布局利用ScrollView下方的所有可用空间。如果您不想这样做,例如因为您的“底部导航栏”具有不同的颜色,您不希望显示太多,请尝试创建一个包含“底部导航栏”的周围RelativeLayout和另一个空布局,该布局可以将“底部导航栏”向下推。 ;)

0
这对我有用(android:windowSoftInputMode="adjustResize")
<application
    ...
    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:exported="false" />
    ...
</application>

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