Navigation Drawer Activityを作成しましたNavigation Drawer Activityの新しいフォーマットを更新しました新しいAndroidアーキテクチャ、ナビゲーションコンポーネント構造で取得しました。
以下のNavigationView
とNavController
を含むNavigationUI
コードは、ナビゲーション項目をクリックしたときにopening fragmentです。
DrawerLayout drawer = 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_profile, R.id.nav_privacy_policy,
R.id.nav_terms, R.id.nav_contact_us, R.id.nav_share, R.id.nav_send)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_Host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
これはnav_Host_fragment
用です:
<fragment
Android:id="@+id/nav_Host_fragment"
Android:name="androidx.navigation.fragment.NavHostFragment"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation" />
これを使用してナビゲーションが発生していますnavigation/mobile_navigation.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
Android:id="@+id/mobile_navigation"
app:startDestination="@+id/nav_home">
<fragment
Android:id="@+id/nav_home"
Android:name="com.sohamerp.marsremedies.fragment.HomeFragment"
Android:label="@string/menu_home"
tools:layout="@layout/fragment_home" />
<fragment
Android:id="@+id/nav_profile"
Android:name="com.sohamerp.marsremedies.fragment.ProfileFragment"
Android:label="@string/menu_my_profile"
tools:layout="@layout/fragment_profile" />
<fragment
Android:id="@+id/nav_privacy_policy"
Android:name="com.sohamerp.marsremedies.fragment.PrivacyPolicyFragment"
Android:label="@string/menu_privacy_policy"
tools:layout="@layout/fragment_privacy_policy" />
<fragment
Android:id="@+id/nav_terms"
Android:name="com.sohamerp.marsremedies.fragment.TermsConditionFragment"
Android:label="@string/menu_terms"
tools:layout="@layout/fragment_terms_condition" />
<fragment
Android:id="@+id/nav_contact_us"
Android:name="com.sohamerp.marsremedies.fragment.ContactUsFragment"
Android:label="@string/menu_contact_us"
tools:layout="@layout/fragment_terms_condition" />
</navigation>
次に、Fragmentが呼び出されたときに、一部の値をバンドル(引数)として渡します。
シナリオ:2つのフラグメントPrivacyPolicyFragment
とTermsConditionsFragment
があります。どちらのフラグメントでも、それに応じてWebView内のリンクを開いています。 Privacy Policy
のメニュー項目をクリックすると、関連するリンクが渡されます。
この新しい構造navigation/mobile_navigation.xml
の開始フラグメントでは、どのように引数を渡すことができますか?
何か助けは?
NavigationView.OnNavigationItemSelectedListener
を実装して、次のようにすることができます。
override fun onNavigationItemSelected(item: MenuItem): Boolean {
drawer_layout.closeDrawers()
if (item.itemId == nv_navigation_drawer_navigation_view.checkedItem?.itemId)
return false
Handler().postDelayed({
when (item.itemId) {
R.id.nav_privacy_policy -> {
val action = FragmentDirections.actionFragmentToPrivacyFragment("Policy link")
findNavController().navigate(action)
}
}
}, DRAWER_NAVIGATION_DELAY)
return true
}
そしてxmlでは、受信フラグメントに引数を追加できます。この場合は
<fragment
Android:id="@+id/nav_privacy_policy"
Android:name=".fragment.PrivacyPolicyFragment"
Android:label="@string/menu_privacy_policy"
tools:layout="@layout/fragment_privacy_policy">
<argument
Android:name="policy"
app:argType="string" />
</fragment>