使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定
2017-09-04 17:16
696 查看
使用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:
关键的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:
代码运行结果,初始化:
当手指拖动SeekBar时候,进度值回写到Progress的progress中,也再TextView中得到反应:
在我之前写的系列文章中,继续深化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"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="progress" type="zhangphil.test.Progress" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <zhangphil.test.PhilSeekBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="30dp" app:philprogress="@={progress.porgress}" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="@{String.valueOf(progress.porgress)}" android:textColor="@android:color/holo_blue_light" android:textSize="50dp" /> </LinearLayout> </layout>
关键的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中得到反应:
相关文章推荐
- 使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定
- 基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定
- 基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定
- Android官方DataBinding(十二):双向绑定之反向绑定的InverseBindingMethods改造和实现
- Android官方DataBinding(十二):双向绑定之反向绑定的InverseBindingMethods改造和实现
- Android官方DataBinding(十):双向绑定之基于InverseBindingAdapter的反向绑定
- Android官方DataBinding(十):双向绑定之基于InverseBindingAdapter的反向绑定
- Android采用ListView实现数据列表显示1-使用SimpleCursorAdapter进行数据绑定
- Android中ListView同过自定义布局并使用SimpleAdapter的方式实现数据的绑定
- RoboBinding:一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架
- Android采用ListView实现数据列表显示2-使用SimpleAdapter进行数据绑定
- android数据绑定框架DataBinding使用
- 使用原生js onkeyup+jQuery实现简单的双向数据绑定
- Android官方DataBinding(九):反向绑定,View变化结果回写进数据模型中
- android ListView布局之三(使用自定义的Adapter绑定数据,通过contextView.setTag绑定数据)有按钮的ListView
- 使用angular实现双向数据绑定
- Android DataBinding数据绑定技术在传统ListView中的使用简例
- Android DataBinding数据绑定技术在传统ListView中的使用简例
- Binding 指令实现双向数据绑定
- jface databinding:重写doSetValue方法ComputedValue实现双向多对一的数据绑定