基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定
16lz
2021-01-23
基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定
在前文《使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定》(链接:http://blog.csdn.net/zhangphil/article/details/77839555 )基础上,用InverseBindingMethod改进双向绑定实现方案。
老规矩,先建立数据模型,PhilProgress.java:
代码初始运行结果:
注意到虽然进度条显示到了21,但是却没有彩色着色,在PhilSeekBar的setProgress方法里面,启用super.setProgress可以解决这个问题。
手指拖动后的结果显示:
在前文《使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定》(链接:http://blog.csdn.net/zhangphil/article/details/77839555 )基础上,用InverseBindingMethod改进双向绑定实现方案。
老规矩,先建立数据模型,PhilProgress.java:
package zhangphil.test;import android.databinding.BaseObservable;import android.databinding.ObservableInt;/** * Created by Phil on 2017/9/4. */public class PhilProgress extends BaseObservable { public ObservableInt porgress = new ObservableInt();}
重写SeekBar,PhilSeekBar.java:
package zhangphil.test;import android.content.Context;import android.databinding.InverseBindingListener;import android.databinding.InverseBindingMethod;import android.databinding.InverseBindingMethods;import android.util.AttributeSet;import android.util.Log;import android.widget.SeekBar;/** * Created by Phil on 2017/9/4. */@InverseBindingMethods({@InverseBindingMethod(type = PhilSeekBar.class, attribute = "progress", event = "progressAttrChanged")})public class PhilSeekBar extends SeekBar { private String TAG = "调试输出"; private int progress = 0; private InverseBindingListener mInverseBindingListener; public PhilSeekBar(Context context, AttributeSet attrs) { super(context, attrs); this.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { progress = i; //触发反向数据的传递 if (mInverseBindingListener != null) { mInverseBindingListener.onChange(); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } public void setProgress(int p) { Log.d(TAG, "setProgress:" + p); if (progress != p) { progress = p; //这一句代码可以解决初始化阶段进度条显示的值正确,但没有及时更新UI的问题。 //super.setProgress(progress); } } public int getProgress() { Log.d(TAG, "getProgress:" + progress); return progress; } public void setProgressAttrChanged(InverseBindingListener inverseBindingListener) { if (inverseBindingListener != null) { mInverseBindingListener = inverseBindingListener; } }}
写布局activity_main.xml使用PhilSeekBar:
<?xml version="1.0" encoding="utf-8"?>
测试的MainActivity.java:
package zhangphil.test;import android.app.Activity;import android.databinding.DataBindingUtil;import android.os.Bundle;import zhangphil.test.databinding.ActivityMainBinding;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final PhilProgress progress = new PhilProgress(); binding.setProgress(progress); //设置一个初始值作为演示 数据 -> View //这是最常见的进度设置。 progress.porgress.set(21); }}
代码初始运行结果:
注意到虽然进度条显示到了21,但是却没有彩色着色,在PhilSeekBar的setProgress方法里面,启用super.setProgress可以解决这个问题。
手指拖动后的结果显示:
更多相关文章
- Android应用程序绑定服务(bindService)的过程
- android 面向对象数据库 db40使用demo
- android中清空一个表---类似truncate table 表名 这样的功能 and
- Android 5种方式存储数据:
- Android Linux Socket 数据传输错误
- 关于android 多媒体数据库
- GreenDao —— 简单快速操作 Android SQLite 数据库
- android对json数据的解析