使用DialogFragment作为Android NavController中的片段之一

时间:2018-08-08 22:08:22

标签: android android-navigation android-jetpack android-architecture-navigation

我有一个使用XML定义的图形,并在NavGraph中添加了DialogFragment作为Fragment之一。当我在该导航控制器上使用resId和bundle调用NavController.navigate时,看不到任何对话框显示。有什么方法可以使用DialogFragment而不是标准Fragment?

<fragment
        android:id="@+id/noLoginDialog"
        android:name="com.ram.view.NoLoginDialog"
        android:label="NoLoginDialog">
        <argument
            android:name="argTitle"
            android:defaultValue="null"
            app:type="string"/>
        <argument
            android:name="argBody"
            android:defaultValue="null"
            app:type="string"/>
        <argument
            android:name="argButton"
            android:defaultValue="null"
            app:type="string"/>
    </fragment> 

我的动作定义如下

 <container_fragment
        android:id="@+id/homeFragment"
        android:name="com.ram.home.HomeFragment"
        android:label="HomeFragment">

        <action
            android:id="@+id/action_homeFragment_to_noAuthAlertDialog"
            app:destination="@id/noLoginDialog"/>
    </container_fragment>

我其他带有活动和片段的动作都很好。

2 个答案:

答案 0 :(得分:0)

哼,导航库将永远不会打开“片段作为对话框”,它只会将第一个(家庭目标)替换为NavHostFragment中的其他目标。

Google说:

  

目的地是您可以在应用中导航到的任何位置。而   目的地通常是代表特定屏幕的片段。

请提供更多信息,例如您的导航代码(java / kotlin)。

阅读此Google官方帖子,以了解有关导航的更多信息: https://developer.android.com/topic/libraries/architecture/navigation/navigation-implementing

答案 1 :(得分:0)

是的,您可以从导航中调用DialogFragment,您只需明确告知导航您将使用对话框

class ParentTagSerializer(serializers.ModelSerializer):
    def to_representation(self, value):
        serializer_data = TagSerializer(value).data
        return serializer_data

    class Meta:
        model = Tag
        fields = "__all__"


class TagSerializer(serializers.HyperlinkedModelSerializer):
    parent = ParentTagSerializer()

    class Meta:
        model = Tag
        fields = ["name", "aliases", "parent"]

        extra_kwargs = {"aliases": {"validators": []}}