为什么BottomNavigationView的位置取决于ScrollView滚动条?

时间:2017-08-30 08:30:33

标签: android android-scrollview bottomnavigationview scrollbars

嗨,我对BottomNavigationView位置行为有点困惑。

为什么启用/禁用滚动条会影响BottomNavigationView的布局和位置大小调整?

我创建了一个简单的示例项目来展示我的问题...

使用此代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="sandbox.jarda.cz.bottomnavigationtest.MainActivity">

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="none">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">

                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="test" />

            </LinearLayout>
        </ScrollView>

    </FrameLayout>

    <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:menu="@menu/navigation" />
</LinearLayout>

BottomNavigationView是否会保留在键盘下(打开时)......

<code>BottomNavigationView</code> is under the keyboard

但是:)

当我删除行/启用滚动条

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

主要布局是“调整大小”,BottomNavigationView位于键盘顶部...

<code>BottomNavigationView</code> is on the top of the keyboard

WHY吗

答案的答案:)

3 个答案:

答案 0 :(得分:3)

这不是因为滚动,这是因为你的应用程序的键盘行为

您需要在windowSoftInputMode的{​​{1}}标记中指定activity 有关manifest的更多信息,请查看此link

windowSoftInputMode

答案 1 :(得分:1)

这不是因为滚动条只是你需要在清单标签中的活动中指定windowSoftInputMode使用android:windowSoftInputMode="adjustPan|adjustResize"

<activity android:name=".MainActivity"
        android:windowSoftInputMode="adjustPan|adjustResize">
    <intent-filter>
       <action android:name="android.intent.action.MAIN" />

       <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

答案 2 :(得分:1)

原因是ScrollView。当您打开键盘时,它会使用除键盘+底部导航视图高度之外的可用空间调整自身大小。

键盘未显示时使用可用高度,不包括导航视图的高度。

为了更加清晰,实现键盘监听器并计算滚动视图的高度。您可以修改以下代码

致电代码。可以进入onCreate

container.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); // Here container is topmost LinearLayout in your layout

mOnGlobalLayoutListener将是

private ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        Rect r = new Rect();
        mActivityRootView.getWindowVisibleDisplayFrame(r);
        int screenHeight = mActivityRootView.getRootView().getHeight();
        int keyboardheight = screenHeight - r.bottom;
        /**
         *
         * We are taking 15% of the screen height as it should be sufficient space for the keyboard to determine if keyboard is open.
         */
        if (keyboardheight > screenHeight * 0.15) {
            // Keyboard showing
            // PRINT HEIGHT OF SCROLLVIEW while keyboard is showing
        } else {
            // Keyboard hidden
            // PRINT HEIGHT OF SCROLLVIEW while keyboard not showing 
        }
    }
};