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實現高斯模糊,可設置模糊的程度 |