Android Studio "Bottom Navigation Activity" 模板在顶部留有空白区域
Android Studio "Bottom Navigation Activity" template leaves blank area on the top
我通过选择“底部导航 Activity”创建了新的 Android 项目。没有其他变化。只修改
“fragment_notifications.xml”通过添加背景属性将背景设置为黑色。
我的问题是:
- a) 为什么黑色的片段不是紧挨着蓝色开始的
标题区域,但在顶部留出 1~2 厘米的空白?目的何在
模板中的这个区域?我不认为我很“幸运”找到
像这样明显的错误。
- b) 如何消除空白区域。我尝试修改
“activity_main.xml”和“fragment_notifications.xml”调整
width/height 和约束属性,但其中 none 有效。
提前感谢您抽出时间。
我使用的是Android Studio 4.1.1 和运行 AVD Nexus 6 API 26 上的代码,下面是相关文件的源代码。除通知片段背景外,均由 Android Studio 生成。
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu" />
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>
mobile_navigation.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/mobile_navigation"
app:startDestination="@+id/navigation_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.guo.butnavtest.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/navigation_dashboard"
android:name="com.guo.butnavtest.ui.dashboard.DashboardFragment"
android:label="@string/title_dashboard"
tools:layout="@layout/fragment_dashboard" />
<fragment
android:id="@+id/navigation_notifications"
android:name="com.guo.butnavtest.ui.notifications.NotificationsFragment"
android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications" />
fragment_notifications.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".ui.notifications.NotificationsFragment">
<TextView
android:id="@+id/text_notifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
}
}
Why the fragment in black doesn't start right next to the blue title area
原因:activity_main.xml
根布局 (ConstraintLayout
) 有一个 paddingTop
属性添加了这个顶部空白 space 等于 ActionBar
android:paddingTop="?attr/actionBarSize"
ActionBar
尺寸的高度等于56dp
<dimen name="abc_action_bar_default_height_material">56dp</dimen>
How to eliminate the blank area.
摆脱它。
更新:
a) What's the potential use of this padding, why the template leaves this padding? Never see an App with action bar under title bar
根据您的设计,这可能有 opinion-based 个答案,但是 generally-speaking,您可以将其视为子标题的 space .. 或者可能是因为 ActionBar
可以容纳一个有限宽度的标题。here 您可以找到几个设计指南及其用途。
b)The constraint layout is the root node of this UI. But why the paddingTop isn't above the title area?
那是因为根布局尺寸是从defaultActionBar
底部开始的styles.xml
...可以验证当你在根布局的最顶部添加一个 View
时,..这个视图将直接布局在 ActionBar
下面而不是在它后面。
尝试更改 textview
颜色
<TextView
android:id="@+id/text_notifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@color/black"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
如果你想得到actionBar
的面积而不是写
getActivity().getSupportActionBar().hide();
我通过选择“底部导航 Activity”创建了新的 Android 项目。没有其他变化。只修改 “fragment_notifications.xml”通过添加背景属性将背景设置为黑色。
我的问题是:
- a) 为什么黑色的片段不是紧挨着蓝色开始的 标题区域,但在顶部留出 1~2 厘米的空白?目的何在 模板中的这个区域?我不认为我很“幸运”找到 像这样明显的错误。
- b) 如何消除空白区域。我尝试修改 “activity_main.xml”和“fragment_notifications.xml”调整 width/height 和约束属性,但其中 none 有效。
提前感谢您抽出时间。
我使用的是Android Studio 4.1.1 和运行 AVD Nexus 6 API 26 上的代码,下面是相关文件的源代码。除通知片段背景外,均由 Android Studio 生成。
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="?attr/actionBarSize">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu" />
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/nav_view"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>
mobile_navigation.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/mobile_navigation"
app:startDestination="@+id/navigation_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.guo.butnavtest.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/navigation_dashboard"
android:name="com.guo.butnavtest.ui.dashboard.DashboardFragment"
android:label="@string/title_dashboard"
tools:layout="@layout/fragment_dashboard" />
<fragment
android:id="@+id/navigation_notifications"
android:name="com.guo.butnavtest.ui.notifications.NotificationsFragment"
android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications" />
fragment_notifications.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".ui.notifications.NotificationsFragment">
<TextView
android:id="@+id/text_notifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
}
}
Why the fragment in black doesn't start right next to the blue title area
原因:activity_main.xml
根布局 (ConstraintLayout
) 有一个 paddingTop
属性添加了这个顶部空白 space 等于 ActionBar
android:paddingTop="?attr/actionBarSize"
ActionBar
尺寸的高度等于56dp
<dimen name="abc_action_bar_default_height_material">56dp</dimen>
How to eliminate the blank area.
摆脱它。
更新:
a) What's the potential use of this padding, why the template leaves this padding? Never see an App with action bar under title bar
根据您的设计,这可能有 opinion-based 个答案,但是 generally-speaking,您可以将其视为子标题的 space .. 或者可能是因为 ActionBar
可以容纳一个有限宽度的标题。here 您可以找到几个设计指南及其用途。
b)The constraint layout is the root node of this UI. But why the paddingTop isn't above the title area?
那是因为根布局尺寸是从defaultActionBar
底部开始的styles.xml
...可以验证当你在根布局的最顶部添加一个 View
时,..这个视图将直接布局在 ActionBar
下面而不是在它后面。
尝试更改 textview
颜色
<TextView
android:id="@+id/text_notifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@color/black"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
如果你想得到actionBar
的面积而不是写
getActivity().getSupportActionBar().hide();