JetPack(二)-Navigation


利用Navigation Componets實現導航

官方文檔示例圖:

實現步驟

  1. 創建導航資源(在Res下新建導航資源文件)

  1. 添加導航容器

在某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();
    }

視圖跳轉

  1. 通過任意fragment上的View獲取NavController
  2. 根據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","默認值");

添加動畫

  1. 創建動畫xml文件

  2. 添加合適的動畫

其中 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();
 
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM