Я переместил заголовок NavigationView из включаемого файла в содержимое NavigationView (поскольку мне нужно было получить доступ к виджетам с помощью синтетических средств), но пункты меню подпрыгнули и оказались под заголовком, как я могу это исправить? Я попытался отключить fitsSystemWindows, но это не сработало:
<?xml version = "1.0" encoding = "utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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/drawer_layout"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
tools:openDrawer = "start">
<include
layout = "@layout/app_bar_home"
android:layout_width = "match_parent"
android:layout_height = "match_parent" />
<com.google.android.material.navigation.NavigationView
android:id = "@+id/nav_view"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_gravity = "start"
android:fitsSystemWindows = "true"
app:menu = "@menu/activity_home_drawer" >
<RelativeLayout
android:layout_width = "match_parent"
android:layout_height = "@dimen/nav_header_height"
android:background = "@drawable/side_nav_bar"
android:gravity = "bottom"
android:orientation = "vertical"
android:paddingLeft = "@dimen/activity_horizontal_margin"
android:paddingTop = "@dimen/activity_vertical_margin"
android:paddingRight = "@dimen/activity_horizontal_margin"
android:paddingBottom = "@dimen/activity_vertical_margin"
android:theme = "@style/ThemeOverlay.AppCompat.Dark">
<ImageView
android:id = "@+id/profile_image"
android:visibility = "invisible"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_alignParentTop = "true"
android:layout_alignParentRight = "true"
android:contentDescription = "@string/nav_header_desc"
app:srcCompat = "@mipmap/ic_launcher_round" />
<TextView
android:id = "@+id/user_email"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_alignBottom = "@id/profile_image"
android:layout_toLeftOf = "@id/profile_image"
android:gravity = "center"
android:text = "@string/nav_header_subtitle" />
<TextView
android:id = "@+id/user_name"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_above = "@id/user_email"
android:layout_alignParentLeft = "true"
android:layout_toLeftOf = "@id/profile_image"
android:fontFamily = "@font/uifont"
android:gravity = "center"
android:paddingTop = "@dimen/nav_header_vertical_spacing"
android:text = "@string/nav_header_title"
android:textAppearance = "@style/TextAppearance.AppCompat.Body1" />
</RelativeLayout>
</com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
почему отошел от включаемого файла?
@ManoharReddy Потому что мне нужно было получить доступ к виджетам с помощью синтетических.
В этом случае может быть лучше полностью удалить вид навигации и использовать свой собственный вид.
Это мои макеты, и они отлично работают: activity_main:
<?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"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<!-- AppBarLayout should be here -->
<android.support.design.widget.AppBarLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:theme = "@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id = "@+id/toolbar"
android:layout_width = "match_parent"
android:layout_height = "?attr/actionBarSize"
android:background = "?attr/colorPrimary"
app:popupTheme = "@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<!-- add app:layout_behavior = "@string/appbar_scrolling_view_behavior" -->
<android.support.v4.widget.DrawerLayout
android:id = "@+id/drawer_layout"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
app:layout_behavior = "@string/appbar_scrolling_view_behavior"
tools:openDrawer = "start">
<include
layout = "@layout/app_bar_main"
android:layout_width = "match_parent"
android:layout_height = "match_parent" />
<android.support.design.widget.NavigationView
android:id = "@+id/nav_view"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_gravity = "start"
android:fitsSystemWindows = "true"
app:headerLayout = "@layout/nav_header_main"
app:menu = "@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
</android.support.design.widget.CoordinatorLayout>
app_bar_main.xml:
<FrameLayout
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:fitsSystemWindows = "true"
tools:context = ".activty.MainActivity">
<include layout = "@layout/content_main"/>
</FrameLayout>
Но синтетика недоступна, если я использую заголовок через включаемый файл.
Переместите свой относительный макет (дизайн заголовка) в другой файл макета: заголовок.xml
<ImageView
android:id = "@+id/profile_image"
android:visibility = "invisible"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_alignParentTop = "true"
android:layout_alignParentRight = "true"
android:contentDescription = "@string/nav_header_desc"
app:srcCompat = "@mipmap/ic_launcher_round" />
<TextView
android:id = "@+id/user_email"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_alignBottom = "@id/profile_image"
android:layout_toLeftOf = "@id/profile_image"
android:gravity = "center"
android:text = "@string/nav_header_subtitle" />
<TextView
android:id = "@+id/user_name"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_above = "@id/user_email"
android:layout_alignParentLeft = "true"
android:layout_toLeftOf = "@id/profile_image"
android:fontFamily = "@font/uifont"
android:gravity = "center"
android:paddingTop = "@dimen/nav_header_vertical_spacing"
android:text = "@string/nav_header_title"
android:textAppearance = "@style/TextAppearance.AppCompat.Body1" />
</RelativeLayout>
И на экране вашего ящика:
<androidx.drawerlayout.widget.DrawerLayout 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/drawer_layout"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
tools:openDrawer = "start">
<include
layout = "@layout/app_bar_home"
android:layout_width = "match_parent"
android:layout_height = "match_parent" />
<com.google.android.material.navigation.NavigationView
android:id = "@+id/nav_view"
android:layout_width = "wrap_content"
android:layout_height = "match_parent"
android:layout_gravity = "start"
android:fitsSystemWindows = "true"
app:headerLayout = "@layout/header"
app:menu = "@menu/activity_home_drawer" >
</com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
В вашем java-файле для доступа к представлениям заголовков, которые находятся внутри макета заголовка:
val headerView: View = nav_view.getHeaderView(0)
headerView.user_name.text = "Some Value"
Я кодирую на Kotlin, но буду использовать ваше решение, спасибо.
@AVEbrahimi Я также писал код в kotlin, где вы видели код Java?
Этот макет также включал макет ящика или нет