Я пробовал компоненты архитектуры навигации, представленные на конференции 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
, делая егополностью отделен от навигационной диаграммы, но это скорее обходной путь, чем решение, потому что мне приходится вручную отображать и скрывать карту, когда пользователь находится на другом экране.
Если кто-то знает правильное решение, поделитесь им.