jetpack----Navigation组件(导航) 让页面切换无比简单 01

NavHost                 容器,承载页面的。既是容器也是控制器。

Fragment               碎片,依存于activity。NavHost相当于把Fragment弹出去压进来(栈)

NavController        控制把哪个页面弄进来,把哪个页面弄出去

NavGraph             想控制把哪个页面弄进来,把哪个页面弄出去就得使用NavGraph控制路线

 

创建两个fragment

创建NavGraph资源文件     以控制各个fragment

 

 

创建完之后点击按钮,自动导入依赖。点击加号,把我们的两个fragment导入进来

 

 

 

 

 

 然后就可以连线了,也就是设置二者的跳转

 

现在我们还需要NavHost(activity)去承载这两个fragment

 

 

 现在我们暂且把MainActivity设置为我们的NavHost

 

 

 

 

选中要加载进来的NavGraph,点击确定

 

 

好的,现在我们就能跑起来了,但是点击按钮没反应,现在我们给按钮加上动作。这里我只贴了一个Fragment代码

package com.example.navigationdemo;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;

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

public class HomeFragment extends Fragment {

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

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

    @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
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //找到按钮
        Button button;
        button = getView().findViewById(R.id.button);
        //给按钮增加动作
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //找到我们当前的页面
                NavController controller = Navigation.findNavController(view);
                //控制跳转到细节页
                controller.navigate(R.id.action_homeFragment2_to_detailFragment3);
            }
        });
    }
}

现在我们没有返回按钮,就是标准的左上角有个箭头的那个返回

因为这个箭头是activity里的嘛,所以去activity里面写

package com.example.navigationdemo;

import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.fragment.NavHostFragment;
import androidx.navigation.ui.NavigationUI;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

        //给detailFragment加上返回按钮,但是还是没有动作  这个Fragment是activity_main里的navigationView的id
        NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView);
        NavController navController = navHostFragment.getNavController();
        NavigationUI.setupActionBarWithNavController(this,navController);
    }
    
    //返回按钮的动作
    @Override
    public boolean onSupportNavigateUp() {
        NavController controller = Navigation.findNavController(this,R.id.fragmentContainerView);
        return controller.navigateUp();
    }

}

 

posted @ 2021-09-29 10:10  涂妖教  阅读(400)  评论(0)    收藏  举报