Jetpack学习-5-Navigation简单使用

Androidx中的fragment是v4包中fragment的升级版本,在之前开发中所有用到的v4-fragment相关方法在androidx-fragment都是类似使用的,无非就是v4-Fragment-FragmentActivity变成了androidx-fragment-FragmentActivity,当使用的fragment需要Lifecycle时,那就只能使用androidx-fragment了。
navigation是什么?
Navigation 是一个可简化Android导航的库和插件。
传统的Fragment管理需要在activity里中严格控制切换,包括控制导航返回/切换动画,全靠FragmentTransaction一手严格操办。
Google觉得不够cool,所以有了navigation。
navigation的主要组成
  1. 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。包括所有的fragment及相关fragment切换的路径。(类似于地图功能)
  2. NavHost:显示导航图中目标的空白容器。导航组件包含一个默认 NavHost 实现 (NavHostFragment),可显示 Fragment 目标。(功能类似于汽车)
  3. NavController:在 NavHost 中管理应用导航的对象。当用户在整个应用中移动时,NavController 会安排 NavHost 中目标内容的交换。(功能类似于方向盘,想显示地图上的位置就切换过去,没有路径则过不去)
navigation简单使用
0,加入依赖
    implementation "androidx.navigation:navigation-fragment:2.3.2"
    implementation "androidx.navigation:navigation-ui:2.3.2"

1,建立导航图

在res下新建导航图文件夹navigation,右键新建->Navigation Resource File

Jetpack学习-5-Navigation简单使用_第1张图片

2,新建3个Fragment,WelcomeFragment LoginFragment RegisterFragment 

Jetpack学习-5-Navigation简单使用_第2张图片

自动生成代码

package com.sun.navigation;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link LoginFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class LoginFragment extends Fragment {

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public LoginFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment LoginFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static LoginFragment newInstance(String param1, String param2) {
        LoginFragment fragment = new LoginFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_login, container, false);
    }
}

 很nice,自动生成布局,传参相关代码也写好了。

3,当前设计方向为欢迎能进入登录及注册,登录能进去注册,通过在login_navigation.xml进行拖拽完成,得到如下识图(地图)

Jetpack学习-5-Navigation简单使用_第3张图片

对应的代码如下 




    
        
        
    
    
        
    
    

4,添加Fragment容器NavHostFragment

activity_main.xml




    

这样子显示部分就好了,activity启动后把androidx.navigation.fragment.NavHostFragment作为显示容器,加载navigation中的login_navigation导航图,在导航图上startDestination标识了welcomefragment是首先展示页,同时在welcomeFragment中,定义了2个action(跳转动作,路标?),可以跳转到LoginFragment和RegisterFragment,另外,LoginFragment也有动作能跳转到RegisterFragment上,下面在代码中添加NavControIIer(导航控制器?)完成页面切换。

普通导航 
Navigation.findNavController(v).navigate(R.id.action_welcomeFragment_to_loginFragment);

带参数导航
Bundle bundle=new Bundle();
bundle.putString("phone",et_phone.getText().toString());
Navigation.findNavController(v).navigate(R.id.action_loginFragment_to_registerFragment,bundle);

如何导航到一个地图上本页面无法到达的页面会咋样?
报错参数异常
java.lang.IllegalArgumentException: Navigation action/destination com.sun.navigation:id/action_welcomeFragment_to_registerFragment cannot be found from the current destination Destination

5,为了解决跳转的生硬,需要添加动画,在原始代码上,可以通过fragment事务的setCustomAnimations()进行处理,而navigation,直接在导航图上进行添加,这样就能把偏view的动画添加代码移动xml上Jetpack学习-5-Navigation简单使用_第4张图片

双击action,给fragment的切换添加动画


        
        
    

 

在导航图上自动出现了enterAnim和exitAnim的属性,这样就完成了动画的添加。

至此,navigation的基本操作已经完成,还有使用场景较少的深层链接,SafeArgs(个人不推荐)后续有时间再分析。

Android-Jetpack代码位置:github

你可能感兴趣的:(android,jetpack,android)