Android Data Binding简单示例

写这篇文章是为了Android课小论文,现在选摘部分,如果老师看到不要认为我论文抄这篇

Android中的页面布局和很多基本设定是靠xml来描述的,所以当我们从第一个Activity开始写逻辑控制的时候,第一步基本上都是使用findViewById,如果页面的布局较为负载,各种控件较多,就会造成findViewById需要写很多,代码耦合很高,因此说Activity基本上都是View和Controller的合体,既要负责视图的显示又要加入控制逻辑,承担的功能过多,代码量大也就不足为奇。现在使用Data Binding就可以较好的降低代码的耦合度。

简单的一个例子,假设有一个User类,包括name,现在要在TextView中显示,传统的写法自然是findViewById绑定TextView,然后创建User实例,对TextView进行setText操作,但是如果很多地方都使用这一个实例的话,就会造成要对很多TextView进行setText操作,现在就使用Data Binding解决这个问题。

  • Module中开启Data Binding
dataBinding {    
       enabled = true
}
  • User类
public class User extends BaseObservable {    
      private String name;    
      public User(String name) {        
          this.name = name;    
      }    

      @Bindable    
      public String getName() {        
          return name;    
      }    

      public void setName(String name) {        
          this.name = name;             
          notifyPropertyChanged(BR.name);   
     }
}
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">   
      <data>        

          <variable           
              name="user"    
              type="daniellee.databindingdemo.User" />    
      </data>   
      <LinearLayout        
          android:layout_width="match_parent"      
          android:layout_height="match_parent"   
          android:orientation="vertical">        

          <TextView            
              android:layout_width="wrap_content"       
              android:layout_height="wrap_content"     
              android:text="@={user.name}" />  
      
          <Button            
              android:id="@+id/updateName"          
              android:layout_width="match_parent"      
              android:layout_height="wrap_content"        
              android:text="update" />    
      </LinearLayout>
</layout>
  • MainActivity
public class MainActivity extends AppCompatActivity {    

      @Override    
      protected void onCreate(Bundle savedInstanceState) { 
          super.onCreate(savedInstanceState);        
          ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);       
         final User user = new User("Daniel");        
         binding.setUser(user);        
         binding.updateName.setOnClickListener(new View.OnClickListener() {            
             @Override            
             public void onClick(View v) {                
                 user.setName("White");            
             }        
        });    
     }
}
  1. 首先是BaseObservable类,在User类中最关键的代码就是set方法中的notifyPropertyChanged(BR.name),查看源码可以看到调用了基类中一个实例对象PropertyChangeRegistry的notifyCallbacks方法,PropertyChangeRegistry的注释为Utility class for
    managing Observable callbacks.这也就说明了这个方法使用来处理回调的。同时方法参数有一个BR,查看源码可以看到是一个新类,没有其他方法,只有几个int值,查阅文档可以知道,这个类和R文件差不多,是自动生成的,里面的内容也就是id值而已,这就是框架做的工作,本身工作并没有省掉。

  2. 接下来是layout,新型的写法多了data标签,主要是做数据的部分,和对象实例化没有什么实质上的区别,只是写法采用了xml格式而已,这样在@={}中就可以直接使用这个实例了。

  3. 最后是Activity,不同于原先的findViewById,这里使用的是DataBindingUtil类的静态方法setContentView,查看源码可以看到,其实内部做的工作也就是findViewById,并没有什么太大的秘密,这个方法返回一个对象,类型为ActivityMainBinding,但是查看方法返回类型是一个泛型T extends ViewDataBinding,在Intellij IDEA中查看源码,将直接跳转到layout的xml文件,查阅文档可知,这也是框架自动为我们生成的,生成类型名字规则上面已经介绍。紧接着可以看到调用了binding的setUser方法,这也是自动生成的,名字就是我们在xml中的variable的名字,如果有其他variable同样会生成其他的set方法,设定完以后xml中的user和在Activity中的user就对应起来了,这就完成了数据的绑定任务。使用按钮来改变name值可以看到效果,可以同样注意到按钮也是通过binding调用的,所以ActivityMainBinding其实把xml的东西以一个类来描述,这样我们需要做的工作就是面向binding,而不是xml,实现了代码的解耦,但是还要认识到,这只是框架为我们做的工作,本身其实还是这些工作,并没有因此而减少。

  4. Data Binding主要帮助我们的是减少对控件的直接操作,降低代码的耦合,将代码的核心专注在逻辑控制,少掺入页面的更新,降低代码的耦合,更多其他的用法参考文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容