【问题标题】:How to keep a bottom nav bar from being pushed up on keyboard shown如何防止底部导航栏在显示的键盘上被向上推
【发布时间】:2016-07-14 23:11:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

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

标签: android android-softkeyboard


【解决方案1】:

或者添加这个作为滚动条的 XML 属性

android:isScrollContainer="false"

或者在 Manifest 的 Activity 的标签中添加这个

android:windowSoftInputMode="adjustPan"

【讨论】:

  • 您可能应该使用 cmets 而不是在回答中提问。
  • android:windowSoftInputMode="adjustPan" 清单上适用于我的案例
【解决方案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>

【讨论】:

  • 我遇到了与 OP 相同的问题,而 android:windowSoftInputMode="adjustNothing" 使键盘覆盖页脚(位于屏幕底部),但 ScrollView 不会被向上推并丢失它的滚动能力,这意味着它的最后一部分在键盘后面并且无法访问。
  • 好点@Neph - 我还发现解决方案高度依赖于您的整个视图层次结构,并且在一个实例中有效的方法在另一个实例中会产生不良后果。
  • 你太棒了!帮助了这个
【解决方案3】:

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

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

【讨论】:

  • 在活动的 onCreate 方法中执行此操作。然后它将应用于该活动中的所有片段。
【解决方案4】:

我很晚才回答,但我最近遇到了同样的情况。我采用了另一种方法来解决这个问题,而不是使用RelativeLayoutLinearLayout,而是使用CoordinatorLayout 并将行为应用于BottomNavigtaionView 以通过滚动到顶部或底部来显示/隐藏它(与我们相同的方式请参阅 CollapsingToolBar 或 AppBarLayout)。

BottomNavigationView 使用的内置行为是app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"

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

附:我将其发布为答案而不是评论,因为有时我们只是寻找答案而忽略了 cmets,我相信这可能是解决此问题的好方法,因此您不应忽略它并阅读一次。谢谢。

【讨论】:

    【解决方案5】:

    我遇到了一个非常相似的问题,不同之处在于:a)我一开始没有使用 ScrollView,b)我不想移动的项目是一个简单的 TextView。

    这是我找到的答案:click

    我做了什么来解决它:

    • 使用adjustResize
    • 使用 4 种布局:一个围绕一个,1 个用于标题,滚动视图和 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,并在内部创建另一个可以将“底部导航”向下推的空布局。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 2022-09-22
      • 1970-01-01
      相关资源
      最近更新 更多