底部软NavigationBar与我的ListView重叠

时间:2014-12-31 15:52:05

标签: android listview android-listview navigationbar

我在Nexus 5(Android 5)上运行了我的应用程序,但是我遇到了底部的软NavigationBar与ListView的最后一项重叠的问题。我已经尝试将fitsSystemWindows添加到我的样式和ListView中但是没有用。

我的布局的XML:     

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@color/sf4l"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ListView android:id="@id/android:list"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:background="@color/sf4l" />
</LinearLayout>

5 个答案:

答案 0 :(得分:43)

将它添加到values-v21目录中的themes.xml:

<item name="android:windowDrawsSystemBarBackgrounds">false</item>

示例(我正在使用AppCompat for actionbars):

<style name="Theme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="homeAsUpIndicator">@drawable/new_indicator</item>
    <item name="android:homeAsUpIndicator">@drawable/new_indicator</item>
    <item name="actionModeBackground">@android:color/black</item>
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

答案 1 :(得分:2)

这是因为listView的高度等于全屏高度,但是操作栏将布局推低几个像素,导致布局重叠导航按钮。

如果您在操作栏下有全屏碎片容器,也会发生这种情况。

修复此问题是测量屏幕和操作栏的高度,然后将父视图的高度设置为它的差异。例如:

@Override
public void onWindowFocusChanged (boolean hasFocus) {
    LinearLayout lMain = (LinearLayout) findViewById(R.id.lMain);
    lMain.getLayoutParams().height = lMain.getHeight() - getNavigationBarHeight();
}
  • 必须在绘制/渲染布局后执行此操作。在onCreate或onResume上为时尚早。在onWindowFocusChanged()中这样做可能有点过头但是有效。

答案 2 :(得分:2)

我在这篇文章中尝试了接受的答案,就像许多它对我没有用。

然而,以下工作人员对我而言。

  <item name="android:windowTranslucentNavigation">false</item>

我放置了样式-21.xml

使软导航栏具有稳定的背景,现在可以正确地呈现组件。

答案 3 :(得分:1)

从API-15开始,此答案有点与其他答案和我的尝试相结合。

对于API-21 +

styles.xml(v21)中,在活动的样式下方添加

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
     ....
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>

对于API-19 +

styles.xml(v19)中,在活动的样式下方添加

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
     ....
    <item name="android:windowTranslucentNavigation">false</item>
</style>

对于API-15 +

在下面的活动中覆盖

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    // return for API-19+
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        return;

    // Customize Activity to not overlap with the bottom software buttons
    // navigation bar (back, home, & menu)
    boolean hasMenuKey = ViewConfiguration.get(this).hasPermanentMenuKey();
    boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);

    if (!hasMenuKey && !hasBackKey) { // check if this device has a bottom navigation bar
        ConstraintLayout rootLayout = findViewById(R.id.activity_root); // my activity root layout
        int NAVIGATION_BAR_HEIGHT = 70;
        rootLayout.getLayoutParams().height = rootLayout.getHeight() - NAVIGATION_BAR_HEIGHT;
    }
}

答案 4 :(得分:0)

非常容易的解决方案。只需使用 ConstraintLayout 将顶视图的底边与底视图的顶边对齐。

示例如下:-

xml:-

    <android.support.constraint.ConstraintLayout 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"
tools:context=".MainActivity">

<ListView
    android:id="@+id/list_item"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:divider="@color/black"
    android:dividerHeight="2dp"
    app:layout_constraintBottom_toTopOf="@+id/navigation"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="1.0"
    app:layout_constraintHorizontal_bias="1.0"></ListView>

<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_marginStart="0dp"
    android:background="?android:attr/windowBackground"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/navigation" />
    </android.support.constraint.ConstraintLayout>

输出设计:-

enter image description here