如何获取NavHostFragment(导航架构组件)加载的Fragment(SupportMapFragment)的引用

时间:2018-05-20 23:16:25

标签: android android-fragments google-maps-android-api-2 android-jetpack android-architecture-navigation

我正在尝试在Google IO 2018会议中引入的导航架构组件。 我正在尝试使用三个选项卡创建一个应用程序,每个选项卡都有一个片段。 在其中一个我想使用Google Maps API放置地图。 通常,您应该在活动的OnCreate中执行此操作

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

R.id.map is SupportMapFragmentmain_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>

正如您所看到的,第一个和第三个标签有两个片段startFragmentendFragment。在第二个中,我试图引用SupportMapFragment。 我无法使用标准getSupportFragmentManager().findFragmentById(int id)方式,因为main_activity.xml仅包含NavHostFragment

我尝试了getChildFragmentManager()但没有取得多大成功。 我也尝试了navController.getCurrentDestination(),但它返回了一个NavDestination对象,我无法用它来检索加载的片段。

我找到的唯一解决方案是直接在SupportMapFragment中添加activity_main.xml,使其与导航图完全分开,但它更像是一种解决方法,而不是解决方案,因为我必须手动处理显示当用户在另一个屏幕上时隐藏地图。

如果有人知道正确的解决方案,请分享。

1 个答案:

答案 0 :(得分:1)

您应该添加自己的Fragment类来拥有和管理SupportMapFragment,而不是直接将SupportMapFragment添加到导航图中,而是将getMapAsync调用SupportMapFragmentcolors = ['green', 'red'] animals = ['cat', 'dog'] 放在自己的布局中。

导航的目标是将活动与各个目的地的内容分离。让活动管理单个目的地不是推荐的模式。