Передача аргументов в BottomNavigationView с компонентом навигации - PullRequest
0 голосов
/ 30 декабря 2018

Я сейчас пишу приложение с новым (для меня) компонентом навигации.У меня есть основы с одним графиком навигации для навигации по моему приложению, у меня есть фрагмент с BottomNavigationView, в котором есть 3 отдельных фрагмента, мне удалось обновить его, чтобы использовать компонент навигации (насколькомоя проблема) с помощью меню с идентификаторами, которые соответствуют пунктам навигации.Мои фрагменты, которые все ранее использовали методы newInstance для передачи пакета в onCreate, очевидно, теперь не используются, но мне все еще нужно передать пакет моим фрагментам.

Я не смог найти никаких примеров этогоделается, так как фрагменты создаются неявно.

Мой код структурирован как ClientFragment, который является фрагментом хоста для панели навигации и т. д .;

class ClientFragment : Fragment() {

    private val viewModel: ClientViewModel by viewModel()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_client, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

       viewModel.client = arguments?.getParcelable(ARG_CLIENT)!!

        toolbar_client.title = viewModel.client.name
        toolbar_client.setNavigationOnClickListener { Navigation.findNavController(view).navigateUp() }
    }
}

Этот класс ранее удерживался на onclickслушатель моих фрагментов, с помощью метода newInstance, инструмент viewModel.client.

Все мои фрагменты в nav_graph похожи.Первый фрагмент;

class ClientDetailsFragment : Fragment() {

    private val viewModel: ClientViewModel by viewModel()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_client_details, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

       // viewModel.client = arguments?.getParcelable(ARG_CLIENT)!!

        initClientDetails()
    }

    private fun initClientDetails() {
//        text_client_details_name.text = viewModel.client.name
//        text_client_details_account_number.text = viewModel.client.accountNumber
//        text_client_details_mobile_number.text = viewModel.client.mobileNumber
//        text_client_details_landline_number.text = viewModel.client.landlineNumber
//        text_client_details_email.text = viewModel.client.email
//        text_client_details_address.text = "NOT YET IMPLEMENTED"
//
//        text_client_description_body.text = viewModel.client.description
//        text_client_system_details_body.text = viewModel.client.systemDetails
    }
}

Приложение вылетает в закомментированной строке;

// viewModel.client = arguments?.getParcelable(ARG_CLIENT)!! 

Мой график и меню навигации:

навигационный график;

<?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/client_nav_graph"
    app:startDestination="@id/clientDetailsFragment">

    <fragment
        android:id="@+id/clientCustomersFragment"
        android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientCustomersFragment"
        android:label="ClientCustomersFragment"
        tools:layout="@layout/fragment_client_customers" />

    <fragment
        android:id="@+id/clientDetailsFragment"
        android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientDetailsFragment"
        android:label="ClientDetailsFragment"
        tools:layout="@layout/fragment_client_details"/>

    <fragment
        android:id="@+id/clientJobHistoryFragment"
        android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientJobHistoryFragment"
        android:label="ClientJobHistoryFragment"
        tools:layout="@layout/fragment_client_job_history" />

</navigation>

menu;

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/clientDetailsFragment"
        android:icon="@drawable/ic_launcher_foreground"
        android:title="Details"/>
    <item
        android:id="@+id/clientJobHistoryFragment"
        android:icon="@drawable/ic_launcher_foreground"
        android:title="Job History"/>
    <item
        android:id="@+id/clientCustomersFragment"
        android:icon="@drawable/ic_launcher_foreground"
        android:title="Customers"/>
</menu>

Я обнаружил, что вы можете добавить аргументы в граф навигации, но ничего не нашел о том, где их разместить для этого конкретного сценария, я также знаю овозможность ручного добавления комплектов при навигации с использованием .navigate.

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

viewModel.client

Update:

Проблема с моими аргументами была решена с помощью модели представления, которая совместно используется всеми фрагментами в BottomNavigationView (я понял это, когда печатал проблему для моего друга) и самой навигацией, я добавил это в ClientFragment;

bottom_nav_client.setupWithNavController(
            Navigation.findNavController(
                    view.findViewById<View>(R.id.fl_client_nav_container)
            )
    )

и мой xml для frag_client;

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar_client"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navigationIcon="?attr/NavigationBackIconLight"
        app:titleTextColor="@color/white" />

    <fragment
        android:id="@+id/fl_client_nav_container"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/bottom_nav_client"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar_client"
        app:navGraph="@navigation/client_nav_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav_client"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="?android:attr/windowBackground"
        app:itemBackground="@color/colorPrimary"
        app:itemIconTint="@drawable/bottom_nav_color"
        app:itemTextColor="@color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/client_menu" />

</androidx.constraintlayout.widget.ConstraintLayout>

Это объединено с тем же графом навигации и меню, как показано выше.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Эта кодовая метка - именно то, что вы хотите сделать: https://codelabs.developers.google.com/codelabs/android-navigation/index.html?index=..%2F..index#0

Документы: https://developer.android.com/topic/libraries/architecture/navigation/

0 голосов
/ 30 декабря 2018

Документация Архитектура навигации Документация показывает, как определить аргументы назначения, в вашем конкретном случае вы должны создать пользовательский класс Parcelable (т.е. Client) и включить его в видеаргумент соответствующего фрагмента.

<fragment
    android:id="@+id/clientCustomersFragment"
    android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientCustomersFragment"
    android:label="ClientCustomersFragment"
    tools:layout="@layout/fragment_client_customers" >

    <action
        android:id="@+id/client_to_details"
        app:destination="@+id/clientDetailsFragment" />

</fragment>

<fragment
    android:id="@+id/clientDetailsFragment"
    android:name="com.management.engineering.alarm.alarmengineermanagement.features.client.ClientDetailsFragment"
    android:label="ClientDetailsFragment"
    tools:layout="@layout/fragment_client_details">

    <argument
        android:name="client"
        app:argType="com.management.engineering.alarm.alarmengineermanagement.features.client.Client" />

</fragment>

Плагин gradle 'androidx.navigation.safeargs' сгенерирует классы ClientToDetails и ClientDetailsFragmentArgs, которые можно использовать для передачи. восстановления параметра client.

Источник

val client: Client = TODO()
val navController: NavController = TODO()
navController.navigate(ClientToDetails(client))

Пункт назначения

val client =  ClientDetailsFragmentArgs.fromBundle(arguments).client
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...