基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定

在前文《使用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);    }}



代码初始运行结果:
基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定_第1张图片
注意到虽然进度条显示到了21,但是却没有彩色着色,在PhilSeekBar的setProgress方法里面,启用super.setProgress可以解决这个问题。


手指拖动后的结果显示:
基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定_第2张图片

更多相关文章

  1. Android应用程序绑定服务(bindService)的过程
  2. android 面向对象数据库 db40使用demo
  3. android中清空一个表---类似truncate table 表名 这样的功能 and
  4. Android 5种方式存储数据:
  5. Android Linux Socket 数据传输错误
  6. 关于android 多媒体数据库
  7. GreenDao —— 简单快速操作 Android SQLite 数据库
  8. android对json数据的解析

随机推荐

  1. 与spinner有关的样式
  2. android短信和彩信探秘threads
  3. android音乐播放器常见操作
  4. android 获取 imei号码以及其他信息
  5. android 状态栏移动到底部
  6. Android三种方法设置ImageView的图片
  7. Android中启动动画源码讲解
  8. android theme中的各个color的含义
  9. android设备添加F1-F12按键功能
  10. android学习网站