当前位置: 首页 > news >正文

高端品牌网站建设的特点做网站有什么好处吗

高端品牌网站建设的特点,做网站有什么好处吗,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();} }
http://www.zqtcl.cn/news/567441/

相关文章:

  • 做网站 工资高吗免费建站的站点网站
  • 个人做营利性质网站会怎么样qq邮箱官方网站
  • 网站怎么做等级保护产品展示小程序
  • 奉贤网站建设专家高端自适应网站设计
  • 网站正在建设中 动态徐州网站建设方案咨询
  • 广东世纪达建设集团有限公司官方网站专业电商网站开发
  • 抚顺建设网站自适应网站建设推荐
  • 做网站的大公司手机页面
  • 网站建设的公司实习做什么系统设计
  • 兰州网站设计哪个平台好外贸网站定制公司哪家好
  • 做网站需要先买域名吗在线音乐网站开发数据库
  • 深圳优化网站搬家网站模板
  • 网站建设做的人多吗门户网站制作建设
  • 哪个网站可以做logo怀柔网页公司制作
  • 网站被抄袭怎么投诉网站建设丨金手指15
  • 中国交建平台seo搜索引擎优化是通过优化答案
  • 简述网站的建设流程图食品网站app建设方案
  • 西安建设厅网站首页听说上海又要封了
  • 兼职python做网站如何制作一个网站包含多个网页
  • 花园桥网站建设百度怎么创建网站
  • 做网站 客户一直要求改做网站学不需要做后台管理系统
  • 企业网站托管电话输入姓名查询个人征信
  • 域名注册了后怎么建设网站荆州市建设厅网站
  • 厦门网站建设合同wordpress的设置网址
  • 澎湃动力网站建设公司门户类网站建设需要多少钱
  • 祭祖网站怎么做咨询类网站开发的意义
  • 简书网站开发热门电影推荐
  • 中学教材数字化学习资源的建设——教材配套网站的设计及发展趋势建网站 发信息 做推广
  • 怎么写网站建设方案书制做网站的公司
  • 服务网站 建设原则游戏服务器租用多少钱一年