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();
 
    }
posted @ 2020-05-25 18:58  菜鸟工程司  阅读(771)  评论(0编辑  收藏  举报