Android 快速开发组件,使用便捷个性化。纯代码编写,均只有几百行代码,非常小巧。而且还包含一些常用工具
implementation 'org.quick.android:quick-component:0.0.4'
在Application中一次初始化即可
QuickAndroid.init(this)
组件内容较多,示例请查看Demo或者去我的博客
快速创建RecyclerView的Adapter,高度灵活设置item参数,padding,margin都可以设置,集成了多种回调事件,OnItemClickListener,OnItemLongClickListener,OnCheckListener,OnClickLister。
class Adapter : QuickAdapter<Int,QuickViewHolder>() {
override fun onBindData(holder: QuickViewHolder, position: Int, itemData: Int) {
holder.setImgCircle(R.id.iv, itemData)
}
override fun onResultLayoutResId(): Int = R.layout.item_rv_list
}
class Adapter : QuickAdapter<Int,QuickViewHolder>() {
override fun onResultLayoutResId(): Int = R.layout.item_discover_list
override fun onBindData(holderRv: QuickViewHolder, position: Int, itemData: String?) {
holderRv.setImg(R.id.contentIv, itemData)
}
//----------margin 一般用于CardView
override fun onResultItemMargin(): Int = 40
override fun onResultItemMarginLeft(position: Int): Int = when {
position % 2 == 0 -> 40
else -> 20
}
override fun onResultItemMarginRight(position: Int): Int = when {
position % 2 != 0 -> 40
else -> 20
}
override fun onResultItemMarginTop(position: Int): Int {
return super.onResultItemMarginTop(position)
}
override fun onResultItemMarginBottom(position: Int): Int {
return super.onResultItemMarginBottom(position)
}
//------------Padding,一般用于常规列表
override fun onResultItemPadding(): Int {
return super.onResultItemPadding()
}
override fun onResultItemPaddingLeft(position: Int): Int {
return super.onResultItemPaddingLeft(position)
}
}
有时业务有特殊需求,需要自定义Adapter,可继承自定义
abstract class BaseAdapter<M> : QuickAdapter<M, BaseViewHolder>() {
override fun onResultViewHolder(itemView: View): BaseViewHolder = BaseViewHolder(itemView)
}
重写后Adapter中使用的ViewHolder也可换成自己的BaseViewHolder
灵活使用的View持有器,使用链式设置方式,快速设置text,Listener等常用操作数据方式。
注意:每个人使用的图片加载框架不一样,此处需要自定义并重写绑定图片,换成自已的加载框架
框架内与QuickAdapter、QuickDialog配合使用
class BaseViewHolder(itemView: View) : QuickViewHolder(itemView) {
override fun bindImg(context: Context, url: String, imageView: ImageView): QuickViewHolder {
return super.bindImg(context, url, imageView)
}
override fun bindImgRoundRect(context: Context, url: String, radius: Float, imageView: ImageView): QuickViewHolder {
return super.bindImgRoundRect(context, url, radius, imageView)
}
override fun bindImgCircle(context: Context, url: String, imageView: ImageView): BaseViewHolder {
return this
}
}
快速常用的异步操作,包含了倒计时等操作
QuickAsync.async(object : QuickAsync.OnASyncListener<String> {
override fun onASync(): String {
//在子线程中操作耗时操作,然后将结果返回到主线程中
return if (Looper.getMainLooper() == Looper.myLooper()) "主线程" else "子线程"
}
override fun onAccept(value: String) {
//这是主线程接收值
Log2.e("onASync:$value")
val temp = if (Looper.getMainLooper() == Looper.myLooper()) "主线程" else "子线程"
Log2.e("onAccept:$temp")
}
})
QuickAsync.async(object : QuickAsync.OnIntervalListener<Long> {
override fun onNext(value: Long) {
shareTv.text = String.format("测试异步(%d)", value)
}
override fun onAccept(value: Long) {
shareTv.text = "测试异步(End)"
}
}, 1000, 10)
只需要多加一个参数即可
QuickAsync.async(object : QuickAsync.OnIntervalListener<Long> {
override fun onNext(value: Long) {
shareTv.text = String.format("测试异步(%d)", value)
}
override fun onAccept(value: Long) {
shareTv.text = "测试异步(End)"
}
}, 1000, 10,true)
快速方便的使用动态广播,告别繁琐的注册与注销广播。
正常写法
val broadcastRecevier=object :BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent?) {
}
}
registerReceiver(broadcastRecevier, IntentFilter("action"))
unregisterReceiver(broadcastRecevier)
sendBroadcast(Intent("test"))
每个页面都需这样去写,你到底累不累?
现在来看看新的写法,只需两步即可实现
QuickBroadcast.addBroadcastListener(绑定者, { action, intent ->
when (action) {
"test" -> showToast(intent.getStringExtra("test"))
"test2" -> showToast(intent.getStringExtra("test"))
}
}, "test", "test2")/*天呐,这里居然可以指定多个接受者*/
QuickBroadcast.sendBroadcast(Intent(), "test")
如此简单的两步就完成了广播的注册与发送,so easy!
如果更复杂的使用呢,当前页面发送给多个页面。
正常写法
sendBroadcast(Intent("test"))
sendBroadcast(Intent("MyCenterFragment"))
QuickBroadcast.sendBroadcast(Intent(), "test","MyCenterFragment")
对于发送只需增加接收者即可,这样注册了test与MyCenterFragment的接收者都将收到你的消息。
并且此组件同一时刻不会同时触发接收者为同一监听的广播
QuickBroadcast.addBroadcastListener(绑定者, { action, intent ->
when (action) {
"test" -> showToast(intent.getStringExtra("test"))
"test2" -> showToast(intent.getStringExtra("test"))
}
}, "test", "test2")/*天呐,这里居然可以指定多个接受者*/
比如,test,test2为同一组接收者。
如果发送同时发送test,test2
QuickBroadcast.sendBroadcast(Intent(), "test","test2")
那只会触发早先的test,test2将不再触发。
此组件需要注意的是注册时需要传递唯一的绑定者。
以回调的方式管理onActivityForResult的返回值。无需再向传统那样,先startActivityForResult,然后再监听onActivityForResult,真正做到在哪开始,就在哪结束,方便开发者debug,并且无需再为担心requestCode怎么传,会不会有重复的,有没有超出65536上限而担心,因为已经生成了唯一的requestCode,每个Activity对应一个requestCode。
开始调用
var intent=Intent(this,YourActivity::class.java)
intent.putExtra("TYPE","this is a type")
QuickStartActivity.startActivity(activity, intent, { resultCode, data ->
})
在这里绑定
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
QuickStartActivity.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
一般来讲,A跳转到B,A中只会有一处跳转到B。如果有特殊需求,A存在多处跳转到B,就像按钮1跳转B,按钮2也要跳转到B,因为每个Activity只对应一个requestCode,所以应该以动态传值的方法来写
fun startActionB(intent:Intent){
QuickStartActivity.startActivity(activity, intent, { resultCode, data ->
})
}
可在任意线程弹出,方便的使用Toast,无需在使用的时候频繁传递context,一次初始化,终生受益。
传统使用方式
Toast.makeText(activity,"这是一个Toast",Toast.LENGTH_SHORT).show()
如果需要自定义时
val toast = Toast.makeText(activity, "这是一个Toast", Toast.LENGTH_SHORT)
toast.setGravity(Gravity.CENTER,0,0)
toast.show()
这种方式使用时每次都需要依赖context,如果需要在子线程使用,将会变得很不方便,那么此组件如何呢
所以请看
QuickToast.showToastDefault("这是一个Toast")
或者,使用链式配置参数,或者自定义Toast
QuickToast.Builder().setGravity(Gravity.CENTER).setDuration(Toast.LENGTH_SHORT).setLayoutView(customView).build().showToast("这是一个Toast")
看到这里或许就有疑问了,在哪里初始化context呢,使用quickLibrary将无需处理,若只需使用此组件,重写QuickToast中的context方法即可。
示例
class CustomToast:QuickToast() {
override val context: Context
get() = super.context/*这里替换为自定义context*/
}
如此就能愉快的玩耍了。
快速方便使用SharedPreferences
QuickSPHelper.putValue("A","valueA").putValue("B",1).putValue("C",true)
键字对方式存入,第二个参数表示默认的数据类型值,如果没有数据或者数据转换错误,将返回默认值。
QuickSPHelper.getValue("B",0L)
快速使用Dialog,并且缓存上一个使用的Dialog,不会重复创建View相同的Dialog.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="40dp"
android:background="#ffffff">
<TextView
android:id="@+id/titleTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="100dp"
android:text="这是标题"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/leftTv"
android:layout_width="0dp"
android:layout_height="50dp"
android:gravity="center"
android:text="这是左边按钮"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/rightTv"
app:layout_constraintTop_toBottomOf="@+id/titleTv" />
<TextView
android:id="@+id/rightTv"
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="center"
android:text="这是右边按钮"
app:layout_constraintBottom_toBottomOf="@+id/leftTv"
app:layout_constraintLeft_toRightOf="@+id/leftTv"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/leftTv" />
</android.support.constraint.ConstraintLayout>
QuickDialog.Builder(this@MainActivity).setLayout(R.layout.dialog_test).setWindowPadding(100, 0, 100, 0).show().setText(R.id.leftTv, "取消", View.OnClickListener {
QuickToast.showToastDefault("点击了取消")
QuickDialog.dismiss()
}).setText(R.id.rightTv, "确定", View.OnClickListener {
QuickToast.showToastDefault("点击了确定")
QuickDialog.dismiss()
})
有时一个页面会有多个Dialog,也可以创建Dialog
val tempDialog = QuickDialog.Builder(this@MainActivity).setLayout(R.layout.dialog_test).create()
快速方式使用通知,组件提供常用的临时通知,进度条两种通知。同时也可以根据业务自定义通知
不需要点击事件
QuickNotify.notifyTempNormal(R.mipmap.ic_launcher,"这是标题","这是内容")
需要点击事件
QuickNotify.notifyTempNormal(R.mipmap.ic_launcher,"这是标题","这是内容",intent) { context, intent ->
QuickToast.showToastDefault("点击了通知")
}
准备通知-正在请求数据,进度条处于准备阶段
QuickNotify.notifyTempProgress(notifyId,R.mipmap.ic_launcher,"这是标题","这是内容")
开始通知-进度已经开始
QuickNotify.notifyTempProgresses(notifyId, R.mipmap.ic_launcher, "这是标题", "这是内容", value)
通知结束-文件已下载完成-用户触发点击事件
QuickNotify.notifyTempProgressEnd(1, R.mipmap.ic_launcher, "这是标题", "这是内容", intent){ context, intent ->
QuickToast.showToastDefault("点击了通知")
}
所有配置数据全由开发者自行配置,组件只负责通知。如果需要接管回调事件,只需将监听传空即可
QuickNotify.notify(1, NotificationCompat.Builder(context, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("这是标题")
.setContentText("这是内容")
.setProgress(100, 100, false)
.setOngoing(false)/*是否正在通知(是否不可以取消)*/
.setAutoCancel(true)/*是否点击时取消*/
.setDefaults(NotificationCompat.DEFAULT_ALL),intentClick,intentCancel) { context, intent ->
}
兼容8.0,在桌面快速创建快捷式方式,自定义图片、名称以及bundle数据
QuickNotify.notifyDesktopShortcut(QuickNotify.ShortcutBuilder(Math.random().toString())
.setActivity(packageName, RvListActivity::class.java.simpleName, Bundle())
.setShortcut("this is a name", ImageUtils.decodeSampledBitmapFromResource(resources, R.mipmap.ic_launcher2))) { context, intent ->
QuickToast.showToastDefault("已成功创建" + intent.getStringExtra(QuickNotify.shortcutName))
}