Как использовать Навигационный Компонент в Индивидуальном Макете? - PullRequest
0 голосов
/ 10 июля 2019

Я делаю приложение похожим на это.

v

Круглые вещи - кнопки. И зеленая часть - Фрагмент.

А мой host_navigation.xml состоит из фрагмента A, B, C.

Эти фрагменты принадлежат MainActivity (и, конечно, он имеет fragment представление) И нет <action> (нет линий между фрагментами в дизайне), потому что я хочу открыть каждый из фрагментов случайным образом. Например, A-> B, B-> A C-> A, ... Где бы вы ни находились, вы можете перейти к определенному фрагменту.

Три круглые кнопки также относятся к MainActivity.

Я нашел BottomNavigationView или NavigationView образцов. Тем не менее, они не кажутся чем-то, что я могу использовать в этом макете. Но поведение довольно похоже. просто макет другой.

Как я могу реализовать это и как я также могу естественным образом управлять поведением стека? Например, кнопка «Назад», и я хотел бы сохранить последние 3 фрагмента и удалить все предыдущие в стеке.

+

Это мой host_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/host_navigation"
            app:startDestination="@id/aFragment">
    <fragment android:id="@+id/aFragment"
              android:name="com.example.AFragment"
              android:label="fragment_a"
              tools:layout="@layout/fragment_a"/>

    <fragment android:id="@+id/bFragment"
              android:name="com.example.BFragment"
              android:label="fragment_b"
              tools:layout="@layout/fragment_b"/>

    <fragment android:id="@+id/cFragment"
              android:name="com.example.CFragment"
              android:label="fragment_c"
              tools:layout="@layout/fragment_c">
    </fragment>
</navigation>

А это activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    <RelativeLayout
            android:id="@+id/rl_tab_area"
            android:layout_width="match_parent"
            android:layout_height="105dp">

            <Button
                    android:id="@+id/btn_a"
                    android:layout_width="50dp"
                    android:layout_height="50sp"
                    android:layout_alignParentTop="true"
                    android:src="@drawable/ic_a"
                    android:margin="5dp"
                    android:background="@drawable/btn_a"
            />
            <Button
                    android:id="@+id/btn_b"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:layout_marginTop="30dp"
                    android:layout_marginLeft="15dp"
                    android:layout_toRightOf="@id/btn_a"
                    android:background="@drawable/btn_b"/>

            <Button
                    android:id="@+id/btn_c"
                    android:layout_width="200dp"
                    android:layout_height="100dp"
                    android:layout_alignParentRight="true"
                    android:background="@drawable/btn_c"/>
    </RelativeLayout>
    <fragment
            android:id="@+id/fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_below="@+id/rl_tab_area"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/host_navigation">
    </fragment>
</RelativeLayout>

Я думаю, мне нужно использовать это в MainActivity

val navController = Navigation.findNavController(this@MainActivity, R.id.host_navigation)

Если, если использовать NavigaitonBottomView Тогда, я могу передать это значение ему, но я понятия не имею, потому что я его не использую.

Я пытался назвать другие фрагменты этим

Navigation.findNavController(this, R.id.fragment).navigate(R.id.aFragment)

И попробовал

Navigation.findNavController(this, R.id.host_navigation).navigate(R.id.aFragment)

Navigation.findNavController(R.id.host_navigation).navigate(R.id.aFragment)

findNavController(R.id.host_navigation).navigate(R.id.aFragment)

И другие способы тоже. Но пока никто из них не работал.

1 Ответ

0 голосов
/ 11 июля 2019

Установить действия для всех фрагментов следующим образом:

<navigation
    ...
    <fragment
        android:id="@+id/fragment_a"
        android:label="fragment_a"
        android:name="com.example.AFragment"
        tools:layout="@layout/fragment_a">
        <action
            android:id="@+id/a_to_b"
            app:destination="@id/fragment_b"
            app:launchSingleTop="true"/>
        <action
            android:id="@+id/a_to_c"
            app:destination="@id/fragment_c"
            app:launchSingleTop="true"/>
    </fragment>
</navigation>

или вместо единственной вершины вы можете использовать app:popUpTo

Затем запустите их с помощью navController:

navController.navigate(FragmentAFragmentDirections.aToC())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...