我在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>
答案 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();
}
答案 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>
输出设计:-