jetpack----Navigation组件(导航) 让页面切换无比简单 03 更好的传值方式

 

 

 这张图很重要,讲了ViewModel能全局的在activity或者fragment传值

 

例子:拖动seekbar,在textview显示数字,点击按钮,把seekbar现在的数字带到下一个页面

 

想绑定数据,别忘了这行代码

dataBinding{
        enabled true
    }

然后点一下小灯泡改变布局,写数据

老规矩,写ViewModel

package com.example.navviewmodel;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {

    private MutableLiveData<Integer> number;

    public MutableLiveData<Integer> getNumber() {
        if (number == null){
            number = new MutableLiveData<>();
            number.setValue(0);
        }
        return number;
    }

    public void add(int x){
        if (number.getValue() < 0){
            number.setValue(0);
        }
        number.setValue(number.getValue()+x);
    }

}

创建两个fragment,然后创建Navigation资源文件,把两个fragment添加进来,该连线的连线,该点小房子的点小房子。

MasterFragment。 主界面
package com.example.navviewmodel;

import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;

import android.os.Bundle;

import androidx.annotation.NonNull;
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.SeekBar;

import com.example.navviewmodel.databinding.MasterFragmentBinding;

public class MasterFragment extends Fragment {

    private MyViewModel mViewModel;


    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        mViewModel = new ViewModelProvider(getActivity()).get(MyViewModel.class);
        MasterFragmentBinding binding;

        //fragment加载布局
        binding = DataBindingUtil.inflate(inflater,R.layout.master_fragment,container,false);

        binding.setData66(mViewModel);
        binding.setLifecycleOwner(getActivity());    //activity是this  fragment是getActivity,获取所依附的Activity

        //切换页面  点击按钮跳转到另一个fragment
        binding.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
          //navigate是导航的意思,通过导航控制去导航 NavController controller
= Navigation.findNavController(view); controller.navigate(R.id.action_masterFragment_to_detailFragment); } }); //SeekBar(拖动条) 对拖动条的监听 binding.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { mViewModel.getNumber().setValue(i); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); return binding.getRoot(); } }

DetailFragment
package com.example.navviewmodel;

import android.os.Bundle;

import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;

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

import com.example.navviewmodel.databinding.FragmentDetailBinding;


public class DetailFragment extends Fragment {

    public DetailFragment() {

    }

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //获取ViewModel
        MyViewModel myViewModel;
        myViewModel = new ViewModelProvider(getActivity()).get(MyViewModel.class);
        //获得双向绑定
        FragmentDetailBinding binding;
        binding = DataBindingUtil.inflate(inflater,R.layout.fragment_detail,container,false);
        //绑定数据和声明周期
        binding.setData66(myViewModel);
        binding.setLifecycleOwner(getActivity());

        return binding.getRoot();
    }

}

 

MasterFragment
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="data66"
            type="com.example.navviewmodel.MyViewModel" />
    </data>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MasterFragment">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView3"
                android:layout_width="244dp"
                android:layout_height="131dp"
                android:text="@{String.valueOf(data66.number)}"
                android:textAlignment="center"
                android:textSize="48sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.198" />

            <SeekBar
                android:id="@+id/seekBar"
                android:layout_width="0dp"
                android:layout_height="20dp"
                android:max="100"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/textView3"
                app:layout_constraintVertical_bias="0.306" />

            <Button
                android:id="@+id/button"
                android:layout_width="194dp"
                android:layout_height="102dp"
                android:text="Button"
                tools:layout_editor_absoluteX="124dp"
                tools:layout_editor_absoluteY="504dp"
                tools:ignore="MissingConstraints" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </FrameLayout>
</layout>

 

 
 

 

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