Collection聚合了項目搭建的一些基本模塊蟹地,節(jié)約開發(fā)者時間态坦,協(xié)助項目的快速搭建,RecyclerView+Adapter+Retrofit+RxJava+MVP+DataManager+基本Base,能夠滿足一個項目的基本實現(xiàn)。
github地址:https://github.com/usernameyangyan/Collection-Android
更新說明
v1.3.9
1.上傳下載增加進度條
2.Fragment增加布局和數(shù)據(jù) 初始化懶加載
3.網(wǎng)絡請求優(yōu)化(解決內(nèi)存泄露問題)
4.增加文件斷點下載
5.增加MVP注解生成文件(https://github.com/usernameyangyan/MvpAnnotationProject)
6.增加網(wǎng)絡請求通過同步上傳文件
v1.3.8
1.DialogFragment替換AlertDialog
2.SharePreference統(tǒng)一初始化
3.簡化Fragment的跳轉(zhuǎn)邏輯
4.DataManager.DataForHttp增加文件下載
v1.3.4
1.修復SQLite沒有創(chuàng)建表查詢異常
2.SQLite增加按條件查詢List
3.增加PopupWindow顯示位置設置
4.解決SQLit內(nèi)容為null報錯
5.狀態(tài)欄修改:增加設置狀態(tài)欄透明+黑色字體
v1.2.9
1.去掉Relam數(shù)據(jù)模塊,安裝包大小減少
2.對原生SQLite數(shù)據(jù)庫進行封裝,使用更加方便
3.對DataManager的使用進行修整
4.增加AutoLineLayout/TagView
5.增加LinkedMultiValueMap
6.增加RxJavaUtils,可進行子/主線程數(shù)據(jù)處理切換
v1.2.8
1.更新Realm數(shù)據(jù)庫依賴。
2.更新RxJava册烈、rxandroid、retrofit婿禽、converter-gson赏僧、adapter-rxjava2依賴。
3.封裝好Fragment之間的交互扭倾,項目中可以選擇使用一個Activity來作為跟容器淀零,其它實現(xiàn)頁面統(tǒng)一使用fragment來實現(xiàn)。
4.collectionLibary中的Config配置類增加json字段過濾膛壹、網(wǎng)絡請求超時設置驾中、網(wǎng)絡請求頭設置(全局請求頭)。
5.增加自動換行布局模聋。
6.Realm增加按數(shù)據(jù)字段查詢和刪除接口肩民。
7.網(wǎng)絡請求類型HttpType增加json類型請求參數(shù)。
8.網(wǎng)絡請求增加個別接口請求頭設置链方。
9.增加適配不同手機像素持痰。
v1.2.7
1.增加自定義控件TabLayout。
v1.2.6
1.RxJava的依賴更新祟蚀。
2.修正RecyclerView頭部布局不能鋪滿問題共啃。
3.PopupWindow的使用。
4.DisplayUtils工具類對狀態(tài)欄的修改暂题。
v1.2.5
1.修正Retrofit DEFAULT_POST請求方式指向錯誤。
2.Retrofit 數(shù)據(jù)解析兼容沒有公用been類究珊,可以指定公用been類和不指定公用been類薪者、或者混合使用。
3.Realm增加數(shù)據(jù)遷移(數(shù)據(jù)庫字段增加或移除)剿涮。
4.增加幾種通用的Dialog彈窗言津,提供方法自定義攻人。
5.提供幾種比較常用的Utils工具類
v1.2.4
1.增加DataManager用來統(tǒng)一管理數(shù)據(jù)請求,包括Retrofit的請求悬槽、SharePreference以及Realm的數(shù)據(jù)請求怀吻。
2.Retrofit的請求的整合。
3.PullToRefreshRecyclerView的空布局bug修改初婆。
框架的引入
implementation 'com.youngman:collectionlibrary:1.3.8'
Error:Could not find com.android.support:appcompat-v7:27.x.x.
因為library的Support Repository是27.x.x,可能跟項目有所沖突蓬坡,如果sdk已經(jīng)裝了27還是會出現(xiàn)同樣的錯誤。
解決辦法:在項目根build.gradle中加入 maven { url "https://maven.google.com" }
一磅叛、框架整體模塊
二屑咳、PullToRefreshRecyclerView的使用
屬性 | 作用 |
---|---|
addHeaderView | 增加頭部布局, 暫時只能添加一個頭布局 |
setEmptyView | 設置自定義的加載布局和空布局 |
setRefreshView | 自定義刷新View |
setDefaultLoadingMoreNoDataMessage | 設置默認沒有數(shù)據(jù)的內(nèi)容 |
setLoadMoreView | 自定義加載更多View |
setNoMoreDate | 顯示沒有更多數(shù)據(jù) |
setAutoRefresh | 自動刷新 |
refreshComplete | 刷新數(shù)據(jù)完成 |
loadMoreComplete | 加載更多數(shù)據(jù)完成 |
setPullRefreshEnabled | 是否允許刷新 |
setLoadMoreEnabled | 是否允許加載更多 |
setRefreshTimeVisible | 顯示加載更新時間 |
isLoading | 是否正在loading數(shù)據(jù) |
isRefreshing | 正在refreshing數(shù)據(jù) |
setRefreshAndLoadMoreListener | 刷新和加載更多回調(diào) |
destroy | 內(nèi)存回收 |
1.框架默認下拉刷新弊琴、上拉加載更多樣式
(1)布局文件
<com.youngmanster.collection_kotlin.recyclerview.PullToRefreshRecyclerView
android:id="@+id/recycler_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
(2)代碼設置
recycler_rv.setPullRefreshEnabled(true);
recycler_rv.setLoadMoreEnabled(true);
2兆龙、自定義下拉刷新、上拉加載更多樣式
刷新幾種狀態(tài):
屬性 | 作用 |
---|---|
STATE_PULL_DOWN | 拉的狀態(tài)(還沒到下拉到固定的高度時) |
STATE_RELEASE_REFRESH | 下拉到固定高度提示釋放刷新的狀態(tài) |
STATE_REFRESHING | 正在刷新狀態(tài) |
STATE_DONE | 刷新完成 |
加載更多幾種狀態(tài):
屬性 | 作用 |
---|---|
STATE_LOADING | 正在加載 |
STATE_COMPLETE | 加 載完成 |
STATE_NODATA | 沒有數(shù)據(jù) |
(1)代碼設置
recycler_rv.setPullRefreshEnabled(true);
recycler_rv.setLoadMoreEnabled(true);
recycler_rv.setRefreshAndLoadMoreListener(this);
recycler_rv.setRefreshView(new DefinitionAnimationRefreshHeaderView(getActivity()));
recycler_rv.setLoadMoreView(new DefinitionAnimationLoadMoreView(getActivity()));
自定義刷新的步驟:
①自定義View繼承BasePullToRefreshView敲董,重寫initView()紫皇、setRefreshTimeVisible(boolean show)、destroy()方法:
1.在initView()做自定義布局腋寨、相關動畫的初始化聪铺,最后在initView()方法的最后面添加以下代碼即可。
mContainer = LayoutInflater.from(context).inflate(R.layout.collection_library_layout_default_arrow_refresh, null);
//把刷新頭部的高度初始化為0
LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.setMargins(0, 0, 0, 0);
this.setLayoutParams(lp);
this.setPadding(0, 0, 0, 0);
addView(mContainer, new LayoutParams(LayoutParams.MATCH_PARENT, 0));
setGravity(Gravity.BOTTOM);
//測量高度
measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mMeasuredHeight = getMeasuredHeight();
2.setRefreshTimeVisible(boolean show)是用來設置是否顯示刷新時間控件精置,在默認刷新樣式中通過mRecyclerView.setRefreshTimeVisible(false)即可隱藏刷新時間计寇,如果在自定義的布局中沒有這項這個方法就可以忽略。
3.destroy()是用來關掉改頁面時把刷新View的一些動畫等釋放脂倦,防止內(nèi)存泄漏番宁。
②實現(xiàn)BasePullToRefreshView.OnStateChangeListener監(jiān)聽(重點,主要是進行狀態(tài)切換后的相關操作邏輯)
1.在構造函數(shù)中設置 onStateChangeListener=this
2.onStateChange的模板樣式
@Override
public void onStateChange(int state) {
//下拉時狀態(tài)相同不做繼續(xù)保持原有的狀態(tài)
if (state == mState) return ;
//根據(jù)狀態(tài)進行動畫顯示
switch (state){
case STATE_PULL_DOWN:
clearAnim();
startAnim();
break;
case STATE_RELEASE_REFRESH:
break;
case STATE_REFRESHING:
clearAnim();
startAnim();
scrollTo(mMeasuredHeight);
break;
case STATE_DONE:
break;
}
mState = state;
}
自定義加載更多的步驟(包括沒有更多數(shù)據(jù)顯示的操作):
①自定義View繼承BaseLoadMoreView赖阻,重寫initView()蝶押、setState()、destroy()方法:
1.在initView()做自定義布局火欧、相關動畫的初始化棋电,最后在initView()方法的最后面添加以下代碼即可
mContainer = LayoutInflater.from(context)
.inflate(R.layout.layout_definition_animation_loading_more, null)
addView(mContainer)
gravity = Gravity.CENTER
2.destroy()是用來關掉改頁面時把刷新View的一些動畫等釋放,防止內(nèi)存泄漏苇侵。
3.在setState()進行狀態(tài)切換后的相關操作邏輯赶盔,模板樣式
@Override
public void setState(int state) {
if(isDestroy){
return;
}
switch (state){
case STATE_LOADING:
loadMore_Ll.setVisibility(VISIBLE);
noDataTv.setVisibility(INVISIBLE);
animationDrawable= (AnimationDrawable) loadingIv.getDrawable();
animationDrawable.start();
this.setVisibility(VISIBLE);
break;
case STATE_COMPLETE:
if(animationDrawable!=null){
animationDrawable.stop();
}
this.setVisibility(GONE);
break;
case STATE_NODATA:
loadMore_Ll.setVisibility(INVISIBLE);
noDataTv.setVisibility(VISIBLE);
animationDrawable= (AnimationDrawable) loadingIv.getDrawable();
animationDrawable.start();
this.setVisibility(VISIBLE);
break;
}
mState = state;
}
4.注意:在自定義加載更多樣式時,如果需要有沒有更多加載更多數(shù)據(jù)提示同樣需要在布局中寫好榆浓,然后在onSatae中根據(jù)狀態(tài)對加載和沒有跟多顯示提示進行顯示隱藏操作于未。
3、上拉加載更多配合SwipeRefreshLayout使用
(1)布局文件
<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>
(2)代碼設置
recycler_rv.setLoadMoreEnabled(true);
recycler_rv.setRefreshAndLoadMoreListener(this);
recycler_rv.setLoadMoreView(DefinitionAnimationLoadMoreView(activity));
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent);
swipeRefreshLayout.setOnRefreshListener(this);
(3)注意的問題
由于PullToRefreshRecyclerView的下拉刷新和下拉加載更多完成時會自動刷新Adapter,而SwipeRefreshLayout刷新完成時需要手動進行notifyDataSetChanged刷新適配器。
4烘浦、RecyclerView添加頭部抖坪、空布局
View emptyView = LayoutInflater.from(getActivity()).inflate(R.layout.layout_empty,null);
mRecyclerView.setEmptyView(emptyView);
emptyView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i=0;i<10;i++){
mDatas.add("item"+i);
}
definitionRefreshAdapter.notifyDataSetChanged();
}
});
5、上拉加載更多實現(xiàn)NoMoreData闷叉、自動刷新
(1)上拉加載更多數(shù)據(jù)的布局設置在上面的自定義LoadingMoreView中有介紹擦俐,如果要顯示沒有更多數(shù)據(jù)提示只需要在LoadMore返回數(shù)據(jù)之后設置:
mRecyclerView.setNoMoreDate(true)
(2)自動刷新需要列表已經(jīng)填充了數(shù)據(jù)之后再做自動刷新操作才會生效:
mRecyclerView.setAutoRefresh()
6.Collection庫的刷新加載文本已經(jīng)適配了中文、英文握侧、繁體蚯瞧,如果對默認刷新加載顯示文本進行修改,通過LoadingTextConfig設置藕咏,可在Application全局設置
LoadingTextConfig textConfig=LoadingTextConfig.getInstance(getApplicationContext());
textConfig
.setCollectionLoadingMore("加載更多")
.setCollectionLastRefreshTimeTip("更新時間:")
.setCollectionNoMoreData("沒有更多數(shù)據(jù)")
.setCollectionPullReleaseText("釋放刷新")
.setCollectionRefreshing("正在刷新")
.setCollectionPullDownRefreshText("下拉刷新")
.setCollectionRefreshDone("加載完成");
PullToRefreshRecyclerViewUtils.loadingTextConfig=textConfig;
7状知、PullToRefreshRecyclerView的其他使用以及注意問題
1.下面是下拉刷新上拉加載更多的一些操作模板
public void refreshUI() {
if (defaultRefreshAdapter == null) {
defaultRefreshAdapter = new DefaultRecyclerAdapter(getActivity(), mDatas, mRecyclerView);
mRecyclerView.setAdapter(defaultRefreshAdapter);
} else {
if (mRecyclerView != null) {
if (mRecyclerView.isLoading()) {
mRecyclerView.loadMoreComplete();
} else if (mRecyclerView.isRefreshing()) {
mRecyclerView.refreshComplete();
}
}
}
}
2.注意問題
①在設置RecyclerView是要設LayoutManager
②如果使用PullToRefreshRecyclerView在Activty/Fragment中的onDestroy()調(diào)用mRecyclerView.destroy()防止內(nèi)存泄漏。
@Override
public void onDestroy() {
super.onDestroy();
mRecyclerView.destroy()
}
③設置refreshRv.setLoadMoreEnabled(true)孽查,當填充的數(shù)據(jù)的列表size為0的同時還通過RecyclerView設置分割線底部就會出現(xiàn)一個空白的item饥悴,這個item就是加載更多顯示的Item。
解決辦法:不通過RecyclerView設置分割線盲再,直接在布局自定義分割線西设。
三、BaseRecyclerViewAdapter的使用
1.BaseRecyclerViewAdapter的比原始Adapter的代碼量減小
在BaseRecyclerViewAdapter中的BaseViewHolder進行布局轉(zhuǎn)化答朋,同時定義了一些比較基本的View操作贷揽,使用簡單。
(1)使用代碼:
public class DefinitionRecyclerAdapter extends BaseRecyclerViewAdapter<String> {
public DefinitionRecyclerAdapter(Context mContext, List<String> mDatas, PullToRefreshRecyclerView pullToRefreshRecyclerView) {
super(mContext, R.layout.item_pull_refresh, mDatas, pullToRefreshRecyclerView);
}
@Override
protected void convert(BaseViewHolder baseViewHolder, String s) {
baseViewHolder.setText(R.id.title,s);
}
}
①使用者需要在繼承BaseRecyclerViewAdapter時傳入一個數(shù)據(jù)實體類型梦碗,具體的操作在convert()方法中操作禽绪。
②BaseViewHolder提供了一些常用View的基本操作,通過baseViewHolder.getView()可得到布局中的控件洪规。
(2)BaseRecyclerViewAdapter提供了兩個構造函數(shù)
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;
}
主要是對PullToRefreshRecyclerView和RecyclerView的適配印屁,使用時適配器根據(jù)需要使用對應的構造函數(shù)。
2.添加Item的點擊和長按事件
(1) Item點擊事件實現(xiàn)
itemClickAdapter.setOnItemLongClickListener(new BaseRecyclerViewAdapter.onItemLongClickListener() {
@Override
public boolean onItemLongClick(View view, int position) {
showToast("進行長按操作");
return true;
}
});
3.多布局的使用
BaseRecyclerViewAdapter的多布局實現(xiàn)需要注意的四步:
①自定義Adapter需要繼承BaseRecyclerViewMultiItemAdapter斩例。
② 數(shù)據(jù)實體類需要繼承BaseMultiItemEntity雄人,在getItemViewType()返回布局類型。
③ 在自定義Adapter中的構造函數(shù)中通過addItemType()傳入不同類型對應的布局念赶。
④在自定義Adapter中的convert進行類型判斷础钠,做相對應的操作。
public class MultipleAdapter extends BaseRecyclerViewMultiItemAdapter<MultiItem> {
private int mHeight;
public MultipleAdapter(Context mContext, List<MultiItem> mDatas) {
super(mContext, mDatas);
mHeight = DisplayUtil.dip2px(mContext, 100);
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
protected void convert(BaseViewHolder baseViewHolder, MultiItem multiItem) {
switch (baseViewHolder.getItemViewType()) {
case MultiItem.TYPE_TEXT:
baseViewHolder.getView(R.id.card_view).getLayoutParams().height = mHeight;
baseViewHolder.setText(R.id.title, multiItem.getTitle());
break;
case MultiItem.TYPE_IMG:
baseViewHolder.setImageResource(R.id.ivImg, multiItem.getRes());
break;
case MultiItem.TYPE_TEXT_IMG:
baseViewHolder.setImageResource(R.id.ivImg, multiItem.getRes());
baseViewHolder.setText(R.id.titleTv, multiItem.getTitle());
break;
}
}
4.添加拖拽叉谜、滑動刪除
局限:只針對RecyclerView旗吁,對本框架封裝的PullToRefreshRecyclerView會出現(xiàn)混亂。
①BaseRecyclerViewAdapter和BaseRecyclerViewMultiItemAdapter都已經(jīng)封裝支持拖拽停局、滑動阵漏,適配器只需要根據(jù)需求繼承其中一個即可驻民。
②框架提供了一個BaseRecycleItemTouchHelper,對于普通的左右滑動刪除履怯、拖拽已經(jīng)實現(xiàn),如果想自定義可以繼承BaseRecycleItemTouchHelper類裆泳,再重寫相對應的方法進行實現(xiàn)叹洲。
④在Activity/Fragment中需要實現(xiàn)以下代碼:
ItemTouchHelper.Callback callback=new BaseRecycleItemTouchHelper(dragAndDeleteAdapter);
ItemTouchHelper itemTouchHelper=new ItemTouchHelper(callback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
⑤BaseRecyclerViewAdapter.OnDragAndDeleteListener進行操作動作完成之后的回調(diào)。
@Override
public void onMoveComplete() {
ToastUtils.showToast(this, "移動操作完成");
}
@Override
public void onDeleteComplete() {
ToastUtils.showToast(this, "刪除操作完成");
}
四工禾、MVP+RxJava+Retrofit的封裝使用
1.在使用Retrofit請求網(wǎng)絡之前需要進行配置运提,在框架中提供了了Config配置類
屬性 | 作用 |
---|---|
DEBUG | 是否為BuildConfig.DEBUG,日志輸出需要 |
CONTEXT | 設置Context,必填項 |
URL_DOMAIN | 網(wǎng)絡請求的域名,需要以“/”結(jié)尾 |
URL_CACHE | 網(wǎng)絡緩存地址闻葵,需要設置緩存才可以成功 |
MAX_CACHE_SECONDS | 設置OkHttp的緩存機制的最大緩存時間,默認為一天 |
MAX_MEMORY_SIZE | 緩存最大的內(nèi)存,默認為10M |
MClASS | 設置網(wǎng)絡請求json通用解析類 |
EXPOSEPARAM | Json數(shù)據(jù)某些字段在沒有數(shù)據(jù)是會不返回來民泵,可通過這個屬性設置過濾 |
USER_CONFIG | SharePreference保存的名稱 |
CONNECT_TIMEOUT_SECONDS | 請求接口超時設定 |
READ_TIMEOUT_SECONDS | 請求接口超時設定 |
HEADERS | 設置Http全局請求頭 |
SQLITE_DB_NAME | 數(shù)據(jù)庫名稱 |
SQLITE_DB_VERSION | 數(shù)據(jù)庫版本名 |
在項目中需要根據(jù)項目需要進行配置,在Application中設置
private void config(){
//基本配置
Config.DEBUG= BuildConfig.DEBUG;
Config.CONTEXT=this;
//Retrofit配置
Config.URL_CACHE=AppConfig.URL_CACHE;
Config.MClASS= Result.class;
Config.URL_DOMAIN="https://api.apiopen.top/";
//SharePreference配置
Config.USER_CONFIG="Collection_User";
Config.SQLITE_DB_VERSION=0;
}
根據(jù)項目需要定義一個通用的數(shù)據(jù)實體類槽畔,這是本例通用實體類栈妆,這個類需要設置到Applicatin中
public class Result<T> implements Serializable {
private int code;
private String msg;
private T newslist;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getNewslist() {
return newslist;
}
public void setNewslist(T newslist) {
this.newslist = newslist;
}
}
注意:由于每個項目返回來的json數(shù)據(jù)格式有所不同,如果Result中代表的字段例如newslist沒有內(nèi)容返回來的時候這個字段需要后臺控制不返回厢钧,如果不做處理會報解析錯誤,可以通過設置Config.EXPOSEPARAM屬性過濾字段鳞尔。
2.RxJava+Retrofit+OkHttp
(1)RequestBuilder的設置(網(wǎng)絡請求的配置)
屬性 | 作用 |
---|---|
ReqType | 數(shù)據(jù)處理的方式,默認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 | 自定義磁盤緩存,沒有網(wǎng)絡返回磁盤緩存喻圃,返回List |
DISK_CACHE_NO_NETWORK_MODEL | /自定義磁盤緩存萤彩,沒有網(wǎng)絡返回磁盤緩存,返回Model |
DOWNLOAD_FILE_MODEL | 文件下載模式级及,返回Model |
HttpType | 網(wǎng)絡請求方式,默認DEFAULT_GET |
DEFAULT_GET | GET請求 |
DEFAULT_POST | POST請求 |
FIELDMAP_POST | 如果請求URL出現(xiàn)中文亂碼乒疏,可選擇這個 |
JSON_PARAM_POST | json格式請求參數(shù) |
ONE_MULTIPART_POST | 上傳一張圖片 |
MULTIPLE_MULTIPART_POST | 上傳多張圖片 |
DOWNLOAD_FILE_GET | 下載文件 |
ReqMode | 請求模式,默認ASYNCHRONOUS |
ASYNCHRONOUS | 異步請求 |
SYNCHRONIZATION | 同步請求 |
其它參數(shù) | |
setTransformClass | 設置請求轉(zhuǎn)化Class |
setUrl | 設置請求url,如果不設置完全連接則會使用Config.URL_DOMIN進行拼接 |
setFilePathAndFileName | 設置自定義緩存時的路徑和文件名 |
setLimtHours | 設置自定義緩存的有效時間 |
setHeader | 設置請求頭 |
setHeaders | 設置請求頭集合 |
setHttpTypeAndReqType | 設置請求數(shù)據(jù)類型和請求方式 |
setImagePath | 設置上傳圖片路徑 |
setImagePaths | 設置多張圖片路徑 |
isUserCommonClass | 設置是否使用公用類轉(zhuǎn)化 |
setReqMode | 設置同步異步 |
isOpenBreakpointDownloadOrUpload | 是否開啟斷點下載 |
(2)使用模塊
RequestBuilder<Result<List<WeChatNews>>> resultRequestBuilder = new RequestBuilder<>(new RxObservableListener<Result<List<WeChatNews>>>() {
@Override
public void onNext(Result<List<WeChatNews>> result) {
mView.refreshUI(result.getResult());
}
});
resultRequestBuilder
.setUrl(ApiUrl.URL_WETCHAT_FEATURED)
.setTransformClass(WeChatNews.class)
.setParam("page",page)
.setParam("type","video")
.setParam("count",num);
rxManager.addObserver(DataManager.DataForHttp.httpRequest(resultRequestBuilder));
(3)Retrofit的擴展
如果存在DataManager提供的方法滿足不了的請求可以通過RetrofitManager提供的getCustomizeRequest進行自定義ApiService以及OkHttp饮焦,然后通過RxSubscriber進行回調(diào)怕吴。
Observable<WeChatAccessToken> observable = RetrofitManager.getCustomizeRequest().getCustomizeApiService(ApiService.class)
.getWeChatStr(ApiUrl.URL_WECHAT_HOST + ApiUrl.ACCESS_TOKEN, reqParams);
DisposableObserver<WeChatAccessToken> observer = observable
.compose(RxSchedulers.<WeChatAccessToken>io_main())
.subscribeWith(new RxSubscriber<WeChatAccessToken>() {
@Override
public void _onNext(WeChatAccessToken weChatAccessToken) {
getUserInfo(weChatAccessToken);
}
@Override
public void _onError(NetWorkCodeException.ResponseThrowable responseThrowable) {
showToast(R.string.wx_LoginResultEmpty);
hideLoadingDialog();
finish();
}
@Override
public void _onComplete() {
}
});
rxManager.addObserver(observer);
定義一個ApiService類
public interface ApiService {
/**
* 微信精選
* @param url
* @param map
* @return
*/
@GET
Observable<Result<List<WeChatNews>>> getWeChatFeaturedNews(@Url String url, @QueryMap Map<String,Object> map);
}
注意:
(1)RxObservableListener有三個回調(diào)方法
void onNext(T result);
void onComplete();
void onError(NetWorkCodeException.ResponseThrowable e);
只會重寫onNext方法,其它兩個方法可以自行選擇重寫县踢。
這兩個構造函數(shù)主要主要是為了統(tǒng)一處理onError的转绷,如果要自定義錯誤提醒,則可以選擇第二個構造函數(shù)硼啤。
(3)通過DataManager的網(wǎng)絡請求方式會返回來一個DisposableObserver议经,需要把它通過rxManager.addObserver()添加進CompositeDisposable才能正常執(zhí)行,方便對網(wǎng)絡請求的銷毀管理。
(4)如果項目沒有統(tǒng)一的解析been類,那么Config的公用類就不用設置了煞肾,在Retrofit請求的時候直接setTransformClass指定一個解析類就可以了
(5)如果項目想兩種方式共存咧织,那么在請求的時候需要通過setUserCommonClass(false)設置才能不使用統(tǒng)一解析類進行解析
(6)請求的域名已經(jīng)在Application設置好了,setUrl不需要填完整的url
②要區(qū)分清楚接口返回的數(shù)據(jù)時List還是Model籍救,從而選擇對應的ReqType
(7)setRequestParam可以設置參數(shù)集合习绢,setParam可以單個設置
(8)使用DISK_CACHE_LIST_LIMIT_TIME/DISK_CACHE_MODEL_LIMIT_TIME這兩個顯示限時緩存時需要通過setFilePathAndFileName()設置保存路徑setLimtHours()設置緩存時間(單位為:小時)
(9)如果要上傳單張圖片需要用到HttpType.ONE_MULTIPART_POST的請求方式,同時通過RequestBuilder設置MultipartBody.Part
3.MVP
1.寫一個Contract類對Presenter和View進行統(tǒng)一管理(View需要實現(xiàn)BaseView,Presenter需要實現(xiàn)BasePresenter<T>
public interface WeChatFeaturedContract {
interface View extends BaseView {
void refreshUI(List<WeChatNews> newsList);
}
abstract class Presenter extends BasePresenter<View> {
public abstract void requestFeaturedNews(int page, int num);
}
}
2.寫一個具體的Presenter類實現(xiàn)WeChatChinaNewsContract.Presenter,在里面做具體的邏輯處理蝙昙,處理完成再通過mView進行View的處理
3.Activity/Fragment實現(xiàn)IBaseActivity<T extends BasePresenter>/IBaseFragment<T extends BasePresenter>以及定義好的WeChatChinaNewsContract.View
4.缺陷:View在使用時需要轉(zhuǎn)化成在具體的子類才能調(diào)用相關方法闪萄。
5.具體使用可以參照demo
五、DataManager的使用(Http奇颠、Sharepreference败去、SQLite)
(1)DataManager基本屬性
屬性 | 作用 |
---|---|
DataForSqlite | 數(shù)據(jù)庫模塊 |
insert | 插入bean數(shù)據(jù) |
insertList | 插入List數(shù)據(jù) |
insertListBySync | 異步插入List數(shù)據(jù) |
queryByFirstByWhere | 根據(jù)條件查詢 |
queryAll | 查詢某個bean類的全部數(shù)據(jù) |
queryAllBySync | 異步查詢某個bean類的全部數(shù)據(jù) |
queryByFirst | 查詢某個bean類的第一條數(shù)據(jù) |
delete | 根據(jù)條件刪除數(shù)據(jù) |
deleteAll | 刪除某個bean類的所有數(shù)據(jù) |
deleteTable | 刪除數(shù)據(jù)表 |
update | 更新某個bean類的 |
queryOfPageByWhere | 根據(jù)條件分頁查詢,實體類必須包含PrimaryKey |
queryOfPage | 分頁查詢烈拒,實體類必須包含PrimaryKey |
updateTable | 更新數(shù)據(jù)表圆裕,用于增加字段 |
execQuerySQL | Sql語句查詢 |
DataForHttp | Http模塊 |
httpRequest | 網(wǎng)絡請求,傳入RequestBuilder |
DataForSharePreferences | SharePreference模塊 |
saveObject | 保存基本類型數(shù)據(jù) |
getObject | 獲取基本類型數(shù)據(jù) |
(2)DataForSqlite
1.插入一條數(shù)據(jù)
user=new User();
user.setId(0);
user.setName("Young1");
user.setAge(14);
user.setAddress("山東省");
user.setStr("eeeee");
DataManager.DataForSqlite.insert(user);
showToast("保存成功");
2.查詢數(shù)據(jù)
user=DataManager.DataForSqlite.queryByFirst(User.class);
String showContent="用戶Id:"+user.getId()+"\n"+"用戶姓名:"+user.getName()+"\n"+"用戶年齡:"+user.getAge()+"\n"+"用戶地址:"+user.getAddress();
showToast(showContent);
3.批量插入數(shù)據(jù)(可同步可異步)
List<User> users=new ArrayList<>();
for(int i=0;i<10000;i++){
user=new User();
user.setId(i);
user.setName("Young1");
user.setAge(14);
user.setAddress("廣州市");
users.add(user);
}
DataManager.DataForSqlite.insertListBySync(User.class, users, new SQLiteDataBase.InsertDataCompleteListener() {
@Override
public void onInsertDataComplete(boolean isInsert) {
if(isInsert){
ToastUtils.showToast(getActivity(),"保存成功");
}else{
ToastUtils.showToast(getActivity(),"保存失敗");
}
}
});
4.bean類的定義
public class User {
@Column(isPrimaryKey =true)
private int id;
private String name;
private int age;
private String address;
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
其中可以通過Column進行注解定義(isPrimaryKey缺菌、isNull葫辐、isUnique)
5.數(shù)據(jù)表格變化(只支持增加字段)
修改數(shù)據(jù)庫版本號Config.SQLITE_DB_VERSION,往上遞增
-
在Application中對版本號進行監(jiān)聽伴郁,并對數(shù)據(jù)表進行更新
SQLiteVersionMigrate sqLiteVersionMigrate=new SQLiteVersionMigrate(); sqLiteVersionMigrate.setMigrateListener(new SQLiteVersionMigrate.MigrateListener() { @Override public void onMigrate(int oldVersion, int newVersion) { for (int i=oldVersion;i<=newVersion;i++){ if(i==2){ } } } });
(3)DataForHttp
RequestBuilder<Result<List<WeChatNews>>> resultRequestBuilder = new RequestBuilder<>(new RxObservableListener<Result<List<WeChatNews>>>(mView) {
@Override
public void onNext(Result<List<WeChatNews>> result) {
mView.refreshUI(result.getResult());
}
});
resultRequestBuilder
.setUrl(ApiUrl.URL_WETCHAT_FEATURED)
.setTransformClass(WeChatNews.class)
.setParam("page",page)
.setParam("type","video")
.setParam("count",num);
rxManager.addObserver(DataManager.DataForHttp.httpRequest(resultRequestBuilder));
(4)DataForSharePreferences
1.插入基本數(shù)據(jù)
DataManager.DataForSharePreferences.saveObject("user","這是一條測試的內(nèi)容")
ToastUtils.showToast(activity,"保存成功")
2.查詢基本類型數(shù)據(jù)
val con=DataManager.DataForSharePreferences.getObject("user","")
ToastUtils.showToast(activity,con)
六.Base的使用
1.為了方便Activity/Fragment設置頂部菜單欄耿战,繼承IBaseActivity/IBaseFragment即可顯示一個簡單的頂部菜單,IBaseFragment的頂部菜單默認隱藏焊傅,下面以IBaseActivity的頂部菜單作為例子
屬性 | 作用 |
---|---|
isShowSystemActionBar | 重寫該方法設置實現(xiàn)顯示系統(tǒng)ActionBar |
isShowCustomActionBar | 重寫該方法設置顯示自定義Bar |
setCustomActionBar | 重寫該方法設置自定義Bar |
- 如果使用默認自定義Bar可通過DefaultDefineActionBarConfig進行相關設置
屬性 | 作用 |
---|---|
hideBackBtn | 隱藏返回按鈕 |
setBarBackground | 設置Bar的背景顏色 |
setBarHeight | 設置Bar的高度 |
setTitleColor | 設置標題顏色 |
setTitle | 設置標題 |
setBackClick | 設置返回按鈕監(jiān)聽 |
- 代碼使用
defineActionBarConfig
.setTitleSize(20f)
.setBarHeight(DisplayUtils.dip2px(this,60f))
.setBarBackground(this,R.color.driver_font)
.setTitle(getString(R.string.tab_Indicator_title))
2.使用Fragment實現(xiàn)交互
屬性 | 作用 |
---|---|
fragmentLayoutId | 設置顯示Fragment的根布局id,在Activity中設置 |
startFragmentForResult(...) | 和回調(diào)結(jié)果跳轉(zhuǎn) |
onFragmentResult(....) | Fragment的結(jié)果回調(diào) |
setResult(...) | onFragmentResult回調(diào)的結(jié)果設置 |
startFragment(...) | 普通跳轉(zhuǎn)剂陡,具體使用查看IBaseActivity |
isRootFragment() | 判斷是否是根Fragment |
3.StateView(數(shù)據(jù)加載頁面)
屬性 | 作用 |
---|---|
STATE_NO_DATA | 不顯示加載框狀態(tài)碼 |
STATE_LOADING | 加載數(shù)據(jù)顯示狀態(tài)碼 |
STATE_EMPTY | 沒有數(shù)據(jù)顯示狀態(tài)碼 |
STATE_DISCONNECT | 沒有網(wǎng)絡狀態(tài)碼 |
setOnDisConnectViewListener | 點擊沒有網(wǎng)絡圖標回調(diào) |
setOnEmptyViewListener | 點擊沒有沒有數(shù)據(jù)圖標回調(diào) |
showViewByState | 設置顯示狀態(tài) |
getmEmptyView | 獲取無數(shù)據(jù)狀態(tài)View |
布局可設置參數(shù) | |
loadingViewAnimation | 設置加載的drawable動畫 |
loadingText | 加載時的文本 |
emptyImage | 空布局顯示的圖片 |
emptyText | 空布局文本 |
emptyViewRes | 設置自定義空布局 |
disConnectImage | 設置斷網(wǎng)顯示的圖片 |
disConnectText | 設置斷網(wǎng)顯示的文本 |
tipTextSize | 文本字體大小 |
tipTextColor | 文本字體顏色 |
(1)定義一個通用布局
<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 >
(2)添加到Ui頁面的layout中
<include layout="@layout/layout_state"/>
注意:上面的語句添加的layout最外層最好是LinearLayout以及設置為android:orientation="vertical"
(3)通過以下語句進行狀態(tài)切換
stateView.showViewByState(StateView.STATE_LOADING);
stateView.showViewByState(StateView.STATE_EMPTY);
stateView.showViewByState(StateView.STATE_NO_DATA);
stateView.showViewByState(StateView.STATE_DISCONNECT);
3.三步實現(xiàn)Permission(權限)設置
// 項目的必須權限,沒有這些權限會影響項目的正常運行
private static final String[] PERMISSIONS = new String[]{
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_WAP_PUSH,
Manifest.permission.READ_CONTACTS
};
(2)權限通過PermissionManager管理
permissionManager=PermissionManager.with(this).
setNecessaryPermissions(PERMISSIONS);
permissionManager.requestPermissions();
(3)頁面重寫onRequestPermissionsResult
//重寫
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PermissionManager.PERMISSION_REQUEST_CODE) {//PERMISSION_REQUEST_CODE為請求權限的請求值
//有必須權限選擇了禁止
if (permissionManager.getShouldShowRequestPermissionsCode() == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED) {
ToastUtils.showToast(PermissionActivity.this,"可以在這里設置重新跳出權限請求提示框");
} //有必須權限選擇了禁止不提醒
else if (permissionManager.getShouldShowRequestPermissionsCode() == PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED_NOT_REMIND) {
ToastUtils.showToast(PermissionActivity.this,"可以在這里彈出提示框提示去應用設置頁開啟權限");
permissionManager.startAppSettings();
}
}
}
注意:如果有需求先判斷是否所有權限都已經(jīng)允許之后再進入主頁面可以通過permissionManager.isLackPermission()進行判斷狐胎,如果返回true則進行權限請求鸭栖,如果返回false則進入主頁面。
- 多個權限請求如果其中某一個被禁止提醒握巢,會先把沒有禁止提醒的權限處理完之后再進行處理晕鹊。
- 如果是必要權限被禁止而沒有選擇禁止提醒退出之后下次會重新請求權限。
- 如果必要權限被禁止和選擇了禁止提醒重新進入頁面在onRequestPermissionsResult會重新回調(diào)方法暴浦。
- 使用者可以根據(jù)onRequestPermissionsResult()方法中返回來的標志PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED和PermissionManager.EXIST_NECESSARY_PERMISSIONS_PROHIBTED_NOT_REMIND做出對應的顯示和操作(例如彈框提示跳轉(zhuǎn)到設置頁面或者toat提示)溅话。
4.提供幾種比較常用的Dialog彈框
(1)提供的常用的CommonDialog
屬性 | 作用 |
---|---|
DIALOG_TEXT_TWO_BUTTON_DEFAULT | 默認彈出按鈕提示 |
DIALOG_TEXT_TWO_BUTTON_CUSTOMIZE | 自定義彈出按鈕提示 |
DIALOG_LOADING_PROGRASSBAR | 默認加載彈框 |
DIALOG_CHOICE_ITEM | 沒有數(shù)據(jù)顯示狀態(tài)碼 |
根據(jù)不同的構造函數(shù)設置不同的參數(shù)
(2)自定義Dialog樣式
- BaseDialogFragment
屬性 | 作用 |
---|---|
setContentView | 設置彈框布局樣式 |
onViewCreated | 初始化完成后的回調(diào),可在此做一些初始化 |
show(...) | 顯示彈框 |
dismiss | 彈框銷毀 |
setAllCancelable | 點擊返回鍵和外部不可取消 |
setOnlyBackPressDialogCancel | 點擊返回鍵可以取消 |
setDialogInterval | 設置彈框和屏幕兩邊的間距 |
setDialogHeight | 設置彈框高度 |
setOnDismissListener | 彈框銷毀回調(diào) |
- 繼承BaseDialogFragment歌焦,通過setContentView(R.layout.dialog_list)設置彈窗布局飞几。
- 在提供的onViewCreated方法中進行相應的邏輯設置
5.自定義PopupWindow彈框
- BasePopupWindow
屬性 | 作用 |
---|---|
BasePopupWindow(Context context) | 調(diào)用該構造函數(shù)默認彈出框鋪滿全屏 |
BasePopupWindow(Context context, int w, int h) | 自定義彈出框高寬 |
showPopup | 在屏幕中央顯示彈框 |
showPopupAsDropDown | 在指定控件底部顯示彈框 |
showPopup | 在屏幕中央顯示彈框 |
showPopupAsDropDown | 在指定控件底部顯示彈框 |
setShowMaskView | 設置是否顯示遮層 |
dismiss | 銷毀彈出框 |
getPopupLayoutRes | 自定義彈出框的布局文件 |
getPopupAnimationStyleRes | 自定義彈出框的動畫文件,不設置動畫返回0 |
- 繼承BasePopupWindow独撇。
- 通過getPopupLayoutRes(R.layout.xxx)設置彈窗布局屑墨。
- 通過getPopupAnimationStyleRes(R.style.xxx)設置彈窗動畫躁锁,不需要動畫可以設置為0。
- 如果需要顯示遮層卵史,在構造函數(shù)通過setShowMaskView(true)設置战转。
七、CustomView的使用
1.CommonTabLayout的使用
屬性 | 作用 |
---|---|
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 | 下滑線內(nèi)邊距程腹,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) | 下滑線的樣式 |
具體可參照例子使用见转。
2.OutSideFrameTabLayout的使用
屬性 | 作用 |
---|---|
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 | 內(nèi)邊距 |
tab_bar_color | bar的背景顏色 |
tab_bar_stroke_color | 外框的顏色 |
tab_bar_stroke_width | 外框的大小 |
tab_width | bar的長度 |
具體可參照例子使用。
3.AutoLineLayout的使用
- 在外層布局使用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>
4.TagView的使用
TagViewConfigBuilder
屬性 | 作用 |
---|---|
setTitles | 設置TagItem內(nèi)容 |
setTextSize | 設置TagItem字體大小 |
setTextColor | 設置TagItem字體顏色 |
setTextSelectColor | 設置TagItem選擇字體顏色 |
setPaddingLeftAndRight | 設置TagIttem左右內(nèi)邊距 |
setPaddingTopAndBottom | 設置TagIttem上下內(nèi)邊距 |
setMarginAndTopBottom | 設置TagItem上下外邊距 |
setMarginLeftAndRight | 設置TagItem左右外邊距 |
setackgroudRes | 設置background Drawable |
setTagViewAlign | 設置整體TagItem的Align(LEFT,RIGHT,CENTER) |
1.布局
<com.youngmanster.collection_kotlin.base.customview.tagview.TagView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tagView" />
2.代碼設置
String[] list={"werwrw","4545465","金浩","風和日麗",
"一只蜜蜂叮在掛歷上","陽光","燦爛","1+1","瀏覽器","玲瓏骰子安紅豆蒜哀,入骨相思知不知"};
TagViewConfigBuilder builder=new TagViewConfigBuilder()
.setTitles(list);
tagView.create(builder, new TagView.TagViewPressListener() {
@Override
public void onPress(View view, String title, int position) {
ToastUtils.showToast(TagViewActivity.this,title);
}
});
八斩箫、工具類的使用
1.Density(適配不同手機像素)
- 在Applicaton的onCreate中設置 Density.setDensity(this, 375f)
- 375f代表設計稿的寬度,以dp為單位撵儿,后面需要以f(浮點型)
2.DisplayUtils
屬性 | 作用 |
---|---|
px2dip | px值轉(zhuǎn)換為dip或dp值乘客,保證尺寸大小不變(有精度損失) |
px2dipByFloat | px值轉(zhuǎn)換為dip或dp值,保證尺寸大小不變(無精度損失 |
dip2px | dip或dp值轉(zhuǎn)換為px值淀歇,保證尺寸大小不變(有精度損失)易核,類似Context.getDimensionPixelSize方法(四舍五入 |
dip2pxByFloat | dip或dp值轉(zhuǎn)換為px值,保證尺寸大小不變(無精度損失)浪默,類似Context.getDimension方法 |
px2sp | px值轉(zhuǎn)換為sp值牡直,保證文字大小不變 |
sp2px | sp值轉(zhuǎn)換為px值,保證文字大小不變 |
getScreenWidthPixels | 屏幕寬度 |
getScreenHeightPixels | 屏幕高度 |
getDisplayInfo | 獲取設備信息 |
setStatusBarBlackFontBgColor | 設置黑色字體狀態(tài)的背景顏色 |
setStatusBarColor | 設置狀態(tài)欄背景顏色 |
setStatusBarFullTranslucent | 設置狀態(tài)欄透明 |
getStatusBarHeight | 獲取狀態(tài)欄高度 |
getActionBarHeight | 獲取ActionBar高度 |
3.ColorUtils
屬性 | 作用 |
---|---|
createColorStateList | 獲取ColorStateList |
4.FileUtils
屬性 | 作用 |
---|---|
WriterTxtFile | 寫文件纳决,其中append可設置是否添加在原內(nèi)容的后邊 |
ReadTxtFile | 讀取文本文件中的內(nèi)容碰逸,strFilePath代表文件詳細路徑 |
isCacheDataFailure | 判斷緩存是否失效 |
checkFileExists | 檢查文件是否存在 |
checkSaveLocationExists | 檢查是否安裝SD卡 |
deleteDirectory | 刪除目錄(包括:目錄里的所有文件) |
deleteFile | 刪除文件 |
getFileOrFilesSize | 獲取文件指定文件的指定單位的大小,其中sizeType 獲取大小的類型1為B阔加、2為KB饵史、3為MB、4為GB |
getFileSize | 獲取指定文件大小 |
5.GetPermissionsUtils
屬性 | 作用 |
---|---|
getAllPermissons | 獲取應用用到的所有權限 |
6.GlideUtils
屬性 | 作用 |
---|---|
loadImg | 加載圖片 |
loadImgBlur | Glide實現(xiàn)高斯模糊 |
loadImgBlur | Glide實現(xiàn)高斯模糊胜榔,可設置模糊的程度 |