安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回

本文为学习笔记,所用的图片、案例均为教学视频截图

源视频地址:Navigation组件,让页面切换无比简单1
作者:longway777

目录

  • 实现效果
  • Navigation页面导航
  • 一、创建两个空白的fragment
  • 二、 创建Nagraph
  • 三、创建NavHostFragment
  • 四、在两个Fragment.java中完成逻辑部分
  • 五、添加页面跳转动画
  • 六、左上角的返回箭头与页面提示
  • 完整代码

实现效果

点击button按钮实现Fragment的跳转,点击左上角的返回按键可以返回上一个页面,页面左上角有文字提示当前的页面信息。

安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第1张图片

Navigation页面导航

程序内部页面按照一定的逻辑进行切换

安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第2张图片

一、创建两个空白的fragment

安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第3张图片加入约束布局
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第4张图片对两个fragment对应的xml进行布局
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第5张图片另一个也一样
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第6张图片

二、 创建Nagraph

创建资源文件,type要选择Navigation,标明为导航资源。
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第7张图片添加fragment
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第8张图片默认的,第一个进来的页面
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第9张图片跳转id
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第10张图片
host在哪呢?
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第11张图片

三、创建NavHostFragment

activity_main.xml
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第12张图片先留着
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第13张图片

四、在两个Fragment.java中完成逻辑部分

设置按钮点击事件
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第14张图片对于按钮的点击事件也可以这样写,一气呵成
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第15张图片

五、添加页面跳转动画

给两个箭头添加动画,先凑合着用系统自带的。
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第16张图片

六、左上角的返回箭头与页面提示

是activity的功能

安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第17张图片注意这个id,是Navhost的id
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第18张图片激活箭头返回
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第19张图片
更改页面左上角的显示文字,提示当前页面。

修改label标签即可

安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第20张图片

完整代码

MainActivity.java

public class MainActivity extends AppCompatActivity {
     

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //这里也需要用到navcontroller
        NavController controller = Navigation.findNavController(this,R.id.fragment);
        //左上角的页面名称提示与箭头,但此时箭头还未设置点击事件
        NavigationUI.setupActionBarWithNavController(this,controller);
    }

    //重载这个方法,实现返回箭头的点击事件
    @Override
    public boolean onSupportNavigateUp() {
     
        NavController controller = Navigation.findNavController(this,R.id.fragment);
        return controller.navigateUp();
        //return super.onSupportNavigateUp();
    }
}

HomeFragment.java

public class HomeFragment extends Fragment {
     

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

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

    @Override
    //这个callBack是发生在view创建之后并挂载在Activity,一般控件的初始化放在这里较为可靠
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
     
        super.onActivityCreated(savedInstanceState);

        Button button = getView().findViewById(R.id.button2);
        button.setOnClickListener(new View.OnClickListener() {
     
            @Override
            public void onClick(View v) {
     
                //创建导航对象 navController, 呼叫静态方法,找到button所归属的controller
                NavController controller = Navigation.findNavController(v);
                controller.navigate(R.id.action_homeFragment_to_detailFragment);
            }
        });
    }
}

fragment_home.xml,下面的fragment_detail.xml也和这个一样
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第21张图片
DetailFragment.java

public class DetailFragment extends Fragment {
     

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

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

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
     
        super.onActivityCreated(savedInstanceState);
        //与HomeFragment中的意思是一样的,这里更加简洁
        getView().findViewById(R.id.button3).setOnClickListener(Navigation.
                createNavigateOnClickListener(R.id.action_detailFragment_to_homeFragment));
    }
}

nav_graph.xml
安卓APP_ jetPack —— Navigation页面导航 (1)页面切换与返回_第22张图片

你可能感兴趣的:(JetPack框架,移动开发,安卓,android)