Как я могу получить ссылку на фрагмент (SupportMapFragment), загруженный NavHostFragment (компонентов навигационной архитектуры) - PullRequest
0 голосов
/ 21 мая 2018

Я пробовал компоненты архитектуры навигации, представленные на конференции Google IO 2018.Я пытаюсь создать приложение с тремя вкладками, по одному фрагменту для каждой вкладки.В одном из них я хотел бы разместить карту с помощью API Карт Google.Обычно вы должны сделать это в OnCreate действия

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
        .findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

R.id.map is идентификатор SupportMapFragment внутри main_activity.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" />

Однако настройка компонентов архитектуры навигациинемного по-другому.main_activity.xml содержит только NavHostFragment (где загружен каждый фрагмент экрана) и BottomNavigationView для перехода между различными пунктами назначения приложения.

<RelativeLayout android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

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

</fragment>


<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:itemBackground="@color/colorPrimary"
    app:itemIconTint="@android:color/white"
    android:layout_alignParentBottom="true"
    app:itemTextColor="@android:color/white"
    app:menu="@menu/bottom_navigation_main" />

</RelativeLayout>

Мой график навигации выглядит следующим образом

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

<fragment
    android:id="@+id/endFragment"
    android:name="douglas.leone.easytaxi.EndFragment"
    android:label="fragment_end"
    tools:layout="@layout/fragment_end" />

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:map="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />

<fragment
    android:id="@+id/startFragment"
    android:name="douglas.leone.easytaxi.StartFragment"
    android:label="fragment_start"
    tools:layout="@layout/fragment_start" />

</navigation>

Как видите, для первой и третьей вкладок есть два фрагмента startFragment и endFragment.Во втором есть SupportMapFragment, на который я пытаюсь сослаться.Я не могу использовать стандартный способ getSupportFragmentManager().findFragmentById(int id), потому что main_activity.xml содержит только NavHostFragment

Я попытался поэкспериментировать с getChildFragmentManager() без особого успеха.Я также попытался navController.getCurrentDestination(), но он возвращает NavDestination объект, который я не могу использовать для извлечения загруженного фрагмента.

Единственное решение, которое я нашел, - это добавить SupportMapFragment непосредственно в activity_main.xml, делая егополностью отделен от навигационной диаграммы, но это скорее обходной путь, чем решение, потому что мне приходится вручную отображать и скрывать карту, когда пользователь находится на другом экране.

Если кто-то знает правильное решение, поделитесь им.

1 Ответ

0 голосов
/ 21 мая 2018

Вместо добавления SupportMapFragment непосредственно к графику навигации, вы должны добавить свой собственный класс Fragment, который будет владеть и управлять SupportMapFragment - он будет вызывать getMapAsync и иметь SupportMapFragment вего собственный макет.

Цель Навигации состоит в том, чтобы отделить действие от содержимого отдельных пунктов назначения.Использование Действия для управления одним пунктом назначения не рекомендуется.

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