DrawerLayout с компонентом навигации не попадает за полупрозрачную строку состояния - PullRequest
0 голосов
/ 23 октября 2018

То, чего я хочу достичь, - это дизайн материала DrawerLayout, стоящий за полупрозрачной строкой состояния, такой как:

DrawerLayout inside translucent status bar

Я используюnew Компонент архитектуры навигации , что означает, что это моя текущая структура (я сделаю ее простой, поскольку она может содержать много бесполезного кода):

main.xml:

<FrameLayout
    ...
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ...
    android:fitsSystemWindows="true" >

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/main_nav_graph"
        app:defaultNavHost="true" />
</FrameLayout>

Затем внутри фрагмента навигационного графика на main.xml Я загружаю сам DrawerLayout:

фрагмент_основной_nav.xml:

<androidx.drawerlayout.widget.DrawerLayout
    ...
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- Layout to contain contents of main body of screen (drawer will slide over this) -->
    <androidx.coordinatorlayout.widget.CoordinatorLayout            
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        ...

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <!-- Container for contents of drawer - using NavigationView to make configuration easier -->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/drawer_navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/drawer_view"
        app:headerLayout="@layout/drawer_nav_header"/>

</androidx.drawerlayout.widget.DrawerLayout>

И в моем styles.xml у меня есть Theme как:

<style name="AppTheme" parent="WindowAppTheme">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="WindowAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"></style>

И v21 styles.xml:

<style name="WindowAppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

С этим я не могу получить `DrawerLayout, чтобы показать его верхнюю часть под полупрозрачной строкой состояния, вот что я получаю вместо:

white status bar

Я пробовал несколько разных способов, помещая android:fitsSystemWindows=true иудаляя это отовсюду, но я не могу заставить это работать!Или строка состояния не имеет полупрозрачного цвета или белого цвета.

Как правильно настроить DrawerLayout в соответствии со спецификациями Material Design с помощью компонента архитектуры навигации?


РЕДАКТИРОВАТЬ:

Я реструктурировал приложение в соответствии с предложением Иана, и теперь DrawerLayout отображается в строке состояния, но нет ни скрима, ни полупрозрачногобар в верхней части DrawerLayout:

No scrim DrawerLayout

1 Ответ

0 голосов
/ 23 октября 2018

A DrawerLayout должен быть расположен в корне вашей иерархии - используемый вами FrameLayout знает только то, что ему нужно заполнить все до fitsSystemWindows и не позволит вашему DrawerLayout войти вобласть строки состояния.

Поэтому ваш main.xml должен быть чем-то похожим на navta testapp :

<android.support.v4.widget.DrawerLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/main_drawer_layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/main_nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/main_nav_graph"
    app:defaultNavHost="true"
  />
  <android.support.design.widget.NavigationView
    android:id="@+id/drawer_navigation_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:menu="@menu/drawer_view"
    app:headerLayout="@layout/drawer_nav_header"/>
</android.support.v4.widget.DrawerLayout>

И ваша MainActivity должна включать такой код:

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.main)
  val navController = findNavController(R.id.main_nav_host_fragment)

  // Change whether the drawer is enabled
  // based on what destination you're on
  val drawerLayout = findViewById<DrawerLayout>(R.id.main_drawer_layout)
  navController.addOnNavigatedListener { _, destination ->
    if (navController.graph.startDestination == destination.id) {
      // We're at the root of your graph, so unlock the drawer
      drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,
        GravityCompat.START)
    } else {
      // We're on any other destination so disable the drawer
      drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
        GravityCompat.START)
    }
  }

  // Setup the NavigationView to navigate to the correct
  // destination in the graph. Since we've locked the drawer
  // on anything but the startDestination, we can guarantee
  // that you're on that destination when these items are clicked
  val navigationView = findViewById<NavigationView>(R.id.drawer_navigation_view)
  navigationView.setupWithNavController(navController)
}

Поскольку вы не используете Toolbar или какую-либо эквивалентную конструкцию, вашему MainFragment потребуется добавить собственную кнопку и настроить ее для открытия ящика при нажатии:

val navigationButton = ...
navigationButton.setOnClickListener {
  val drawerlayout = requireActivity().findViewById<DrawerLayout>(
    R.id.main_drawer_layout)
  drawerLayout.openDrawer(GravityCompat.START)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...