基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定-阿里云开发者社区

开发者社区> 开开心心过> 正文

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

简介: 基于Android DataBinding的InverseBindingMethod改进SeekBar双向绑定(正向/反向)数据绑定 在前文《使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定》(链接:http://blog.csdn.net/zhangphil/article/details/77839555 )基础上,用InverseBindingMethod改进双向绑定实现方案。
+关注继续查看
基于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"?>
<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.PhilProgress" />
    </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:progress="@={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>



测试的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可以解决这个问题。


手指拖动后的结果显示:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据结构之树、森林和二叉树的转换
树转换为二叉树 (1)加线。在所有兄弟结点之间加一条连线。 (2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。
759 0
解密阿里数据中台女程序员聆一、萨若代码诗!
2018年已过,我们迎来了新的一年,在机遇与挑战同在的环境下,我们更应勤于学习。为了方便大家学习,小编为大家盘点了2018年数据技术及产品部云栖号最火的干货文章分享给大家,让我们在新的一年里共同学习和成长! 数据中台 云栖号简介: 数据中台的概念由阿里巴巴首次提出,它是一个承接技术,引领业务,构建规范定义的、全域可连接萃取的、智慧的数据处理平台,建设目标是为了高效满足前台数据分析和应用的需求。
10057 0
2假动作,数据缓冲,CCEaseExponential,CCEaseElastic,CCEaseBounce,CCCallFunc,funcNCallBack,funcNDCallBack,funcO
 1 缓冲动作 man-&gt;setScale(0.8f); woman-&gt;setScale(0.8f); man-&gt;setPosition(ccp(100, 80)); woman-&gt;setPosition(ccp(100,240)); CCMoveTo
927 0
mono for android 绑定log4j错误提示
错误 1 “Org.Apache.Log4j.AsyncAppender”不实现继承的抽象成员“Org.Apache.Log4j.AppenderSkeleton.Append(Org.
479 0
编程实战——电影管理器之XML存储电影信息数据
但凡管理器之类的软件,存储数据是必不可少的。存储数据的话,有几种选择。一是用数据库,把数据存储到数据库里;一是用文本文件,把数据存储到文本文件里;一种是利用XML文件,把数据对象转换为XML后,存储到XML文件(实际上也是文本文件)。
723 0
袋鼠云数据中台专栏V2.0 | 数据中台之数据集成
关于袋鼠云数据中台专栏V2.0 数据中台如何定义?企业数据化与数据中台的关系是什么?数据中台如何支撑企业战略转型?袋鼠云近两年来,先后为国内数十家大型龙头企业提供数据中台咨询与实施落地服务,积累了大量的实战经验,同时也在为客户服务的过程中,不断完善和升华自身的数据中台理论体系和实践方法论。
4435 0
682
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载
《2021云上架构与运维峰会演讲合集》
立即下载