如何防止底部导航栏被推到显示的键盘上

时间:2016-07-14 23:11:21

标签: android android-softkeyboard

如何在软键盘弹出时创建一个不会随视图移动的粘性页脚?

下面是我当前设置的图像示例以及我想要实现的目标。 我有一个包含我的页面内容的scrollview和一个与作为导航栏的父底部对齐的linearlayout。

Example of what i want it to do

问题是当键盘弹出时,它会推动我的整个视图,包括底部导航部分。 我不想禁用自动推送视图(通过设置android:windowSoftInputMode="adjustPan"),而是排除单个元素被推上,我的底部导航杆

我测试了windowSoftInputMode修复,但它隐藏了键盘后面的页面内容。有没有办法让它继续推高滚动视图而不是底部导航?我的另一个选择是在键盘上设置visibility:gone,然后在键盘上重新显示它,但这看起来过于复杂,并且从我阅读的内容看起来并不总是可靠。

如果有人有任何例子或建议,我会全力以赴。感谢。

5 个答案:

答案 0 :(得分:11)

将其添加为滚动条的XML属性

  

机器人:isScrollContainer ="假"

或在Manifest

中的Activity标记中添加此内容
  

机器人:windowSoftInputMode =" adjustPan"

答案 1 :(得分:2)

我在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>

答案 2 :(得分:0)

我遇到了一个非常相似的问题,不同之处在于: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,并在其中创建另一个可以向下推“底部导航”的空布局。 ;)

答案 3 :(得分:0)

只需将此行添加到onCreate中,当此选项设置时,窗口将不针对显示的输入法进行调整。 :

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

答案 4 :(得分:0)

我回答得很晚,但是最近我遇到了同样的情况。我采用了另一种方法来解决此问题,而不是使用RelativeLayoutLinearLayout,而是使用CoordinatorLayout并将行为应用于BottomNavigtaionView来显示/隐藏它,而不是使用app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"顶部或底部(与我们看到CollapsingToolBar或AppBarLayout相同的方式)。

用于BottomNavigationView的内置行为是/

您可以从我的another answer here中详细阅读所有步骤。

P.S。我将其发布为答案而不是评论,因为有时我们只是寻找答案而忽略评论,而且我认为这可能是解决此问题的一种好方法,因此您不应忽略它,并且请阅读一遍。谢谢。