利用Navigation Componets實現導航
官方文檔示例圖:
實現步驟
- 創建導航資源(在Res下新建導航資源文件)
- 添加導航容器
在某Activity的xml中添加NavHostFragment選擇創建的導航資源文件
- 支持actionbar在代碼中設置(可選)
//設置actionbar
NavController navController = Navigation.findNavController(this,R.id.fragment);
NavigationUI.setupActionBarWithNavController(this,navController);
點擊返回按鈕后的操作(彈出當前視圖)
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this,R.id.fragment);
return navController.navigateUp();
}
視圖跳轉
- 通過任意fragment上的View獲取NavController
- 根據action id進行導航(action id跳轉的好處可以在xml文件中設置動畫)
NavController navController = Navigation.findNavController(v);
navController.navigate(R.id.action_homeFragment_to_detailFragment);
- 傳遞參數,只需添加bundle參數即可
NavController navController = Navigation.findNavController(v);
Bundle bundle = new Bundle();
bundle.putString("name","jack"); navController.navigate(R.id.action_homeFragment_to_detailFragment,bundle);
在另外一個fragment中獲取參數
String name = getArguments().getString("name","默認值");
添加動畫
-
創建動畫xml文件
-
添加合適的動畫
其中 enter代表當前actions即將進入的fragment,exit代表當前fragment
配合ViewModel
和在Activity中使用幾乎一致,只需要將綁定視圖的操作修改為如下即可
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
MyViewModelWithLiveData mMyViewModelWithLiveData = new ViewModelProvider(getActivity()).get(MyViewModelWithLiveData.class);
FragmentDetailBinding detailBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_detail,container,false );
detailBinding.setLifecycleOwner(getActivity());
detailBinding.setData(mMyViewModelWithLiveData);
return detailBinding.getRoot();
}