Меню находится под заголовком в NavigationView

Я переместил заголовок 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>

Меню находится под заголовком в NavigationView

Этот макет также включал макет ящика или нет

bugfreerammohan 27.02.2019 06:27

почему отошел от включаемого файла?

Manohar 27.02.2019 06:30

@ManoharReddy Потому что мне нужно было получить доступ к виджетам с помощью синтетических.

AVEbrahimi 27.02.2019 06:32

В этом случае может быть лучше полностью удалить вид навигации и использовать свой собственный вид.

Manohar 27.02.2019 07:12
2
4
648
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это мои макеты, и они отлично работают: 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>

Но синтетика недоступна, если я использую заголовок через включаемый файл.

AVEbrahimi 27.02.2019 06:35
Ответ принят как подходящий

Переместите свой относительный макет (дизайн заголовка) в другой файл макета: заголовок.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 27.02.2019 07:15

@AVEbrahimi Я также писал код в kotlin, где вы видели код Java?

Suraj Vaishnav 27.02.2019 07:17

Другие вопросы по теме