Collection聚合了项目搭建的一些基本模块,节约开发者时间,协助项目的快速搭建,RecyclerView+Adapter+Retrofit+RxJava+MVP+DataManager+基本Base,可以知足一个项目的基本实现。java
Android X库以前版本可以使用Collection-Android:juejin.im/post/5ab998…android
Collection-iOS库:juejin.im/post/5e423d…git
github地址:github.com/usernameyan…
简书地址:www.jianshu.com/p/a6cb49532…
1.在Collection-Android的基础上适配Android X库
2.去掉Relam数据模块,安装包大小减小
3.对原生SQLite数据库进行封装,使用更加方便 4.对DataManager的使用进行修整 5.增长AutoLineLayout/TagView 6.增长LinkedMultiValueMap
7.增长RxJavaUtils,可进行子/主线程数据处理切换github
implementation 'com.youngman:collection_kotlin:1.0.0'数据库
属性 | 做用 |
---|---|
addHeaderView | 增长头部布局, 暂时只能添加一个头布局 |
setEmptyView | 设置自定义的加载布局和空布局 |
setRefreshView | 自定义刷新View |
setDefaultLoadingMoreNoDataMessage | 设置默认没有数据的内容 |
setLoadMoreView | 自定义加载更多View |
setNoMoreDate | 显示没有更多数据 |
setAutoRefresh | 自动刷新 |
refreshComplete | 刷新数据完成 |
loadMoreComplete | 加载更多数据完成 |
setPullRefreshEnabled | 是否容许刷新 |
setLoadMoreEnabled | 是否容许加载更多 |
setRefreshTimeVisible | 显示加载更新时间 |
isLoading | 是否正在loading数据 |
isRefreshing | 正在refreshing数据 |
setRefreshAndLoadMoreListener | 刷新和加载更多回调 |
destroy | 内存回收 |
<com.youngmanster.collection_kotlin.recyclerview.PullToRefreshRecyclerView
android:id="@+id/recycler_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
复制代码
recycler_rv.setPullRefreshEnabled(true)
recycler_rv.setLoadMoreEnabled(true)
复制代码
属性 | 做用 |
---|---|
STATE_PULL_DOWN | 拉的状态(还没到下拉到固定的高度时) |
STATE_RELEASE_REFRESH | 下拉到固定高度提示释放刷新的状态 |
STATE_REFRESHING | 正在刷新状态 |
STATE_DONE | 刷新完成 |
属性 | 做用 |
---|---|
STATE_LOADING | 正在加载 |
STATE_COMPLETE | 加 载完成 |
STATE_NODATA | 没有数据 |
recycler_rv.setPullRefreshEnabled(true)
recycler_rv.setLoadMoreEnabled(true)
recycler_rv.setRefreshAndLoadMoreListener(this)
recycler_rv.setRefreshView(DefinitionAnimationRefreshHeaderView(activity))
recycler_rv.setLoadMoreView(DefinitionAnimationLoadMoreView(activity))
复制代码
1.在initView()作自定义布局、相关动画的初始化,最后在initView()方法的最后面添加如下代码便可。json
mContainer =
LayoutInflater.from(context).inflate(R.layout.layout_definition_animation_refresh, null)
//把刷新头部的高度初始化为0
val lp = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
lp.setMargins(0, 0, 0, 0)
this.layoutParams = lp
this.setPadding(0, 0, 0, 0)
addView(mContainer, LayoutParams(LayoutParams.MATCH_PARENT, 0))
gravity = Gravity.BOTTOM
//测量高度
measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
mMeasuredHeight = measuredHeight
复制代码
2.setRefreshTimeVisible(boolean show)是用来设置是否显示刷新时间控件,在默认刷新样式中经过mRecyclerView.setRefreshTimeVisible(false)便可隐藏刷新时间,若是在自定义的布局中没有这项这个方法就能够忽略。api
3.destroy()是用来关掉改页面时把刷新View的一些动画等释放,防止内存泄漏。缓存
1.在构造函数中设置 onStateChangeListener=this 2.onStateChange的模板样式网络
override fun onStateChange(state: Int) {
if(isDestroy){
return
}
//下拉时状态相同不作继续保持原有的状态
if (state == mState) return
//根据状态进行动画显示
when (state) {
STATE_PULL_DOWN -> {
clearAnim()
startAnim()
}
STATE_RELEASE_REFRESH -> {
}
STATE_REFRESHING -> {
clearAnim()
startAnim()
scrollTo(mMeasuredHeight)
}
STATE_DONE -> {
}
}
mState = state
}
复制代码
1.在initView()作自定义布局、相关动画的初始化,最后在initView()方法的最后面添加如下代码便可app
mContainer = LayoutInflater.from(context)
.inflate(R.layout.layout_definition_animation_loading_more, null)
addView(mContainer)
gravity = Gravity.CENTER
复制代码
2.destroy()是用来关掉改页面时把刷新View的一些动画等释放,防止内存泄漏。 3.在setState()进行状态切换后的相关操做逻辑,模板样式
override fun setState(state: Int) {
if(isDestroy){
return
}
when (state) {
STATE_LOADING -> {
loadMore_Ll?.visibility = VISIBLE
noDataTv?.visibility = INVISIBLE
animationDrawable = loadingIv?.drawable as AnimationDrawable
animationDrawable?.start()
this.visibility = VISIBLE
}
STATE_COMPLETE -> {
animationDrawable?.stop()
this.visibility = GONE
}
STATE_NODATA -> {
loadMore_Ll?.visibility = INVISIBLE
noDataTv?.visibility = VISIBLE
animationDrawable = loadingIv?.drawable as AnimationDrawable
animationDrawable?.start()
this.visibility = VISIBLE
}
}
mState = state
}
复制代码
4.注意:在自定义加载更多样式时,若是须要有没有更多加载更多数据提示一样须要在布局中写好,而后在onSatae中根据状态对加载和没有跟多显示提示进行显示隐藏操做。
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.youngmanster.collection_kotlin.recyclerview.PullToRefreshRecyclerView
android:id="@+id/recycler_rv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
复制代码
recycler_rv.setLoadMoreEnabled(true)
recycler_rv.setRefreshAndLoadMoreListener(this)
recycler_rv.setLoadMoreView(DefinitionAnimationLoadMoreView(activity))
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent)
swipeRefreshLayout.setOnRefreshListener(this)
复制代码
因为PullToRefreshRecyclerView的下拉刷新和下拉加载更多完成时会自动刷新Adapter,而SwipeRefreshLayout刷新完成时须要手动进行notifyDataSetChanged刷新适配器。
//增长头布局
val header = LayoutInflater.from(activity).inflate(R.layout.layout_main_header, null)
recycler_rv.addHeaderView(header)
//增长空布局
val emptyView = LayoutInflater.from(activity).inflate(R.layout.layout_empty, null)
recycler_rv.emptyView = emptyView
emptyView.setOnClickListener {
for (i in 0..9) {
mDatas.add("item$i")
}
definitionRefreshAdapter?.notifyDataSetChanged()
}
复制代码
mRecyclerView.setNoMoreDate(true)
复制代码
mRecyclerView.setAutoRefresh()
复制代码
val textConfig = LoadingTextConfig.getInstance(applicationContext)
textConfig
.setCollectionLoadingMore("加载更多")
.setCollectionLastRefreshTimeTip("更新时间:")
.setCollectionNoMoreData("没有更多数据")
.setCollectionPullReleaseText("释放刷新")
.setCollectionRefreshing("正在刷新")
.setCollectionPullDownRefreshText("下拉刷新")
.setCollectionRefreshDone("加载完成")
PullToRefreshRecyclerViewUtils.loadingTextConfig = textConfig
复制代码
1.下面是下拉刷新上拉加载更多的一些操做模板
private fun refreshUI() {
if (defaultRefreshAdapter == null) {
defaultRefreshAdapter =
DefaultRecyclerAdapter(
activity!!,
R.layout.item_pull_refresh,
mDatas,
recycler_rv
)
recycler_rv.adapter = defaultRefreshAdapter
} else {
if (recycler_rv != null) {
if (recycler_rv.isLoading) {
recycler_rv.loadMoreComplete()
} else if (recycler_rv.isRefreshing) {
recycler_rv.refreshComplete()
}
}
}
}
复制代码
2.注意问题
@Override
public void onDestroy() {
super.onDestroy();
mRecyclerView?.destroy()
}
复制代码
在BaseRecyclerViewAdapter中的BaseViewHolder进行布局转化,同时定义了一些比较基本的View操做,使用简单。
class DefinitionRecyclerAdapter(
mContext: Context,
mLayoutResId: Int,
mDatas: ArrayList<String>,
pullToRefreshRecyclerView: PullToRefreshRecyclerView
) : BaseRecyclerViewAdapter<String>(mContext, mLayoutResId, mDatas, pullToRefreshRecyclerView) {
override fun convert(baseViewHolder: BaseViewHolder, t: String) {
baseViewHolder.setText(R.id.title, t)
}
}
复制代码
public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List<T> mDatas, PullToRefreshRecyclerView pullToRefreshRecyclerView) {
this.mContext = mContext;
this.mLayoutResId = mLayoutResId;
this.mDatas = mDatas;
this.mRecyclerView=pullToRefreshRecyclerView;
}
public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List<T> mDatas) {
this.mContext = mContext;
this.mLayoutResId = mLayoutResId;
this.mDatas = mDatas;
}
复制代码
itemClickAdapter.setOnItemLongClickListener(object :
BaseRecyclerViewAdapter.onItemLongClickListener {
override fun onItemLongClick(view: View, position: Int): Boolean {
showToast("进行长按操做")
return true
}
})
复制代码
class MultipleAdapter(mContext: Context, mDatas: ArrayList<MultiItem>) :
BaseRecyclerViewMultiItemAdapter<MultiItem>(mContext, mDatas) {
private var mHeight: Int=0
init {
mHeight = DisplayUtils.dip2px(mContext, 100f)
addItemType(MultiItem.TYPE_TEXT, R.layout.item_main)
addItemType(MultiItem.TYPE_IMG, R.layout.item_img)
addItemType(MultiItem.TYPE_TEXT_IMG, R.layout.item_click)
}
override fun convert(baseViewHolder: BaseViewHolder, t: MultiItem) {
when (baseViewHolder.itemViewType) {
MultiItem.TYPE_TEXT -> {
baseViewHolder.getView<CardView>(R.id.card_view).layoutParams.height = mHeight
baseViewHolder.setText(R.id.title, t.title)
}
MultiItem.TYPE_IMG -> baseViewHolder.setImageResource(R.id.ivImg, t.res)
MultiItem.TYPE_TEXT_IMG -> {
baseViewHolder.setImageResource(R.id.ivImg, t.res)
baseViewHolder.setText(R.id.titleTv, t.title)
}
}
}
}
复制代码
dragAndDeleteAdapter?.setDragAndDeleteListener(this)
recycler_rv.adapter = dragAndDeleteAdapter
val callback = BaseRecycleItemTouchHelper(dragAndDeleteAdapter)
val itemTouchHelper = ItemTouchHelper(callback)
itemTouchHelper.attachToRecyclerView(recycler_rv)
复制代码
override fun onMoveComplete() {
ToastUtils.showToast(this, "移动操做完成")
}
override fun onDeleteComplete() {
ToastUtils.showToast(this, "删除操做完成")
}
复制代码
属性 | 做用 |
---|---|
DEBUG | 是否为BuildConfig.DEBUG,日志输出须要 |
CONTEXT | 设置Context,必填项 |
URL_DOMAIN | 网络请求的域名,须要以“/”结尾 |
URL_CACHE | 网络缓存地址,须要设置缓存才能够成功 |
MAX_CACHE_SECONDS | 设置OkHttp的缓存机制的最大缓存时间,默认为一天 |
MAX_MEMORY_SIZE | 缓存最大的内存,默认为10M |
MClASS | 设置网络请求json通用解析类 |
EXPOSEPARAM | Json数据某些字段在没有数据是会不返回来,可经过这个属性设置过滤 |
USER_CONFIG | SharePreference保存的名称 |
CONNECT_TIMEOUT_SECONDS | 请求接口超时设定 |
READ_TIMEOUT_SECONDS | 请求接口超时设定 |
HEADERS | 设置Http全局请求头 |
SQLITE_DB_NAME | 数据库名称 |
SQLITE_DB_VERSION | 数据库版本名 |
private fun config(){
//基本配置
Config.DEBUG = BuildConfig.DEBUG
Config.CONTEXT = this
Config.URL_CACHE = AppConfig.getURLCacheDir(this)
Config.MClASS=HttpResult::class.java
Config.USER_CONFIG = "Collection_User"
Config.URL_DOMAIN = "https://api.apiopen.top/"
Config.SQLITE_DB_VERSION=0
}
复制代码
class HttpResult<T> : Serializable {
var code: Int = 0
var message: String? = null
var result: T? = null
}
复制代码
(1)RequestBuilder的设置(网络请求的配置)
属性 | 做用 |
---|---|
ReqType | 数据处理的方式,默认DEFAULT_CACHE_LIST,使用到OkHttp缓存的须要须要设置Config.URL_CACHE |
NO_CACHE_MODEL | 不设置缓存,返回model |
NO_CACHE_LIST | 不设置缓存,返回list |
DEFAULT_CACHE_MODEL | 使用Okttp默认缓存,返回model |
DEFAULT_CACHE_LIST | 使用Okttp默认缓存,返回list |
DISK_CACHE_LIST_LIMIT_TIME | 限时使用自定义磁盘缓存,返回List |
DISK_CACHE_MODEL_LIMIT_TIME | 限时使用自定义磁盘缓存,返回model |
DISK_CACHE_NO_NETWORK_LIST | 自定义磁盘缓存,没有网络返回磁盘缓存,返回List |
DISK_CACHE_NO_NETWORK_MODEL | /自定义磁盘缓存,没有网络返回磁盘缓存,返回Model |
HttpType | 网络请求方式,默认DEFAULT_GET |
DEFAULT_GET | GET请求 |
DEFAULT_POST | POST请求 |
FIELDMAP_POST | 若是请求URL出现中文乱码,可选择这个 |
JSON_PARAM_POST | json格式请求参数 |
ONE_MULTIPART_POST | 上传一张图片 |
MULTIPLE_MULTIPART_POST | 上传多张图片 |
ReqMode | 请求模式,默认ASYNCHRONOUS |
ASYNCHRONOUS | 异步请求 |
SYNCHRONIZATION | 同步请求 |
其它参数 | |
setTransformClass | 设置请求转化Class |
setUrl | 设置请求url,若是不设置彻底链接则会使用Config.URL_DOMIN进行拼接 |
setFilePathAndFileName | 设置自定义缓存时的路径和文件名 |
setLimtHours | 设置自定义缓存的有效时间 |
setHeader | 设置请求头 |
setHeaders | 设置请求头集合 |
setHttpTypeAndReqType | 设置请求数据类型和请求方式 |
setImagePath | 设置上传图片路径 |
setImagePaths | 设置多张图片路径 |
isUserCommonClass | 设置是否使用公用类转化 |
setReqMode | 设置同步异步 |
(2)使用模块
val requestBuilder=RequestBuilder(object :RxObservableListener<HttpResult<List<WeChatNews>>>(mView){
override fun onNext(result: HttpResult<List<WeChatNews>>) {
mView?.refreshUI(result.result)
}
})
requestBuilder
.setUrl(ApiUrl.URL_WETCHAT_FEATURED)
.setTransformClass(WeChatNews().javaClass)
.setHttpTypeAndReqType(RequestBuilder.HttpType.DEFAULT_GET,RequestBuilder.ReqType.NO_CACHE_LIST)
.setParam("page",page)
.setParam("type","video")
.setParam("count",num)
rxManager.addObserver(DataManager.DataForHttp.httpRequest(requestBuilder))
复制代码
void onNext(T result);
void onComplete();
void onError(NetWorkCodeException.ResponseThrowable e);
复制代码
protected RxObservableListener(BaseView view){
this.mView = view;
}
protected RxObservableListener(BaseView view, String errorMsg){
this.mView = view;
this.mErrorMsg = errorMsg;
}
复制代码
1.写一个Contract类对Presenter和View进行统一管理(View须要实现BaseView,Presenter须要实现BasePresenter<T:BaseView>)
interface WeChatChinaNewsContract {
interface View : BaseView {
fun refreshUI(weChatNews: List<WeChatNews>?)
}
abstract class Presenter : BasePresenter<View>() {
abstract fun requestChinaNews(context: Context, page: Int, num: Int)
}
}
复制代码
2.写一个具体的Presenter类实现WeChatChinaNewsContract.Presenter,在里面作具体的逻辑处理,处理完成再经过mView进行View的处理
3.Activity/Fragment实现IBaseActivity<T:BasePresenter>/IBaseFragment<T:BasePresenter>以及定义好的WeChatChinaNewsContract.View
4.缺陷:View在使用时须要转化成在具体的子类才能调用相关方法。
5.具体使用能够参照demo
(1)DataManager基本属性
属性 | 做用 |
---|---|
DataForSqlite | 数据库模块 |
insert | 插入bean数据 |
insertList | 插入List数据 |
insertListBySync | 异步插入List数据 |
queryByFirstByWhere | 根据条件查询 |
queryAll | 查询某个bean类的所有数据 |
queryAllBySync | 异步查询某个bean类的所有数据 |
queryByFirst | 查询某个bean类的第一条数据 |
delete | 根据条件删除数据 |
deleteAll | 删除某个bean类的全部数据 |
deleteTable | 删除数据表 |
update | 更新某个bean类的 |
queryOfPageByWhere | 根据条件分页查询,实体类必须包含PrimaryKey |
queryOfPage | 分页查询,实体类必须包含PrimaryKey |
updateTable | 更新数据表,用于增长字段 |
execQuerySQL | Sql语句查询 |
DataForHttp | Http模块 |
httpRequest | 网络请求,传入RequestBuilder |
DataForSharePreferences | SharePreference模块 |
saveObject | 保存基本类型数据 |
getObject | 获取基本类型数据 |
(2)DataForSqlite
1.插入一条数据
var user= User()
user.id=0
user.age=24
user.name="张三"
var isSuccess=DataManager.DataForSqlite.insert(user)
if(isSuccess!!){
ToastUtils.showToast(activity,"保存成功")
}else{
ToastUtils.showToast(activity,"保存失败")
}
复制代码
2.查询数据
val user=DataManager.DataForSqlite.queryByFirst(User().javaClass)
ToastUtils.showToast(activity,"姓名:"+user?.name+" "+"年龄:"+user?.age)
复制代码
3.批量插入数据(可同步可异步)
var list=ArrayList<User>()
for (i in 0..10000){
var user= User()
user.id=i
user.age=i
user.name="张$i"
list.add(user)
}
DataManager.DataForSqlite.insertListBySync(User().javaClass,list,object :SQLiteDataBase.InsertDataCompleteListener{
override fun onInsertDataComplete(isInsert: Boolean?) {
if(isInsert!!){
ToastUtils.showToast(activity,"保存成功")
}else{
ToastUtils.showToast(activity,"保存失败")
}
}
})
复制代码
4.bean类的定义
class User{
@Column(isPrimaryKey = true)
var id:Int=0
var name:String?="你好"
var age:Int?=0
}
复制代码
其中能够经过Column进行注解定义(isPrimaryKey、isNull、isUnique)
5.数据表格变化(只支持增长字段)
修改数据库版本号Config.SQLITE_DB_VERSION,往上递增
在Application中对版本号进行监听,并对数据表进行更新
SQLiteVersionMigrate().setMigrateListener(object :SQLiteVersionMigrate.MigrateListener{ override fun onMigrate(oldVersion: Int, newVersion: Int) { for (i in oldVersion..newVersion){ if(i==2){ }
}
}
})
复制代码
(3)DataForHttp
val requestBuilder=RequestBuilder(object :RxObservableListener<HttpResult<List<WeChatNews>>>(mView){
override fun onNext(result: HttpResult<List<WeChatNews>>) {
mView?.refreshUI(result.result)
}
})
requestBuilder
.setUrl(ApiUrl.URL_WETCHAT_FEATURED)
.setTransformClass(WeChatNews().javaClass)
.setHttpTypeAndReqType(RequestBuilder.HttpType.DEFAULT_GET,RequestBuilder.ReqType.NO_CACHE_LIST)
.setParam("page",page)
.setParam("type","video")
.setParam("count",num)
rxManager.addObserver(DataManager.DataForHttp.httpRequest(requestBuilder))
复制代码
(4)DataForSharePreferences
1.插入基本数据
DataManager.DataForSharePreferences.saveObject("user","这是一条测试的内容")
ToastUtils.showToast(activity,"保存成功")
复制代码
2.查询基本类型数据
val con=DataManager.DataForSharePreferences.getObject("user","")
ToastUtils.showToast(activity,con!!)
复制代码
属性 | 做用 |
---|---|
isShowSystemActionBar | 重写该方法设置实现显示系统ActionBar |
isShowCustomActionBar | 重写该方法设置显示自定义Bar |
setCustomActionBar | 重写该方法设置自定义Bar |
属性 | 做用 |
---|---|
hideBackBtn | 隐藏返回按钮 |
setBarBackgroundColor | 设置Bar的背景颜色 |
setBarHeight | 设置Bar的高度 |
setTitleColor | 设置标题颜色 |
setTitle | 设置标题 |
setBackClick | 设置返回按钮监听 |
代码使用
defineActionBarConfig .setTitleSize(20f) .setBarHeight(DisplayUtils.dip2px(this,60f)) .setBarBackgroundColor(this,R.color.driver_font) .setTitle(getString(R.string.tab_Indicator_title))
属性 | 做用 |
---|---|
STATE_NO_DATA | 不显示加载框状态码 |
STATE_LOADING | 加载数据显示状态码 |
STATE_EMPTY | 没有数据显示状态码 |
STATE_DISCONNECT | 没有网络状态码 |
setOnDisConnectViewListener | 点击没有网络图标回调 |
setOnEmptyViewListener | 点击没有没有数据图标回调 |
showViewByState | 设置显示状态 |
getmEmptyView | 获取无数据状态View |
布局可设置参数 | |
loadingViewAnimation | 设置加载的drawable动画 |
loadingText | 加载时的文本 |
emptyImage | 空布局显示的图片 |
emptyText | 空布局文本 |
emptyViewRes | 设置自定义空布局 |
disConnectImage | 设置断网显示的图片 |
disConnectText | 设置断网显示的文本 |
tipTextSize | 文本字体大小 |
tipTextColor | 文本字体颜色 |
<com.youngmanster.collection_kotlin.base.stateview.StateView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:id="@+id/state_view">
</com.youngmanster.collection_kotlin.base.stateview.StateView >
复制代码
<include layout="@layout/layout_state"/>
复制代码
stateView.showViewByState(StateView.STATE_LOADING)
stateView.showViewByState(StateView.STATE_EMPTY)
stateView.showViewByState(StateView.STATE_NO_DATA)
stateView.showViewByState(StateView.STATE_DISCONNECT)
复制代码
// 项目的必须权限,没有这些权限会影响项目的正常运行
private val PERMISSIONS = arrayOf(
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_WAP_PUSH,
Manifest.permission.READ_CONTACTS
)
复制代码
permissionManager = PermissionManager
.with(this)
.setNecessaryPermissions(PERMISSIONS)
permissionManager?.requestPermissions()
复制代码
//重写
override fun onRequestPermissionsResult(requestCode: Int, @NonNull permissions: Array<String>, @NonNull grantResults: IntArray) {
if (requestCode == PermissionManager.PERMISSION_REQUEST_CODE) {//PERMISSION_REQUEST_CODE为请求权限的请求值
//有必须权限选择了禁止
if (permissionManager?.shouldShowRequestPermissionsCode == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED) {
ToastUtils.showToast(this, "能够在这里设置从新跳出权限请求提示框")
} //有必须权限选择了禁止不提醒
else if (permissionManager?.shouldShowRequestPermissionsCode == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED_NOT_REMIND) {
ToastUtils.showToast(this, "能够在这里弹出提示框提示去应用设置页开启权限")
permissionManager?.startAppSettings()
}
}
}
复制代码
属性 | 做用 |
---|---|
DIALOG_TEXT_TWO_BUTTON_DEFAULT | 默认弹出按钮提示 |
DIALOG_TEXT_TWO_BUTTON_CUSTOMIZE | 自定义弹出按钮提示 |
DIALOG_LOADING_PROGRASSBAR | 默认加载弹框 |
DIALOG_CHOICE_ITEM | 没有数据显示状态码 |
根据不一样的构造函数设置不一样的参数
属性 | 做用 |
---|---|
setContentView | 设置弹框布局样式 |
show | 显示弹框 |
isShowing | 判断弹框是否显示 |
dismiss | 弹框销毁 |
setCancelable | 点击返回键和外部是否能够取消 |
setOnBackPressDialogCancel | 设置为false时,点击弹框外部不可消失,点击返回按钮能够消失 |
setDialogInterval | 设置弹框和屏幕两边的间距 |
setDialogHeight | 设置弹框高度 |
属性 | 做用 |
---|---|
BasePopupWindow(Context context) | 调用该构造函数默认弹出框铺满全屏 |
BasePopupWindow(Context context, int w, int h) | 自定义弹出框高宽 |
showPopup | 在屏幕中央显示弹框 |
showPopupAsDropDown | 在指定控件底部显示弹框 |
showPopup | 在屏幕中央显示弹框 |
showPopupAsDropDown | 在指定控件底部显示弹框 |
setShowMaskView | 设置是否显示遮层 |
dismiss | 销毁弹出框 |
getPopupLayoutRes | 自定义弹出框的布局文件 |
getPopupAnimationStyleRes | 自定义弹出框的动画文件,不设置动画返回0 |
属性 | 做用 |
---|---|
tab_tabIndicatorWidth | 设置下滑线的长度 |
tab_tabIndicatorHeight | 设置下滑线的高度 |
tab_tabIndicatorColor | 下滑线颜色 |
tab_indicator_marginLeft | 设置下滑线外边距 |
tab_indicator_marginRight | 设置下滑线外边距 |
tab_indicator_marginTop | 设置下滑线外边距 |
tab_indicator_marginBottom | 设置下滑线外边距 |
tab_tabTextColor | 没选中字体颜色 |
tab_tabTextSize | 字体大小 |
tab_tabSelectedTextColor | 选中字体颜色 |
tab_padding | 下滑线内边距,block样式时能够经过该属性设置距离 |
tab_tabBackground | Tab 的背景颜色 |
tab_indicator_corner | 下滑线的圆角大小 |
tab_indicator_gravity(bottom、top | 设置下滑线显示的位置,只针对line和triangle |
tab_tabMode(scrollable、fixed) | Tab的显示模式 |
tab_indicator_style(line、triangle、block) | 下滑线的样式 |
属性 | 做用 |
---|---|
tab_tabIndicatorColor | 设置Tab颜色 |
tab_indicator_corner | 圆角大小 |
tab_indicator_marginLeft | 下滑线外边距 |
tab_indicator_marginRight | 下滑线外边距 |
tab_indicator_marginTop | 下滑线外边距 |
tab_indicator_marginBottom | 下滑线外边距 |
tab_tabTextColor | 没选中字体颜色 |
tab_tabSelectedTextColor | 选中字体颜色 |
tab_tabTextSize | 字体大小 |
tab_tabSelectedTextColor | 选中字体颜色 |
tab_padding | 内边距 |
tab_bar_color | bar的背景颜色 |
tab_bar_stroke_color | 外框的颜色 |
tab_bar_stroke_width | 外框的大小 |
tab_width | bar的长度 |
在外层布局使用AutoLineLayout
<com.youngmanster.collection_kotlin.base.customview.wraplayout.AutoLineLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.youngmanster.collection_kotlin.base.customview.wraplayout.AutoLineLayout>
复制代码
属性 | 做用 |
---|---|
setTitles | 设置TagItem内容 |
setTextSize | 设置TagItem字体大小 |
setTextColor | 设置TagItem字体颜色 |
setTextSelectColor | 设置TagItem选择字体颜色 |
setPaddingLeftAndRight | 设置TagIttem左右内边距 |
setPaddingTopAndBottom | 设置TagIttem上下内边距 |
setMarginAndTopBottom | 设置TagItem上下外边距 |
setMarginLeftAndRight | 设置TagItem左右外边距 |
setackgroudRes | 设置background Drawable |
setTagViewAlign | 设置总体TagItem的Align(LEFT,RIGHT,CENTER) |
<com.youngmanster.collection_kotlin.base.customview.tagview.TagView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tagView" />
复制代码
tagView.create(builder,object :TagView.TagViewPressListener{
override fun onPress(view: View, title: String, position: Int) {
ToastUtils.showToast(this@TagViewActivity,title)
}
})
复制代码
属性 | 做用 |
---|---|
px2dip | px值转换为dip或dp值,保证尺寸大小不变(有精度损失) |
px2dipByFloat | px值转换为dip或dp值,保证尺寸大小不变(无精度损失 |
dip2px | dip或dp值转换为px值,保证尺寸大小不变(有精度损失),相似Context.getDimensionPixelSize方法(四舍五入 |
dip2pxByFloat | dip或dp值转换为px值,保证尺寸大小不变(无精度损失),相似Context.getDimension方法 |
px2sp | px值转换为sp值,保证文字大小不变 |
sp2px | sp值转换为px值,保证文字大小不变 |
getScreenWidthPixels | 屏幕宽度 |
getScreenHeightPixels | 屏幕高度 |
getDisplayInfo | 获取设备信息 |
setStatusBarBlackFontBgColor | 设置黑色字体状态的背景颜色 |
setStatusBarColor | 设置状态栏背景颜色 |
setStatusBarFullTranslucent | 设置状态栏透明 |
getStatusBarHeight | 获取状态栏高度 |
getActionBarHeight | 获取ActionBar高度 |
属性 | 做用 |
---|---|
createColorStateList | 获取ColorStateList |
属性 | 做用 |
---|---|
WriterTxtFile | 写文件,其中append可设置是否添加在原内容的后边 |
ReadTxtFile | 读取文本文件中的内容,strFilePath表明文件详细路径 |
isCacheDataFailure | 判断缓存是否失效 |
checkFileExists | 检查文件是否存在 |
checkSaveLocationExists | 检查是否安装SD卡 |
deleteDirectory | 删除目录(包括:目录里的全部文件) |
deleteFile | 删除文件 |
getFileOrFilesSize | 获取文件指定文件的指定单位的大小,其中sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB |
getFileSize | 获取指定文件大小 |
属性 | 做用 |
---|---|
getAllPermissons | 获取应用用到的全部权限 |
属性 | 做用 |
---|---|
loadImg | 加载图片 |
loadImgBlur | Glide实现高斯模糊 |
loadImgBlur | Glide实现高斯模糊,可设置模糊的程度 |