Как заставить android хост навигации работать вместе с BottomNavigationView? - PullRequest
1 голос
/ 22 февраля 2020

Я хочу использовать новый график навигации и BottomNavigationView. Я получил следующие зависимости:

// Navigation
implementation "androidx.navigation:navigation-fragment-ktx:$navVersion"
implementation "androidx.navigation:navigation-ui-ktx:$navVersion"
implementation "androidx.fragment:fragment:1.2.2"

// Material
implementation "com.google.android.material:material:$materialVersion"

обратите внимание на implementation "androidx.fragment:fragment:1.2.2", который должен исправить ошибку, возникающую при FragmentContainerView, не отображаемом в качестве хоста на графике навигации.

Вот моя простая навигация graph:

enter image description here

Первое, что вы можете увидеть здесь, это то, что ничто не отображается в качестве хоста, хотя я добавил зависимость, которая должна это исправить.

Макет моей основной деятельности:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
        tools:context=".MainActivity">

    <androidx.fragment.app.FragmentContainerView
            android:id="@+id/nav_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            app:defaultNavHost="true"
            app:navGraph="@navigation/navigation_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?colorPrimary"
            app:itemIconTint="@drawable/menu_navigation"
            app:itemTextColor="@drawable/menu_navigation"
            app:menu="@menu/menu_navigation" />

</LinearLayout>

и моя основная деятельность kotlin файл:

class MainActivity : AppCompatActivity() {

    private var navController: NavController? = null
    private var appBarConfiguration: AppBarConfiguration? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        navController =
            (supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment).navController

        appBarConfiguration = AppBarConfiguration.Builder(
            setOf(
                R.id.main_fragment,
                R.id.recycler_fragment,
                R.id.map_fragment
            )
        ).build()

        setupActionBar()
        setupBottomNavigationMenu()
    }

    private fun setupActionBar() {
        NavigationUI.setupActionBarWithNavController(
            this,
            navController!!,
            appBarConfiguration!!
        )
    }

    private fun setupBottomNavigationMenu() {
        bottom_navigation?.let {
            NavigationUI.setupWithNavController(it, navController!!)
        }
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_toolbar, menu)

        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val navigated = NavigationUI.onNavDestinationSelected(item, navController!!)

        return navigated || super.onOptionsItemSelected(item)
    }
}

Здесь у нас также есть мое меню и панель инструментов:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    <item
            android:id="@+id/destination_home"
            android:icon="@drawable/ic_home"
            android:title="@string/home"
            tools:layout="@layout/fragment_main" />
    <item
            android:id="@+id/destination_recycler"
            android:icon="@drawable/ic_list"
            android:title="@string/recycler"
            tools:layout="@layout/fragment_recycler" />
    <item
            android:id="@+id/destination_map"
            android:icon="@drawable/ic_map"
            android:title="@string/map"
            tools:layout="@layout/fragment_map" />
</menu>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
            android:id="@+id/destination_settings"
            android:icon="@drawable/ic_settings"
            android:title="@string/settings"
            app:showAsAction="ifRoom" />
</menu>

Когда я сейчас запускаю приложение, я ожидал бы следующее поведение:

  1. Приложение запускается и показывает фрагмент с текстом «Home»
  2. В приложении не будет отображаться кнопка «Назад» на панели инструментов
  3. При переходе от «Домой» к «Карта» на панели инструментов не будет отображаться кнопка «Назад» на панели инструментов
  4. При переходе с «» В главном меню «Настройки» на панели инструментов будет отображаться кнопка «Назад» на панели инструментов
  5. Когда я вернуться назад из «Настройки» должен появиться экран «Домой»
  6. При переходе от «Карта» к «Настройки» на панели инструментов будет отображаться кнопка «Назад» на панели инструментов
  7. Когда я вернусь назад из «Настройки» должен появиться экран «Карта»

Что на самом деле происходит:

  1. Приложение запускается и показывает фрагмент с текстом «Домой»
  2. Приложение показывает кнопку «Назад» на панели инструментов
  3. Когда я перемещаюсь от «Домой» к «Карте», на панели инструментов отображается кнопка «Назад» на панели инструментов
  4. Когда я перемещаюсь от » В главном меню «Настройки» на панели инструментов отображается кнопка «Назад» на панели инструментов
  5. Когда я возвращаюсь назад из «Настройки», появляется экран «Домой»
  6. Когда я перемещаюсь от «Карта» к « Настройки »на панели инструментов отображается кнопка« Назад »на панели инструментов
  7. Когда я возвращаюсь назад из« Настройки », вместо« Карта »появляется экран« Домой »

Так что что-то действительно запутано здесь с навигацией, и я понятия не имею, как х это.

1 Ответ

1 голос
/ 23 февраля 2020

Во-первых, вы передаете R.id.main_fragment, R.id.recycler_fragment, R.id.main_fragment своему AppBarConfiguration - помимо включения main_fragment дважды, эти имена не совпадают с destination_home, destination_recycler и destination_map в вашем меню XML. Поскольку ваш щелчок в нижней панели навигации работает, это, кажется, правильные идентификаторы назначения, и вы должны изменить AppBarConfiguration на те же идентификаторы:

appBarConfiguration = AppBarConfiguration.Builder(
        setOf(
            R.id.destination_home,
            R.id.destination_recycler,
            R.id.destination_map
        )
    ).build()

Или, если вы используете navigation-ui-ktx артефакт, вы бы использовали верхнего уровня AppBarConfiguration создатель :

appBarConfiguration = AppBarConfiguration(setOf(
    R.id.destination_home,
    R.id.destination_recycler,
    R.id.destination_map))

Согласно onNavDestinationSelected() Javado c:

По умолчанию задний стек будет возвращен к месту назначения навигационного графика. Пункты меню, которые имеют android:menuCategory="secondary", не вытеснят задний стек.

Поэтому ожидается, что если вы пропустите это в вашем меню XML для экрана настроек, вы go вернетесь к начальный пункт назначения вашего графика, когда вы нажмете кнопку назад. Вы хотите изменить свое меню XML, чтобы включить этот флаг:

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
            android:id="@+id/destination_settings"
            android:icon="@drawable/ic_settings"
            android:title="@string/settings"
            app:showAsAction="ifRoom"
            android:menuCategory="secondary" />
</menu>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...