Skip to content

Commit

Permalink
databinding相关代码梳理一下
Browse files Browse the repository at this point in the history
  • Loading branch information
iOrchid committed Mar 22, 2024
1 parent 3ecf2e8 commit fe5ed97
Show file tree
Hide file tree
Showing 8 changed files with 181 additions and 129 deletions.
6 changes: 3 additions & 3 deletions jetpack/databinding/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ android {
dataBinding = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "17"
jvmTarget = "1.8"
}
}

Expand Down
35 changes: 17 additions & 18 deletions jetpack/databinding/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<!--权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--权限-->
<uses-permission android:name="android.permission.INTERNET" />

<application>
<activity
android:name=".DataBindingActivity"
android:label="DataBinding演示"
android:launchMode="singleTop"
android:screenOrientation="portrait" />
<activity
android:name=".activity.BaseUseActivity"
android:label="Binding基础用法" />
<activity
android:name=".activity.CommonUseActivity"
android:label="Binding进阶用法" />
<activity
android:name=".activity.AdvancedUseActivity"
android:label="Binding高级用法" />
</application>
<application>
<activity
android:name=".DataBindingActivity"
android:label="DataBinding演示"
android:launchMode="singleTop" />
<activity
android:name=".activity.BaseUseActivity"
android:label="Binding基础用法" />
<activity
android:name=".activity.CommonUseActivity"
android:label="Binding进阶用法" />
<activity
android:name=".activity.AdvancedUseActivity"
android:label="Binding高级用法" />
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -22,49 +22,16 @@ import org.zhiwei.jetpack.databinding.activity.CommonUseActivity
*
* You never know what you can do until you try !
* ----------------------------------------------------------------
* DataBinding的演示界面
* DataBinding的演示界面,
* todo 最初代码是大概2019年左右学习笔记的形式写的,当时kotlin也是初学,所以可能有些写法不是那么标准雅观
*/
class DataBindingActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_binding)
//设置注意事项
setNotice()
}

/**
* 跳转到 DataBinding的基础用法演示界面
* 这里是响应xml中Button的点击事件,使用onClick配置属性的方式
*/
fun baseUse(v: View) {
//kotlin的语法方式,没有new关键字,而且对应的java class类文件为::class.java方式表示。.class表示自身的kotlin类
startActivity(Intent(this, BaseUseActivity::class.java))
}

/**
* 跳转到DataBinding的进阶用法
*/
fun commonUse(v: View) {
//如果this表示不明晰的时候,可以@指定类名,即可明确对象指引
startActivity(Intent(this@DataBindingActivity, CommonUseActivity::class.java))
}

/**
* 跳转到DataBinding的高级用法
*/
fun advancedUse(v: View) {
startActivity(Intent(this, AdvancedUseActivity::class.java))
}

/**
* 使用DataBinding的注意事项点
*/
private fun setNotice() {
//这里使用的是kotlin 在gradle中apply plugin: 'kotlin-android'
//apply plugin: 'kotlin-android-extensions'后,就可以直接使用当前activity/fragment关联后的xml布局中的控件,直接使用其id即可表示该控件
//kotlin中好多set/get方法都直接简化为属性赋值的方式。如此处setText/getText就变成了.text
findViewById<TextView>(R.id.tv_notice_binding).text = """
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_binding)
//设置注意事项
val databindingStr = """
DataBinding使用注意事项点:
1、变量声明variable后,需要在binding中赋值
2、xml中用到的类,需要import,如控制View的显示隐藏,需要导入View类
Expand All @@ -77,6 +44,32 @@ DataBinding使用注意事项点:
9、静态函数,java的写法和kotlin的写法不同,实质都是jvm虚拟机的静态函数化
10、函数调用的多种写法,无参、有参、context,以及静态函数调用(针对对象,而非类)。
""".trimIndent()
}
findViewById<TextView>(R.id.tv_notice_binding).text = databindingStr
}

/**
* 跳转到 DataBinding的基础用法演示界面
* 这里是响应xml中Button的点击事件,使用onClick配置属性的方式
*/
fun baseUse(v: View) {
//kotlin的语法方式,没有new关键字,而且对应的java class类文件为::class.java方式表示。.class表示自身的kotlin类
startActivity(Intent(this, BaseUseActivity::class.java))
}

/**
* 跳转到DataBinding的进阶用法
*/
fun commonUse(v: View) {
//如果this表示不明晰的时候,可以@指定类名,即可明确对象指引
startActivity(Intent(this@DataBindingActivity, CommonUseActivity::class.java))
}

/**
* 跳转到DataBinding的高级用法
*/
fun advancedUse(v: View) {
startActivity(Intent(this, AdvancedUseActivity::class.java))
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.zhiwei.jetpack.databinding.activity
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.res.ResourcesCompat
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
Expand All @@ -15,12 +16,6 @@ import org.zhiwei.jetpack.databinding.databinding.ActivityAdvancedUseBinding
* 主页: Github: https://github.com/zhiwei1990
* 日期: 2019年08月09日 15:41
* 签名: 天行健,君子以自强不息;地势坤,君子以厚德载物。
* _ _ _ _ ____ _ _ _
* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___
* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \
* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |
* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/ -- 志威 zhiwei.org
*
* You never know what you can do until you try !
* ----------------------------------------------------------------
* DataBinding的高级用法的演示
Expand Down Expand Up @@ -49,11 +44,12 @@ class AdvancedUseActivity : AppCompatActivity() {
val url = "http://img.redocn.com/sheying/20140731/qinghaihuyuanjing_2820969.jpg"
binding.url = url
//设置myView的img参数
binding.myBg = resources.getDrawable(R.drawable.img_banner)
binding.myBg = ResourcesCompat.getDrawable(resources, R.drawable.img_banner, null)
//演示自定义View实现双向绑定
// 1、先单向绑定 也就是将viewModel的数据变化,通知UI来刷新;(这里也就是在[BCTool]中static声明自定义属性,refreshing)
// 2、将UI的变化,反向绑定,来通知数据模型的状态变化。
// 3、完成双向绑定,避免死循环。

//这里是个长文本,配合演示swipeRefreshLayout的状态感知
binding.tvLongTextAdBinding.text = strText
//
Expand All @@ -77,22 +73,92 @@ class AdvancedUseActivity : AppCompatActivity() {
}

const val strText = """
James Ray edited this page on 2 Apr · 241 revisions
Welcome to the Ethereum Wiki!
Documentation chat standard-readme compliant
Ethereum wiki covering all things related to Ethereum
Contents
Issues and pull requests
Contribution guidelines
Introduction
Fixing vandalism
Page titles
Wikipedia pillars
Translating
License and contributor license agreement
Editing locally (requires access permission)
Setup
Usage
Getting started
《琵琶行》 唐·白居易
元和十年,予左迁九江郡司马。明年秋,送客湓浦口,闻舟中夜弹琵琶者,听其音,铮铮然有京都声。问其人,本长安倡女,尝学琵琶于穆、曹二善才,年长色衰,委身为贾人妇。遂命酒,使快弹数曲。曲罢悯然,自叙少小时欢乐事,今漂沦憔悴,转徙于江湖间。予出官二年,恬然自安,感斯人言,是夕始觉有迁谪意。因为长句,歌以赠之,凡六百一十六言,命曰《琵琶行并序》。
浔阳江头夜送客,枫叶荻花秋瑟瑟。
主人下马客在船,举酒欲饮无管弦。
醉不成欢惨将别,别时茫茫江浸月。
忽闻水上琵琶声,主人忘归客不发。
寻声暗问弹者谁,琵琶声停欲语迟。
移船相近邀相见,添酒回灯重开宴。
千呼万唤始出来,犹抱琵琶半遮面。
转轴拨弦三两声,未成曲调先有情。
弦弦掩抑声声思,似诉平生不得志。
低眉信手续续弹,说尽心中无限事。
初为《霓裳》后《六幺》。
大弦嘈嘈如急雨,小弦切切如私语。
嘈嘈切切错杂弹,大珠小珠落玉盘。
间关莺语花底滑,幽咽泉流冰下难。
冰泉冷涩弦凝绝,凝绝不通声暂歇。
别有幽愁暗恨生,此时无声胜有声。
银瓶乍破水浆迸,铁骑突出刀枪鸣。
曲终收拨当心画,四弦一声如裂帛。
东船西舫悄无言,唯见江心秋月白。
沉吟放拨插弦中,整顿衣裳起敛容。
自言本是京城女,家在虾蟆陵下住。
十三学得琵琶成,名属教坊第一部。
曲罢曾教善才服,妆成每被秋娘妒。
五陵年少争缠头,一曲红绡不知数。
钿头银篦击节碎,血色罗裙翻酒污。
今年欢笑复明年,秋月春风等闲度。
弟走从军阿姨死,暮去朝来颜色故。
门前冷落鞍马稀,老大嫁作商人妇。
商人重利轻别离,前月浮梁买茶去。
去来江口守空船,绕船月明江水寒。
夜深忽梦少年事,梦啼妆泪红阑干。
我闻琵琶已叹息,又闻此语重唧唧。
同是天涯沦落人,相逢何必曾相识!
我从去年辞帝京,谪居卧病浔阳城。
浔阳地僻无音乐,终岁不闻丝竹声。
住近湓江地低湿,黄芦苦竹绕宅生。
其间旦暮闻何物?杜鹃啼血猿哀鸣。
春江花朝秋月夜,往往取酒还独倾。
岂无山歌与村笛?呕哑嘲哳难为听。
今夜闻君琵琶语,如听仙乐耳暂明。莫辞更坐弹一曲,
为君翻作《琵琶行》。感我此言良久立,却坐促弦弦转急。
凄凄不似向前声,满座重闻皆掩泣。
座中泣下谁最多?江州司马青衫湿。
"""
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,30 @@ import org.zhiwei.jetpack.databinding.tools.BindHelp
* 主页: Github: https://github.com/zhiwei1990
* 日期: 2019年08月09日 15:39
* 签名: 天行健,君子以自强不息;地势坤,君子以厚德载物。
* _ _ _ _ ____ _ _ _
* / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___
* / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \
* / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) |
* /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/ -- 志威 zhiwei.org
*
* You never know what you can do until you try !
* ----------------------------------------------------------------
* dataBinding的基础用法演示界面
* todo⚠️⚠️⚠️dataBinding的使用必然损耗一部分编译性能,老项目改造可以这么用。如果新项目,建议直接用compose,dataBinding作为就项目知识点就好。
*/
class BaseUseActivity : AppCompatActivity() {

/*
DataBinding使用步骤简要:
1、使用最新版的AndroidStudio,至少AS3.0以上吧。
2、在项目module下的build.gradle的android闭包下,配置 databinding{enabled=true}
1、使用最新版的AndroidStudio,至少AS3.0以上,
2、在项目module下的build.gradle的android闭包下,配置 databinding{enabled=true}.
新版gradle之后,写作 buildFeature闭包内,databinding = true;类似的有viewbinding = true(不需要xml使用<layout>包裹)。compose = true等。
3、对于布局的xml文件,将原有的正常布局,外面用<layout></layout>包裹作为跟节点。<data></data>节点下存放用于xml布局的一些变量,工具类之类的
4、在代码无误的情况下,build一下module或整个project。然后就可以在代码中使用binding方式coding了。
*/


//<editor-folder desc="成员变量代码块">

private val yourName: String = "这是一种可以折叠代码的注释方式。"
//</editor-folder>

// TODO: 如果单纯的仅仅想替换findViewById 可以只开启viewBinding=true即可,无需改造xml,就可以使用binding;



override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatTextView
import androidx.databinding.DataBindingUtil
import androidx.databinding.ObservableField
import androidx.databinding.ObservableInt
import org.zhiwei.jetpack.databinding.R
Expand Down Expand Up @@ -57,10 +56,7 @@ class CommonUseActivity : AppCompatActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//关联布局,binding对象
val binding = DataBindingUtil.setContentView<ActivityCommonUseBinding>(
this,
R.layout.activity_common_use
)
val binding = ActivityCommonUseBinding.inflate(layoutInflater)
//普通的类似java的方式,关联控件和注册事件
binding.btnChangeCommon.setOnClickListener(this)
binding.btnChangeField.setOnClickListener(this)
Expand Down
Loading

0 comments on commit fe5ed97

Please sign in to comment.