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

浙公网安备 33010602011771号