android-- from manual access -> View Model-> Live Data-> Data Binding

  Today, learning the Android Jetpack framework, learning is very shallow, only to understand some of the basic content, but you can see the difference these basic content.

  Manual access: This is before the most basic architecture is what I have been learning with the architecture, but the structure of the code is not good maintenance, and data unprotected. Look at the example

  This is the initial screen, you can +1 and -1 operations, but if we rotate the screen, the screen will be initialized (activity will be rebuilt, and activity related to the life cycle) , when we rotate the screen re-initialization, this causing a loss of data.

 

  Code:

package com.example.basiclayout;

import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    int number = 0;
    TextView textView;
    Button button1,button2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
        textView.setText("aa");
        button1 = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText(String.valueOf(++number));
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText(String.valueOf(--number));
            }
        });
    }
}

 

 

 

  

  view Model:是Android Jetpack的一个类。用view Model数据不会丢失,把数据和界面分离。

  初始界面:,我们可以进行+1和+2操作,而且旋转屏幕数据不会丢失,即使回到主界面数据也不会丢失,,如果是左边的键就会丢失,如果是右键(回到主界面)就不会丢失。如下图

 

 

代码:

 

MainActivity类

 

 

 

package com.example.viewmodeltest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    MyViewModel myViewModel;
    TextView textView;
    Button button1,button2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        textView = findViewById(R.id.textView);
        textView.setText(String.valueOf(myViewModel.number));
        button1 = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myViewModel.number++;
                textView.setText(String.valueOf(myViewModel.number));
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myViewModel.number+=2;
                textView.setText(String.valueOf(myViewModel.number));
            }
        });
    }
}

 

  自己定义 View Model类,因为我只需要控制一个数。

package com.example.viewmodeltest;

import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {
    public  int number = 0;
}

  

  Live Data(感知数据变化、自动刷新界面):但数据发生变化时,我们可以给它加一个观察者,自动刷新界面上得数据,不需要通过textview来设置内容。 当然它也包括View Model的功能。

  这个和JAVA类相似,通过类中的函数改变值。

  初始画面:,点赞来实现数据的加减,而且反转,回到主界面,数据都不会丢失。

 

   

MainActivity
package com.example.lifedatatest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    ViewModelWithLiveData viewModelWithLiveData;
    TextView textView;
    ImageButton imageButtonLike,imageButtonDislike;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textview);
        imageButtonDislike = findViewById(R.id.imageButton2);
        imageButtonLike = findViewById(R.id.imageButton);
        viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData.class);
        // 对数进行观察
        viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() {
            @Override
            // 当数改变就会调用这个函数
            public void onChanged(Integer integer) {
                textView.setText(String.valueOf(integer));
            }
        });
        imageButtonLike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelWithLiveData.addNumber();
            }
        });
        imageButtonDislike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModelWithLiveData.reduceNumber();
            }
        });
    }
}

  View Model

package com.example.lifedatatest;

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

public class ViewModelWithLiveData extends ViewModel {
    private MutableLiveData<Integer> likedNumber;
    // 构造方法
    /*ViewModelWithLiveData(){
        likedNumber = new MutableLiveData<>();
        likedNumber.setValue(0);
    }*/
    // 也可以在get方法判断是否为空,若空则new一个
    public MutableLiveData<Integer> getLikedNumber() {
        if (likedNumber==null){
            likedNumber = new MutableLiveData<>();
            likedNumber.setValue(0);
        }
        return likedNumber;
    }
    public void addNumber(){
        likedNumber.setValue(likedNumber.getValue()+1);
    }
    public void reduceNumber(){
        likedNumber.setValue(likedNumber.getValue()-1);
    }
}
 

  Data Binding(数据绑定):将控制器和ViewGroup不建立之间的引用,通过Data Binding类实现它们之前的联系。使代码更加容易维护

 

 

   初始:,点击BUTTON:

 

 

MainActivity

 

 

package com.example.databinding;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.view.View;

import com.example.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding activityMainBinding;
    MyViewModel myViewModel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        activityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        //activity_main.xml里的控件都在activityMainBinding这里,这样就不用再声明控件了
        myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        activityMainBinding.setData(myViewModel);
        activityMainBinding.setLifecycleOwner(this);
    }
}

 

   View Model

  

package com.example.databinding;

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

import com.example.databinding.databinding.ActivityMainBinding;

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(){
        number.setValue(number.getValue()+1);
    }
}

  activity_main.xml

  

<?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="data"
            type="com.example.databinding.MyViewModel" />
    </data>

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

        <TextView
            android:id="@+id/textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(data.number)}"
            android:textSize="30sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.094" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            android:onClick="@{()->data.add()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

  极大的节省了代码量

 

    

 

  

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

  

  

Guess you like

Origin www.cnblogs.com/yangxiao-/p/12215581.html