是否必须在导航图中注册目标片段?例如,如果我想通过片段显示一个多级目录,而每个片段都显示一个目录,那么我将无法在导航视图中注册所有片段,因为我不知道需要多少个片段。
我该怎么办?
-------添加--------
也许我没有清楚地描述我的问题,我的当前需求如下所示:
现在,我使用ViewPager和FragmentStatePagerAdapter动态添加和删除片段,但是我想迁移到Navigation,我不知道有没有办法。
答案 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()));
}
});