01 Navigation的诞生与优势

学习的部分有三个方面

1.Navigation

2.NavigationUI

3.DeepLink

  诞生的因缘:Activity嵌套多个Fragment的UI 架构模式已经非常普遍,但是对Fragment的管理一直是一件比较麻烦的事情。我们需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。页面的切换通常还包括对应用程序App bar的管理,Fragment间的切换动画,以及Fragment间的参数传递。纯代码的方式使用起来不是特别友好,并且Fragment和App bar在管理和使用的过程中显得混乱,为此JetPack提供了Navigation组件,旨在方便我们管理页面和App Bar

 

  优势:可视化页面导航图,类似于Apple Xcode中的StoryBoard,便于我们理清页面关系。

     通过destination和action完成页面间的导航。

     方便添加页面切换动画

        页面间类型安全的参数传递

     通过NavigationUI,对菜单,底部导航,抽屉菜单导航进行统一的管理

     支持深层链接DeepLink

   Navigation Graph:一种新的xml资源文件,包含应用程序所有的页面,以及页面间的关系

      NavHostFragment:一个特殊的Fragment,开源将它看作是其他Fragment的容器Navigation Graph:中的Fragment正是通过NavHostFragment进行展示的。

   NavController: 用于在代码中完成Navigation Graph中具体的页面切换工作

   三个之间的关系:当想要切换Fragment时,使用NavController对象,告诉他你想要去Navigation Graph中的哪个Fragment,NavController会将你想去的Fragment展示到NavHostFragment中。

 

   

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

先创建两个fragment,一个navigation的安卓资源目录并在其下创建一个xml文件。

把两个fragment + 进 my_nav_graph.xml  连线

 

 

在fragment里面写跳转

 

 

public class Fragment_Home extends Fragment {
    
    public Fragment_Home() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Button buttonToDetail = getView().findViewById(R.id.buttonToDetail);
        buttonToDetail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                NavController navController = Navigation.findNavController(view);
                //给一个路线
                navController.navigate(R.id.action_fragment_Home_to_fragment_Detail);
            }
        });
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment__home, container, false);
    }

}

 

 

 

 把Navigation放入main.xml中

 

 写ActivityMain

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        //找到NavigationHost
        NavController navController = Navigation.findNavController(this, R.id.fragmentContainerView);
        //设置NavgationController
        NavigationUI.setupActionBarWithNavController(this,navController);
    }

    //让自带的返回按钮生效
    @Override
    public boolean onSupportNavigateUp() {
        //找到NavigationHost
        NavController navController = Navigation.findNavController(this, R.id.fragmentContainerView);
        return navController.navigateUp();
    }
}

 

posted @ 2021-12-03 16:43  涂妖教  阅读(232)  评论(0)    收藏  举报