高端品牌网站建设的特点,做网站有什么好处吗,wordpress源码站整站源码,消防做ccc去那个网站一、ViewModel
1、基本介绍
ViewModel 属于 Android Jetpack 架构组件的一部分#xff0c;ViewModel 被设计用来存储和管理与 UI 相关的数据#xff0c;这些数据在配置更改#xff08;例如#xff0c;屏幕旋转#xff09;时能够幸存下来#xff0c;ViewModel 的生命周期与…一、ViewModel
1、基本介绍
ViewModel 属于 Android Jetpack 架构组件的一部分ViewModel 被设计用来存储和管理与 UI 相关的数据这些数据在配置更改例如屏幕旋转时能够幸存下来ViewModel 的生命周期与 Activity 或 Fragment 的生命周期紧密相关但比它们更长这意味着即使 Activity 或 Fragment 被重新创建ViewModel 中的数据也会保留下来它有如下特点配置更改时数据保留当屏幕旋转或发生其他配置更改时ViewModel 中的数据不会丢失生命周期管理ViewModel 在关联的 Activity 或 Fragment 被销毁时也会被清理但它在配置更改时会保留下来数据共享可以在多个 Fragment 或 Activity 之间共享同一个 ViewModel 实例以共享数据与 LiveData 配合使用ViewModel 通常与 LiveData 一起使用以便在数据发生变化时通知 UI 更新2、不使用 ViewModel
1Activity Layout
activity_view_model_no_use.xml
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.ViewModelNoUseActivityButtonandroid:idid/btn_addandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:onClickaddandroid:textaddandroid:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.498app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/tv_numandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text0android:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintVertical_bias0.35000002 //androidx.constraintlayout.widget.ConstraintLayout2Activity Code
ViewModelNoUseActivity.java
package com.my.viewmodel;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class ViewModelNoUseActivity extends AppCompatActivity {private TextView tvNum;private int num;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_view_model_no_use);tvNum findViewById(R.id.tv_num);}public void add(View view) {tvNum.setText(String.valueOf(num));}
}3、使用 ViewModel
1ViewModel
MyViewModel.java
package com.my.jetpackdemo.viewmodel;import androidx.lifecycle.ViewModel;public class MyViewModel extends ViewModel {public int num;
}2Activity Layout
activity_view_model_no_use.xml
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.ViewModelNoUseActivityButtonandroid:idid/btn_addandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:onClickaddandroid:textaddandroid:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.498app:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/tv_numandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text0android:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintVertical_bias0.35000002 //androidx.constraintlayout.widget.ConstraintLayout3Activity Code
ViewModelNoUseActivity.java
package com.my.viewmodel;import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;import android.os.Bundle;
import android.view.View;
import android.widget.TextView;import com.my.viewmodel.viewmodel.MyViewModel;public class ViewModelActivity extends AppCompatActivity {private TextView tvNum;private MyViewModel myViewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_view_model);tvNum findViewById(R.id.tv_num);myViewModel new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);tvNum.setText(String.valueOf(myViewModel.num));}public void add(View view) {tvNum.setText(String.valueOf(myViewModel.num));}
}二、LiveData
1、基本介绍
LiveData 是 Android Jetpack 架构组件中的一个类它用于在数据发生变化时通知观察者通常是 UI 组件LiveData 是一个可观察的数据持有者它与生命周期感知组件例如Activity、Fragment紧密集成这意味着它只会在这些组件处于活跃状态时更新观察者它有如下特点生命周期感知LiveData 只在有活跃的观察者时才会分发更新这有助于避免在组件例如Activity、Fragment不再可见时发生不必要的更新粘性事件LiveData 可以选择性地保留最后一个值并在新的观察者开始观察时立即发送该值粘性事件的行为这对于如登录状态、配置变化等需要即时知道当前状态的情况很有用线程安全可以在任何线程上修改 LiveData 的值而观察者会在主线程上接收到这些更新从而避免了直接操作 UI 组件的线程安全问题数据一致性LiveData 保证观察者会收到最新的数据即使它们是在数据变化之后开始观察的2、LiveData 方法方法说明setValue用于设置 LiveData 对象的新值当调用此方法时所有活动的观察者都会收到这个新值如果 LiveData 对象当前没有活动的观察者setValue 方法调用不会做任何事情但是一旦有观察者它将立即收到最近设置的值注setValue 方法应该在主线程上调用因为观察者会在主线程上接收更新getValue用于获取 LiveData 对象当前持有的值如果没有设置值则返回 nullpostValue另一个用于设置 LiveData 值的方法但它可以在任何线程上调用从非主线程更新 LiveData 时应该使用 postValue 方法而不是 setValue 方法postValue 方法会将更新操作安排到主线程上执行从而确保 UI 的更新是在主线程上进行的3、演示
1ViewModel
MyLiveData.java
package com.my.livedata.viewmodel;import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;public class MyLiveData extends ViewModel {private MutableLiveDataInteger currentSecond;public MutableLiveDataInteger getCurrentSecond() {if (currentSecond null) {currentSecond new MutableLiveData();currentSecond.setValue(0);}return currentSecond;}
}上述代码使用了 MutableLiveData 来存储和分发一个整数值它允许修改存储的值并通知观察者
2Activity Layout
activity_live_data.xml
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.LiveDataActivityTextViewandroid:idid/tv_current_secondandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text0android:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /
/androidx.constraintlayout.widget.ConstraintLayout3Activity Code
LiveDataActivity.java
package com.my.livedata;import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;import android.os.Bundle;
import android.widget.TextView;import com.my.livedata.viewmodel.MyLiveData;import java.util.Timer;
import java.util.TimerTask;public class LiveDataActivity extends AppCompatActivity {private TextView tvCurrentSecond;private MyLiveData myLiveData;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_live_data);tvCurrentSecond findViewById(R.id.tv_current_second);myLiveData new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyLiveData.class);myLiveData.getCurrentSecond().observe(this, new ObserverInteger() {Overridepublic void onChanged(Integer integer) {tvCurrentSecond.setText(String.valueOf(integer));}});startTimer();}private void startTimer() {new Timer().schedule(new TimerTask() {Overridepublic void run() {myLiveData.getCurrentSecond().postValue(myLiveData.getCurrentSecond().getValue() 1);}}, 1000, 1000);}
}observe 方法用来观察 LiveDataViewModel 中的 currentSecond当 currentSecond 的值改变时onChanged 方法会被调用postValue 方法用来更新 LiveDataViewModel 中的 currentSecond 的值4、LiveData 优化
1ViewModel
MyAnotherLiveData.java
package com.my.livedata.viewmodel;import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;public class MyAnotherLiveData extends ViewModel {private MutableLiveDataInteger currentSecond new MutableLiveData(0);public LiveDataInteger getCurrentSecond() {return currentSecond;}public Integer getValue() {return currentSecond.getValue();}public void setValue(Integer integer) {currentSecond.setValue(integer);}public void postValue(Integer integer) {currentSecond.postValue(integer);}
}2Activity Layout
activity_another_live_data.xml
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.AnotherLiveDataActivityTextViewandroid:idid/tv_current_secondandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text0android:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /
/androidx.constraintlayout.widget.ConstraintLayout3Activity Code
AnotherLiveDataActivity.java
package com.my.livedata;import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;import android.os.Bundle;
import android.widget.TextView;import com.my.livedata.viewmodel.MyAnotherLiveData;import java.util.Timer;
import java.util.TimerTask;public class AnotherLiveDataActivity extends AppCompatActivity {private TextView tvCurrentSecond;private MyAnotherLiveData myAnotherLiveData;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_another_live_data);tvCurrentSecond findViewById(R.id.tv_current_second);myAnotherLiveData new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyAnotherLiveData.class);myAnotherLiveData.getCurrentSecond().observe(this, (integer) - {tvCurrentSecond.setText(String.valueOf(integer));});startTimer();}private void startTimer() {new Timer().schedule(new TimerTask() {Overridepublic void run() {myAnotherLiveData.postValue(myAnotherLiveData.getValue() 1);}}, 1000, 1000);}
}5、Fragment 通信
1ViewModel
SeekBarViewModel.java
package com.my.jetpackdemo.viewmodel;import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;public class SeekBarViewModel extends ViewModel {private MutableLiveDataInteger process;public MutableLiveDataInteger getProcess() {if (process null) {process new MutableLiveData();process.setValue(0);}return process;}
}2Fragment
fragment_first.xml
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.fragment.FirstFragmentSeekBarandroid:idid/seek_bar_firstandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:max100android:min0app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /
/androidx.constraintlayout.widget.ConstraintLayoutFirstFragment.java
package com.my.livedata.fragment;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SeekBar;import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;import com.my.livedata.R;
import com.my.livedata.viewmodel.SeekBarViewModel;public class FirstFragment extends Fragment {Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View root inflater.inflate(R.layout.fragment_first, null, false);SeekBar seekBarFirst root.findViewById(R.id.seek_bar_first);SeekBarViewModel seekBarViewModel new ViewModelProvider(getActivity(),new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication())).get(SeekBarViewModel.class);seekBarViewModel.getProcess().observe(getActivity(), new ObserverInteger() {Overridepublic void onChanged(Integer integer) {seekBarFirst.setProgress(integer);}});seekBarFirst.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {seekBarViewModel.setValue(progress);}Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});return root;}
}fragment_second.xml
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.fragment.SecondFragmentSeekBarandroid:idid/seek_bar_secondandroid:layout_width0dpandroid:layout_heightwrap_contentandroid:max100android:min0app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /
/androidx.constraintlayout.widget.ConstraintLayoutSecondFragment.java
package com.my.livedata.fragment;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SeekBar;import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;import com.my.livedata.R;
import com.my.livedata.viewmodel.SeekBarViewModel;public class SecondFragment extends Fragment {Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View root inflater.inflate(R.layout.fragment_second, null, false);SeekBar seekBarSecond root.findViewById(R.id.seek_bar_second);SeekBarViewModel seekBarViewModel new ViewModelProvider(getActivity(),new ViewModelProvider.AndroidViewModelFactory(getActivity().getApplication())).get(SeekBarViewModel.class);seekBarViewModel.getProcess().observe(getActivity(), new ObserverInteger() {Overridepublic void onChanged(Integer integer) {seekBarSecond.setProgress(integer);}});seekBarSecond.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {seekBarViewModel.setValue(progress);}Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});return root;}
}3Activity Layout
activity_live_data_fragment.xml
?xml version1.0 encodingutf-8?
androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.LiveDataFragmentActivityandroidx.constraintlayout.widget.Guidelineandroid:idid/glandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalapp:layout_constraintGuide_end365dp /androidx.fragment.app.FragmentContainerViewandroid:idid/fcv1android:namecom.my.livedata.fragment.FirstFragmentandroid:layout_width0dpandroid:layout_height0dpapp:layout_constraintBottom_toTopOfid/glapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /androidx.fragment.app.FragmentContainerViewandroid:idid/fcv2android:namecom.my.livedata.fragment.SecondFragmentandroid:layout_width0dpandroid:layout_height0dpapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfid/gl /
/androidx.constraintlayout.widget.ConstraintLayout4Activity Code
LiveDataFragmentActivity.java
package com.my.livedata;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class LiveDataFragmentActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_live_data_fragment);}
}三、数据绑定
1、基本介绍
Android DataBinding 是一种布局书写方式它允许将数据直接绑定到布局的 XML 中使得数据的变化能够直接反映到 View 上这是 Android团队实现 MVVM 架构的一种方法旨在减少 Android 开发中的大量模板代码例如findViewById()增加代码及逻辑清晰度提高开发效率和维护效率
2、演示
1Setting
模块级 build.gradle
android {...defaultConfig {...dataBinding {enabled true}}
}2Entity
Idol.java
package com.my.jetpackdemo.entity;public class Idol {public String name;public String star;public Idol(String name, String star) {this.name name;this.star star;}
}3Activity Layout
activity_data_binding.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameidoltypecom.my.databinding.entity.Idol //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.DataBindingActivityandroidx.constraintlayout.widget.Guidelineandroid:idid/glandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalapp:layout_constraintGuide_percent0.5 /TextViewandroid:idid/tv_idol_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ idol.name }android:textSize20spapp:layout_constraintBottom_toTopOfid/glapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/tv_idol_starandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ idol.star }android:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfid/gl //androidx.constraintlayout.widget.ConstraintLayout
/layout4Activity Code
DataBindingActivity.java
package com.my.databinding;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;import com.my.databinding.databinding.ActivityDataBindingBinding;
import com.my.databinding.entity.Idol;public class DataBindingActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityDataBindingBinding activityDataBindingBinding DataBindingUtil.setContentView(this, R.layout.activity_data_binding);Idol idol new Idol(张学友, 五星);activityDataBindingBinding.setIdol(idol);}
}3、更多用法
1Entity
User.java
package com.my.databinding.entity;public class User {public String name;public int star;public User(String name, int star) {this.name name;this.star star;}
}2Listener
EventHandleListener.java
package com.my.databinding.listener;import android.content.Context;
import android.view.View;
import android.widget.Toast;public class EventHandleListener {private Context context;public EventHandleListener(Context context) {this.context context;}public void btnOnClick(View view) {Toast.makeText(context, 点赞, Toast.LENGTH_SHORT).show();}
}3Util
UserUtil.java
package com.my.jetpackdemo.util;public class UserUtil {public static String getStar(int star) {switch (star) {case 1:return 一星;case 2:return 一星;case 3:return 三星;case 4:return 四星;case 5:return 五星;}return 零星;}
}4Activity Layout
activity_user.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameusertypecom.my.databinding.entity.User /variablenameeventHandleListenertypecom.my.databinding.listener.EventHandleListener /import typecom.my.databinding.util.UserUtil //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.UserActivityandroidx.constraintlayout.widget.Guidelineandroid:idid/guideline2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalapp:layout_constraintGuide_end365dp /TextViewandroid:idid/tv_user_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ user.name }android:textSize20spapp:layout_constraintBottom_toTopOfid/guideline2app:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/tv_user_starandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ UserUtil.getStar(user.star) }android:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfid/guideline2 /Buttonandroid:idid/btn_likeandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text点赞android:textSize20spandroid:onClick{ eventHandleListener.btnOnClick }app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintHorizontal_bias0.498app:layout_constraintStart_toStartOfparentapp:layout_constraintVertical_bias0.508 //androidx.constraintlayout.widget.ConstraintLayout
/layout5Activity Code
UserActivity.java
package com.my.databinding;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;import com.my.databinding.databinding.ActivityUserBinding;
import com.my.databinding.listener.EventHandleListener;
import com.my.databinding.entity.User;public class UserActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_user);ActivityUserBinding activityUserBinding DataBindingUtil.setContentView(this, R.layout.activity_user);User user new User(张三, 3);activityUserBinding.setUser(user);EventHandleListener eventHandleListener new EventHandleListener(this);activityUserBinding.setEventHandleListener(eventHandleListener);}
}4、二级页面数据绑定
1Entity
package com.my.databinding.entity;public class User {public String name;public int star;public User(String name, int star) {this.name name;this.star star;}
}2Util
UserUtil.java
package com.my.jetpackdemo.util;public class UserUtil {public static String getStar(int star) {switch (star) {case 1:return 一星;case 2:return 一星;case 3:return 三星;case 4:return 四星;case 5:return 五星;}return 零星;}
}3Activity Layout
user_son1.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameusertypecom.my.databinding.entity.User //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentTextViewandroid:idid/son_tv_user_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ user.name }android:textColor#E91E63android:textSize24spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent //androidx.constraintlayout.widget.ConstraintLayout
/layoutuser_son2.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameusertypecom.my.databinding.entity.User /import typecom.my.databinding.util.UserUtil //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentTextViewandroid:idid/son_tv_user_starandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ UserUtil.getStar(user.star) }android:textColor#E91E63android:textSize20spapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent //androidx.constraintlayout.widget.ConstraintLayout
/layoutactivity_user_father.java
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameuser1typecom.my.databinding.entity.User /variablenameuser2typecom.my.databinding.entity.User //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.UserFatherActivityandroidx.constraintlayout.widget.Guidelineandroid:idid/glandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:orientationhorizontalapp:layout_constraintGuide_percent0.5 /includelayoutlayout/user_son1app:user{ user1 }android:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toTopOfid/glapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /includelayoutlayout/user_son2app:user{ user2 }android:layout_widthwrap_contentandroid:layout_heightwrap_contentapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfid/gl //androidx.constraintlayout.widget.ConstraintLayout
/layout4Activity Code
UserFatherActivity.java
package com.my.databinding;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;import android.os.Bundle;import com.my.databinding.databinding.ActivityUserFatherBinding;
import com.my.databinding.entity.User;public class UserFatherActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityUserFatherBinding activityUserFatherBinding DataBindingUtil.setContentView(this, R.layout.activity_user_father);User user1 new User(张三, 3);User user2 new User(李四, 4);activityUserFatherBinding.setUser1(user1);activityUserFatherBinding.setUser2(user2);}
}5、RecyclerView 数据绑定
1Entity
Student.java
package com.my.databinding.entity;public class Student {public String name;public int age;public Student(String name, int age) {this.name name;this.age age;}public String getAgeStr() {return age ;}
}2Activity Layout
recycler_view_binding_item.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenamestudenttypecom.my.databinding.entity.Student //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:background#03A9F4android:paddingTop25dpandroid:paddingBottom25dpTextViewandroid:idid/tv_nameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text{ student.name }android:textSize24spapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparent /TextViewandroid:idid/tv_ageandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_marginTop25dpandroid:text{ student.ageStr }android:textSize20spapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/tv_name //androidx.constraintlayout.widget.ConstraintLayout
/layoutactivity_recycler_view_binding.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:contextcom.my.databinding.RecyclerViewBindingActivityandroidx.recyclerview.widget.RecyclerViewandroid:idid/rvandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:ignoreMissingConstraintstools:layout_editor_absoluteX1dptools:layout_editor_absoluteY1dp //androidx.constraintlayout.widget.ConstraintLayout
/layout3Adapter
RecyclerViewBindingAdapter.java
package com.my.databinding.adapter;import android.view.LayoutInflater;
import android.view.ViewGroup;import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;import com.my.databinding.R;
import com.my.databinding.databinding.RecyclerViewBindingItemBinding;
import com.my.databinding.entity.Student;import java.util.List;public class RecyclerViewBindingAdapter extends RecyclerView.AdapterRecyclerViewBindingAdapter.MyViewHolder {ListStudent studentList;public RecyclerViewBindingAdapter(ListStudent studentList) {this.studentList studentList;}NonNullOverridepublic MyViewHolder onCreateViewHolder(NonNull ViewGroup parent, int viewType) {RecyclerViewBindingItemBinding recyclerViewBindingItemBinding DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),R.layout.recycler_view_binding_item, parent, false);return new MyViewHolder(recyclerViewBindingItemBinding);}Overridepublic void onBindViewHolder(NonNull MyViewHolder holder, int position) {Student student studentList.get(position);holder.recyclerViewBindingItemBinding.setStudent(student);}Overridepublic int getItemCount() {return studentList.size();}static class MyViewHolder extends RecyclerView.ViewHolder {private RecyclerViewBindingItemBinding recyclerViewBindingItemBinding;public MyViewHolder(RecyclerViewBindingItemBinding recyclerViewBindingItemBinding) {super(recyclerViewBindingItemBinding.getRoot());this.recyclerViewBindingItemBinding recyclerViewBindingItemBinding;}}
}4Activity Code
RecyclerViewBindingActivity.java
package com.my.databinding;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import com.my.databinding.adapter.RecyclerViewBindingAdapter;
import com.my.databinding.databinding.ActivityRecyclerViewBindingBinding;
import com.my.databinding.entity.Student;import java.util.ArrayList;
import java.util.List;public class RecyclerViewBindingActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityRecyclerViewBindingBinding activityRecyclerViewBindingBinding DataBindingUtil.setContentView(this, R.layout.activity_recycler_view_binding);LinearLayoutManager linearLayoutManager new LinearLayoutManager(this);activityRecyclerViewBindingBinding.rv.setLayoutManager(linearLayoutManager);ListStudent studentList new ArrayList();studentList.add(new Student(jack, 18));studentList.add(new Student(smith, 19));studentList.add(new Student(tom, 20));RecyclerViewBindingAdapter recyclerViewBindingAdapter new RecyclerViewBindingAdapter(studentList);activityRecyclerViewBindingBinding.rv.setAdapter(recyclerViewBindingAdapter);}
}四、双向数据绑定
2、演示
1Entity
Info.java
package com.my.databinding.entity;public class Info {public String username;public String password;public Info(String username, String password) {this.username username;this.password password;}
}2viewModel
InfoViewModel.java
package com.my.databinding.viewmodel;import android.util.Log;import androidx.databinding.BaseObservable;
import androidx.databinding.Bindable;import com.my.databinding.BR;
import com.my.databinding.entity.Info;public class InfoViewModel extends BaseObservable {private Info info;public InfoViewModel(Info info) {this.info info;}Bindablepublic String getUsername() {return info.username;}public void setUsername(String username) {if (username ! null !username.equals(info.username)) {info.username username;Log.d(my , setUsername: info.username);notifyPropertyChanged(BR.username);}}Bindablepublic String getPassword() {return info.password;}public void setPassword(String password) {if (password ! null !password.equals(info.password)) {info.password password;Log.d(my , setPassword: info.password);notifyPropertyChanged(BR.password);}}
}3Activity Layout
activity_data_binding_two.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameinfoViewModeltypecom.my.databinding.viewmodel.InfoViewModel //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.DataBindingTwoActivityEditTextandroid:idid/et_usernameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:ems10android:inputTypetextPersonNameandroid:text{ infoViewModel.username }app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintVertical_bias0.1 /EditTextandroid:idid/et_passwordandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:ems10android:inputTypetextPersonNameandroid:text{ infoViewModel.password }app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/et_usernameapp:layout_constraintVertical_bias0.2 //androidx.constraintlayout.widget.ConstraintLayout
/layout4Activity Code
DataBindingTwoActivity.java
package com.my.databinding;import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;import com.my.databinding.databinding.ActivityDataBindingTwoBinding;
import com.my.databinding.viewmodel.InfoViewModel;
import com.my.databinding.entity.Info;public class DataBindingTwoActivity extends AppCompatActivity {private InfoViewModel infoViewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityDataBindingTwoBinding activityDataBindingTwoBinding DataBindingUtil.setContentView(this, R.layout.activity_data_binding_two);Info info new Info(123, 456);infoViewModel new InfoViewModel(info);activityDataBindingTwoBinding.setInfoViewModel(infoViewModel);test();}public void test() {new Thread(() - {try {Thread.sleep(5000);infoViewModel.setUsername(112233);infoViewModel.setPassword(445566);} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}3、另一种实现演示
1Entity
Info.java
package com.my.databinding.entity;public class Info {public String username;public String password;public Info(String username, String password) {this.username username;this.password password;}
}2viewModel
package com.my.databinding.viewmodel;import android.util.Log;import androidx.databinding.ObservableField;import com.my.databinding.entity.Info;public class AnotherInfoViewModel {public ObservableFieldString username;public ObservableFieldString password;public AnotherInfoViewModel(Info info) {username new ObservableField(info.username);password new ObservableField(info.password);}public String getUsername_() {return username.get();}public void setUsername_(String username) {Log.d(my , setUsername: username);this.username.set(username);}public String getPassword_() {return password.get();}public void setPassword_(String password) {Log.d(my , setPassword: password);this.password.set(password);}
}3Activity Layout
activity_data_binding_two_another.xml
?xml version1.0 encodingutf-8?
layout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsdatavariablenameanotherInfoViewModeltypecom.my.databinding.viewmodel.AnotherInfoViewModel //dataandroidx.constraintlayout.widget.ConstraintLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:contextcom.my.databinding.DataBindingTwoAnotherActivityEditTextandroid:idid/et_usernameandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:ems10android:inputTypetextPersonNameandroid:text{ anotherInfoViewModel.username }app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toTopOfparentapp:layout_constraintVertical_bias0.1 /EditTextandroid:idid/et_passwordandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:ems10android:inputTypetextPersonNameandroid:text{ anotherInfoViewModel.password }app:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparentapp:layout_constraintTop_toBottomOfid/et_usernameapp:layout_constraintVertical_bias0.2 /Buttonandroid:idid/btn_changeandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textChangeapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintEnd_toEndOfparentapp:layout_constraintStart_toStartOfparent //androidx.constraintlayout.widget.ConstraintLayout
/layout4Activity Code
DataBindingTwoAnotherActivity.java
package com.my.databinding;import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;import android.os.Bundle;import com.my.databinding.databinding.ActivityDataBindingTwoAnotherBinding;
import com.my.databinding.entity.Info;
import com.my.databinding.viewmodel.AnotherInfoViewModel;public class DataBindingTwoAnotherActivity extends AppCompatActivity {private AnotherInfoViewModel anotherInfoViewModel;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityDataBindingTwoAnotherBinding activityDataBindingTwoAnotherBinding DataBindingUtil.setContentView(this, R.layout.activity_data_binding_two_another);Info info new Info(123, 456);anotherInfoViewModel new AnotherInfoViewModel(info);activityDataBindingTwoAnotherBinding.setAnotherInfoViewModel(anotherInfoViewModel);findViewById(R.id.btn_change).setOnClickListener((v) - {anotherInfoViewModel.setUsername_(112233);anotherInfoViewModel.setPassword_(445566);});test();}public void test() {new Thread(() - {try {Thread.sleep(5000);anotherInfoViewModel.setUsername_(112233);anotherInfoViewModel.setPassword_(445566);} catch (InterruptedException e) {e.printStackTrace();}}).start();}
}