Android-Ktx
提供各类对于Android常用方法的拓展,提高开发效率 (欢迎Star 和 pull request)
GitHub地址:github.com/ShowMeThe/A…
如何依赖:
在build.gradle的dependencies添加需要的内容:
implementation 'com.github.ShowMeThe:binding-ktx:1.0.1' //一行代码实现ViewBinding和DataBinding
implementation 'com.github.ShowMeThe:span-ktx:1.0.0' // SpannableStringBuilder拓展快速编写
implementation 'com.github.ShowMeThe:livedata-ktx:1.0.0' //LiveData 拓展操作符
主要内容:
1、 一行代码实现ViewBinding和DataBinding的使用,并加入生命周期的监听(ViewBinding利用到了反射,已添加混淆内容)
2、 对SpannableStringBuilder进行拓展快速编写
3、 LiveData 拓展操作符
Example:
1 、 一行代码实现ViewBinding和DataBinding
class MainActivity : AppCompatActivity() {
var binding by BindingProperty<ActivityMainBinding>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = binding(this,R.layout.activity_main)
binding.tv1.setOnClickListener {
Toast.makeText(this,"Click Event",Toast.LENGTH_LONG).show()
}
}
}
BindingProperty的作用是对作用域为Lifeowner的作用域进行生命周期的监听,例如DataBinding在布局中直接写入的Livedata就利用这点了,需要传入Lifeowner
或者使用如下:
class MainActivity : AppCompatActivity() {
val binding by lazy { binding<ActivityMainBinding>(this,R.layout.activity_main) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.tv1.setOnClickListener {
Toast.makeText(this,"Click Event",Toast.LENGTH_LONG).show()
}
}
}
注意事项:
1 、binding方法对ComponentActivity,无论ViewBinding还是DataBinding都进行了setContentView的操作,留意的重复输入问题
2、SpannableStringBuilder拓展
模板代码如下:
class MainActivity : AppCompatActivity() {
val binding by lazy { binding<ActivityMainBinding>(this,R.layout.activity_main) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val text = "测试内容演示Spannable"
binding.apply {
tv1.movementMethod = LinkMovementMethod.getInstance()
tv1.setHintTextColor(Color.TRANSPARENT)
tv1.text = text.span.apply {
foregroundColor(Color.RED,0..7)
italic(0..2)
backgroundColor(Color.LTGRAY,0..3)
underline(0..2)
strikeThrough(6..9)
bold(2..4)
boldItalic(6..9)
size(25,0..1)
sizeRelative(2f,1..2)
val drawable = ContextCompat.getDrawable(this@MainActivity,R.mipmap.ic_launcher_round)
drawable!!.setBounds(0,0,drawable.intrinsicHeight,drawable.intrinsicWidth)
image(drawable,0..1)
click(10..12){
Toast.makeText(this@MainActivity, text,Toast.LENGTH_LONG).show()
}
}
}
}
}
效果图:
3、LiveData 拓展操作符
利用MediatorLiveData实现转换操作,支持filter、map、distinctUntilChanged、debounce
val live = MutableLiveData<String?>()
live.filter { !it.isNullOrEmpty() }
.map { StringBuilder("Data:").append(it).toString() }
.debounce(500)
.observe(this@MainActivity) {
Toast.makeText(this@MainActivity, it, Toast.LENGTH_LONG).show()
Log.e("MainActivity", it)
}