解决方案(或另一种方法)
我经历过与OP所说的完全相同的情况,我BottomNavigationView
显然在屏幕底部有一个,在屏幕上方有一个ScrollView
。
现在,如果我们adjustPan
在活动中进行,那么BottomNavigationView
当键盘出现但滚动不起作用时,它会保持在底部。
如果我们这样做了,adjustResize
那么滚动就可以了,但是 BottomNavigationView 会被推到键盘上。
我认为下面可以是相同的两种方法。
方法一
只需在键盘显示/隐藏上将可见性设置为消失/可见。这是相同的快速解决方法。您可以在下一个方法中获取键盘隐藏/显示事件的侦听器。
为了让它看起来有趣,您可以尝试使用某种动画来显示/隐藏 BottomNavigationView。
方法二
一些更好的方法(材料设计方法)将是使用CoordinatorLayout
和滚动行为(与您可能已经看到的相同CollapsingToolBar
)。
下面是布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/title"
app:titleTextColor="@android:color/white" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
------ Your Contents --------
</android.support.v4.widget.NestedScrollView>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?android:attr/windowBackground"
app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"
app:menu="@menu/navigation" />
</android.support.design.widget.CoordinatorLayout>
就是这样,现在您可以看到 BottomNavigationView 在滚动到底部和顶部等时隐藏/显示。但是在一种情况下,您可能会遇到另一个问题,即当键盘被隐藏时,如果内容太小而无法滚动,
问题是,当键盘打开并且您滚动到隐藏BottomNavigationView的底部时,现在如果您按下后退按钮键盘隐藏但BottomNavigationView仍然隐藏。现在,由于内容不可滚动,因此如果您尝试滚动,它不会显示 BottomNavigationView。要再次显示它,您需要做的是,再次使键盘可见,然后向上滚动,当显示 BottomNavigationView 时,然后按返回按钮。
我试图以这种方式解决这个问题,
添加全局侦听器以查看键盘是显示还是隐藏。我在这里使用的代码是(它在 Kotlin 中,但是如果需要,您可以轻松地将其转换为 Java 版本)
private fun addKeyboardDetectListener(){
val topView = window.decorView.findViewById<View>(android.R.id.content)
topView.viewTreeObserver.addOnGlobalLayoutListener {
val heightDifference = topView.rootView.height - topView.height
if(heightDifference > dpToPx(this, 200F)){
// keyboard shown
Log.d(TAG, "keyboard shown")
} else {
// keyboard hidden
Log.d(TAG, "keyboard hidden")
val behavior = (navigation.layoutParams as CoordinatorLayout.LayoutParams).behavior as HideBottomViewOnScrollBehavior
behavior.slideUp(navigation)
}
}
}
fun dpToPx(context: Context, valueInDp: Float) : Float{
val displayMetrics = context.resources.displayMetrics
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, displayMetrics)
}
最后一件事,如果您使用支持库版本 28.0.0,那么您将看到该 behavior.slideUp(navigation)
方法受到保护,因此您不能从您的活动等中调用它。
然而,谷歌的 Android 团队已经在新的material-components
. 选中此项,只需在您的项目中导入材料组件并改用此类。
除此之外,您还可以尝试更多实验,例如在键盘隐藏/显示上以编程方式调用 slideUp 或 slideDown 等。
PS我花了很多时间来了解这种完全有效的方法,所以想在这里分享它,这样可以节省别人的时间。