无限片段的Android导航

时间:2020-05-12 02:42:45

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

是否必须在导航图中注册目标片段?例如,如果我想通过片段显示一个多级目录,而每个片段都显示一个目录,那么我将无法在导航视图中注册所有片段,因为我不知道需要多少个片段。
我该怎么办?

-------添加--------

也许我没有清楚地描述我的问题,我的当前需求如下所示:

this is my needs

现在,我使用ViewPager和FragmentStatePagerAdapter动态添加和删除片段,但是我想迁移到Navigation,我不知道有没有办法。

1 个答案:

答案 0 :(得分:0)

导航图中只能有一个DirectoryFragment。该片段将带有一个argument,指示应显示哪个目录:

<fragment android:id="@+id/directory_fragment"
    android:name="com.example.DirectoryFragment">
    <argument
        android:name="directory"
        app:argType="string"
        android:defaultValue="/" />
</fragment>

然后,您可以navigate using the id

File directory = ...
directoryButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Bundle arguments = new Bundle();
        arguments.putString("directory", directory.getAbsolutePath());
        Navigation.findNavController(view).navigate(
            R.id.directory_fragment, arguments);
    }
});

通过调用navigate(),将创建DirectoryFragment的新实例并将其添加到后堆栈中,显示您作为参数传递的目录。

这是您所需要的最低要求。强烈建议您connect your destinations via actions,它允许您add transitions between your destinations并允许使用Safe Args为您的navigate()调用增加类型安全性。

这将使您可以编写如下内容:

<fragment android:id="@+id/directory_fragment"
    android:name="com.example.DirectoryFragment">
    <argument
        android:name="directory"
        app:argType="string"
        android:defaultValue="/" />
    <action android:id="@+id/show_subdirectory"
        app:destination="@+id/directory_fragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right"/>
</fragment>

并通过以下网址导航:

File directory = ...
directoryButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Navigation.findNavController(view).navigate(
            DirectoryFragmentDirections.showSubdirectory()
                .setDirectory(directory.getAbsolutePath()));
    }
});
相关问题