使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定

在我之前写的系列文章中,继续深化Android数据绑定技术的使用。
结合常用的SeekBar,实现用Android DataBinding数据绑定技术,设置从数据模型的值修改SeekBar的进度,以及实现常见的SeekBar拖动时候的进度回写到数据model中。也就是说,当用户手动拖动SeekBar这一View时候,View产生的结果,回写到我们建立的model中。


先任意建立一个数据模型Progress.java:

package zhangphil.test;import android.databinding.BaseObservable;import android.databinding.ObservableInt;/** * Created by Phil on 2017/9/4. */public class Progress extends BaseObservable {    public final ObservableInt porgress = new ObservableInt();}



写布局,activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>                                        





关键的PhilSeekBar.java:

package zhangphil.test;import android.content.Context;import android.databinding.BindingAdapter;import android.databinding.InverseBindingAdapter;import android.databinding.InverseBindingListener;import android.util.AttributeSet;import android.util.Log;import android.widget.SeekBar;/** * Created by Phil on 2017/9/4. */public class PhilSeekBar extends SeekBar {    private static 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) {                //触发反向数据的传递                if (mInverseBindingListener != null) {                    mInverseBindingListener.onChange();                }            }            @Override            public void onStartTrackingTouch(SeekBar seekBar) {            }            @Override            public void onStopTrackingTouch(SeekBar seekBar) {            }        });    }    @BindingAdapter(value = "philprogress", requireAll = false)    public static void setPhilProgress(PhilSeekBar seekBar, int progress) {        if (getPhilProgress(seekBar) != progress) {            seekBar.setProgress(progress);        }    }    @InverseBindingAdapter(attribute = "philprogress", event = "philprogressAttrChanged")    public static int getPhilProgress(PhilSeekBar seekBar) {        return seekBar.getProgress();    }    @BindingAdapter(value = {"philprogressAttrChanged"}, requireAll = false)    public static void setPhilProgressAttrChanged(PhilSeekBar seekBar, InverseBindingListener inverseBindingListener) {        if (inverseBindingListener == null) {            Log.e("错误!", "InverseBindingListener为空!");        } else {            mInverseBindingListener = inverseBindingListener;        }    }}





测试的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);        Progress progress = new Progress();        binding.setProgress(progress);        //设置一个初始值作为演示 数据 -> View        //这是最常见的进度设置。        progress.porgress.set(21);    }}







代码运行结果,初始化:








当手指拖动SeekBar时候,进度值回写到Progress的progress中,也再TextView中得到反应:


更多相关文章

  1. android中的sqlite数据库加密
  2. SwipeRefreshLayout 配合fragment 下拉刷新的使用,超级简单
  3. Android系统多媒体框架添加对.wma格式的支持
  4. Android(安卓)studio登录界面之记住密码
  5. Android中的Adapter 详解(一)
  6. Android之玩转MPAndroidChart让(折线图、柱形图、饼状图、散列图
  7. 关于Android短信管理
  8. 分析Content Providers用法【转】
  9. mybatisplus的坑 insert标签insert into select无参数问题的解决

随机推荐

  1. Android(安卓)cts测试命令
  2. Android在外部修改了工程名文件夹名称,报
  3. Android项目初始时的文件
  4. android 使用AsyncTask代替thread进行网
  5. Android(安卓)UI控件Spinner控件的学习
  6. Android(安卓)webview 自动填值和提交
  7. Android(安卓)运行时权限
  8. 背景及边框处理
  9. [CSDN]Android应用程序启动过程源代码分
  10. Android(安卓)Bitmap.setDensity(int den