Android Studio导航抽屉如何导航不同的片段? [英] How is Android Studio Navigation Drawer navigating different Fragments?
问题描述
我一直在尝试找出默认的Navigation Drawer Activity模板与Android Studio一起如何在不同片段之间导航.我知道此菜单是使用AndroidX导航组件和导航图的实现,但我只是无法理解每个菜单项如何映射到其对应的片段.我没有看到任何侦听器或onNavigationItemSelected()等.有人可以解释如何实现menuItem和相应片段之间的映射吗?
I've been trying to figure out how the default Navigation Drawer Activity template came with Android Studio navigates between different fragments. I understand that this menu is an implementation using AndroidX navigation component and navigation graph, but I just cannot understand how each menu item is mapped to its corresponding fragment. I don't see any listener or onNavigationItemSelected() etc. Can someone explain how the mapping between menuItem and corresponding fragment was achieved?
MainActivity.java:
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration mAppBarConfiguration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
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.
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
mAppBarConfiguration = new AppBarConfiguration.Builder(
navController.getGraph())
.setDrawerLayout(drawer)
.build();
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
}
menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
>
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_home"
android:icon="@drawable/ic_menu_camera"
android:title="@string/menu_home" />
<item
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="@string/menu_gallery" />
<item
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow"
android:title="@string/menu_slideshow" />
</group>
</menu>
nav_graph.xml
nav_graph.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.buzzz.myapplication.ui.home.HomeFragment"
android:label="@string/menu_home"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_HomeFragment_to_HomeSecondFragment"
app:destination="@id/nav_home_second" />
</fragment>
<fragment
android:id="@+id/nav_home_second"
android:name="com.buzzz.myapplication.ui.home.HomeSecondFragment"
android:label="@string/home_second"
tools:layout="@layout/fragment_home_second">
<action
android:id="@+id/action_HomeSecondFragment_to_HomeFragment"
app:destination="@id/nav_home" />
<argument
android:name="myArg"
app:argType="string" />
</fragment>
<fragment
android:id="@+id/nav_gallery"
android:name="com.buzzz.myapplication.ui.gallery.GalleryFragment"
android:label="@string/menu_gallery"
tools:layout="@layout/fragment_gallery" />
<fragment
android:id="@+id/nav_slideshow"
android:name="com.buzzz.myapplication.ui.slideshow.SlideshowFragment"
android:label="@string/menu_slideshow"
tools:layout="@layout/fragment_slideshow" />
</navigation>
非常感谢您.
推荐答案
根据使用NavigationUI文档更新UI组件, setupWithNavController()
方法将UI元素(例如 NavigationView
)与NavController挂钩.
As per the Update UI components with NavigationUI documentation, the setupWithNavController()
methods hook up UI elements (such as your NavigationView
) with the NavController.
Looking at the setupWithNavController()
Javadoc:
设置
NavigationView
以与NavController
一起使用.这将调用onNavDestinationSelected
(选择菜单项时).当目的地更改时,NavigationView
中的所选项目将自动更新.
Sets up a
NavigationView
for use with aNavController
. This will callonNavDestinationSelected
when a menu item is selected. The selected item in theNavigationView
will automatically be updated when the destination changes.
因此,在内部,这将设置适当的侦听器-当当前目标更改时,既可以在 NavigationView
上处理菜单选择,又可以在 NavController
上更新选定的项目
So internally, this is setting up the appropriate listeners - both on the NavigationView
to handle menu selections and on the NavController
to update the selected item when the current destination changes.
Looking at the onNavDestinationSelected()
Javadoc, it becomes clear how the menu items and navigation graph destinations are matched:
Importantly, it assumes the menu item id matches a valid action id or destination id to be navigated to.
因此,单击具有 android:id ="@ + id/nav_home"
的菜单项将导航至具有 android:id ="@ + id/nav_home" 目的地>代码>.
So clicking on a menu item with android:id="@+id/nav_home"
will navigate to the destination with android:id="@+id/nav_home"
.
这篇关于Android Studio导航抽屉如何导航不同的片段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!