android 插件化快发,GitHub - SpringSmell/quick-component: Android 快速开发组件

持续更新中,可以正常使用,目前发布测试版

quick-component

Android 快速开发组件,使用便捷个性化。纯代码编写,均只有几百行代码,非常小巧。而且还包含一些常用工具

gradle引用示例

implementation 'org.quick.android:quick-component:0.0.4'

组件使用前需初始化:

在Application中一次初始化即可

QuickAndroid.init(this)

组件内容较多,示例请查看Demo或者去我的博客

QuickAdapter

快速创建RecyclerView的Adapter,高度灵活设置item参数,padding,margin都可以设置,集成了多种回调事件,OnItemClickListener,OnItemLongClickListener,OnCheckListener,OnClickLister。

简单使用示例

class Adapter : QuickAdapter() {

override fun onBindData(holder: QuickViewHolder, position: Int, itemData: Int) {

holder.setImgCircle(R.id.iv, itemData)

}

override fun onResultLayoutResId(): Int = R.layout.item_rv_list

}

复杂使用示例-可自定义margin,padding

class Adapter : QuickAdapter() {

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 : QuickAdapter() {

override fun onResultViewHolder(itemView: View): BaseViewHolder = BaseViewHolder(itemView)

}

重写后Adapter中使用的ViewHolder也可换成自己的BaseViewHolder

QuickViewHolder

灵活使用的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

快速常用的异步操作,包含了倒计时等操作

异步示例

QuickAsync.async(object : QuickAsync.OnASyncListener {

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")

}

})

计时10秒,每秒执行一次,1到10,示例

QuickAsync.async(object : QuickAsync.OnIntervalListener {

override fun onNext(value: Long) {

shareTv.text = String.format("测试异步(%d)", value)

}

override fun onAccept(value: Long) {

shareTv.text = "测试异步(End)"

}

}, 1000, 10)

也可以翻转回来,做倒计时9到0,示例

只需要多加一个参数即可

QuickAsync.async(object : QuickAsync.OnIntervalListener {

override fun onNext(value: Long) {

shareTv.text = String.format("测试异步(%d)", value)

}

override fun onAccept(value: Long) {

shareTv.text = "测试异步(End)"

}

}, 1000, 10,true)

QuickBroadcast

快速方便的使用动态广播,告别繁琐的注册与注销广播。

正常写法

先写一个广播

val broadcastRecevier=object :BroadcastReceiver(){

override fun onReceive(context: Context?, intent: Intent?) {

}

}

再根据action注册一个

registerReceiver(broadcastRecevier, IntentFilter("action"))

再onDestroy中注销

unregisterReceiver(broadcastRecevier)

再发送广播

sendBroadcast(Intent("test"))

每个页面都需这样去写,你到底累不累?

现在来看看新的写法,只需两步即可实现

1、注册

QuickBroadcast.addBroadcastListener(绑定者, { action, intent ->

when (action) {

"test" -> showToast(intent.getStringExtra("test"))

"test2" -> showToast(intent.getStringExtra("test"))

}

}, "test", "test2")/*天呐,这里居然可以指定多个接受者*/

2、发送广播

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将不再触发。

此组件需要注意的是注册时需要传递唯一的绑定者。

QuickStartActivity

以回调的方式管理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 ->

})

}

QuickToast

可在任意线程弹出,方便的使用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*/

}

如此就能愉快的玩耍了。

QuickSPHelper

快速方便使用SharedPreferences

链式存入示例

QuickSPHelper.putValue("A","valueA").putValue("B",1).putValue("C",true)

取值

键字对方式存入,第二个参数表示默认的数据类型值,如果没有数据或者数据转换错误,将返回默认值。

QuickSPHelper.getValue("B",0L)

QuickDialog

快速使用Dialog,并且缓存上一个使用的Dialog,不会重复创建View相同的Dialog.

使用示例

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">

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" />

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" />

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" />

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

快速方式使用通知,组件提供常用的临时通知,进度条两种通知。同时也可以根据业务自定义通知

临时普通通知

不需要点击事件

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))

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值