我正在创建一个单 Activity 应用程序,它使用 NavController
和 fragment 来显示每个屏幕。
该应用程序有一个主屏幕,并在抽屉导航中包含其他三个菜单项,以便用户可以在外部浏览器中访问不同的网站。
在我的 MainActivity
的 onCreate()
方法中,我有:
mDrawerLayout = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each menu should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home,
R.id.nav_visit_website_1,
R.id.nav_visit_website_2,
R.id.nav_visit_website_3)
.setDrawerLayout(mDrawerLayout)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
我创建了一个 VisitWebsiteFragment
类,它具有静态 newInstance(String websiteUrl)
方法 - 旨在将其用于三个网站菜单项。
我已通读 navigation documentation ,但我不确定如何拦截/控制 NavController 以便使用 VisitWebsiteFragment.newInstance(...)
创建三个 fragment 实例。
我可能完全忽略了导航的某些方面。有人能指出我正确的方向吗?
最佳答案
菜单项的 ID 为 nav_visit_website_1
、nav_visit_website_2
和 nav_visit_website_3
。
将此代码添加到我的 nav_graph.xml 中可以满足我的需要:
<fragment
android:id="@+id/visit_website"
android:name="org.example.VisitWebsiteFragment"
android:label="@string/visit_website" />
<action
android:id="@+id/nav_visit_website_1"
app:destination="@id/visit_website">
<argument
android:name="url"
app:argType="string"
android:defaultValue="https://example.com/website1" />
</action>
<action
android:id="@+id/nav_visit_website_2"
app:destination="@id/visit_website">
<argument
android:name="url"
app:argType="string"
android:defaultValue="https://example.com/website2" />
</action>
<action
android:id="@+id/nav_visit_website_3"
app:destination="@id/visit_website">
<argument
android:name="url"
app:argType="string"
android:defaultValue="https://example.com/website3" />
</action>
关于android - 使用 NavController 时如何使用 newInstance() 创建 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61484218/