開始使用Navigation
demo:https://github.com/Gong-Shijie/navWithDrawer
應(yīng)用框架
Android studio直接創(chuàng)建
Google建議開發(fā)者只使用一個Activity搭配Fragment來架構(gòu)程序
可以直接new一個Navigation Drawer的項目
進一步調(diào)整為需要的效果
Drawer菜單
首先要了解菜單Menu患亿,菜單在Android部件系統(tǒng)中有三種類型
Drawer Menu
Toolbar菜單
底部菜單
對于這些菜單我們都可以通過他們來進行頁面導(dǎo)航切換
使用方法是直接在創(chuàng)建項目的時候使用提供的模板
根據(jù)這些默認模板可以減少項目構(gòu)建的封鎖步驟
viewmodel也可以勾選省去創(chuàng)建ViewModel步驟
創(chuàng)建一個Navigation Drawer 應(yīng)用
MainXML
重寫方法實現(xiàn)對所有菜單監(jiān)聽
處理toolbar菜單監(jiān)聽
//只要是菜單選項被點擊都會調(diào)用該方法
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Toast.makeText(this, "Click !", Toast.LENGTH_SHORT).show();
break;
case R.id.action_settidfngs:
Toast.makeText(this, "Click ! ", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
動態(tài)修改和設(shè)置抽屜菜單
drawer菜單
//動態(tài)添加menuItem項設(shè)置id
Menu menu = navigationView.getMenu();
menu.clear();
menu.add(0, R.id.nav_gallery, 0, "gallery").
setIcon(R.drawable.ic_menu_gallery);
menu.add(0, R.id.nav_send, 1, "send").
setIcon(R.drawable.ic_menu_send);
//設(shè)置點擊監(jiān)聽但是不要消耗點擊事件否則影響導(dǎo)航
menu.getItem(0).setOnMenuItemClickListener();
Navigation
主要代碼
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);
//實現(xiàn)toolbar替換默認的Actionbar
setSupportActionBar(toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
//將NavController 和app bar這種menu綁定從而實現(xiàn)Fragment切換的管理
// 也可以和其他的menu類型綁定
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
mAppBarConfiguration = new AppBarConfiguration.Builder(
navController.getGraph()
)
.setDrawerLayout(drawer)
.build();
NavigationUI.setupActionBarWithNavController(this,
navController, mAppBarConfiguration);
//使得drawer顯示
NavigationUI.setupWithNavController(navigationView,
navController);
//動態(tài)添加menuItem項設(shè)置id
Menu menu = navigationView.getMenu();
menu.clear();
menu.add(0, R.id.nav_gallery, 0, "gallery").setIcon(R.drawable.ic_menu_gallery);
menu.add(0, R.id.nav_send, 1, "send").setIcon(R.drawable.ic_menu_send);
}
//設(shè)置actionbar中的菜單顯示
@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;
}
//只要是菜單選項被點擊都會調(diào)用該方法
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
Toast.makeText(this, "Click !", Toast.LENGTH_SHORT).show();
break;
case R.id.action_settidfngs:
Toast.makeText(this, "Click ! ", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
//處理左上角的菜單被點擊的時候的回調(diào)
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this,
R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</androidx.drawerlayout.widget.DrawerLayout>
HomeFragment.java
public class HomeFragment extends Fragment {
private HomeViewModel homeViewModel;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
homeViewModel =
new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
View root = inflater.inflate(R.layout.fragment_home, container, false);
final TextView textView = root.findViewById(R.id.text_home);
homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root;
}
}