Collection aggregates some of the basic modules of the project, saving developer time.
Collection聚合了项目搭建的一些基本模块,节约开发者时间,协助项目的快速搭建,RecyclerView+Adapter+Retrofit+RxJava+MVP+DataManager+基本Base,能够满足一个项目的基本实现。
推荐文章
适配Android x库的Collection-kotlin:https://juejin.im/post/5e59d0eef265da57315b0b0e
Collection-iOS库:https://juejin.im/post/5e423d4ef265da572a0cec9f
简书地址:https://www.jianshu.com/p/0a8c27bc8457
掘金地址:https://juejin.im/post/5ab9987451882555635e5401
1.上传下载增加进度条 2.Fragment增加布局和数据 初始化懒加载 3.网络请求优化(解决内存泄露问题) 4.增加文件断点下载 5.增加MVP注解生成文件(https://github.com/usernameyangyan/MvpAnnotationProject) 6.增加网络请求通过同步上传文件
1.DialogFragment替换AlertDialog 2.SharePreference统一初始化 3.简化Fragment的跳转逻辑 4.DataManager.DataForHttp增加文件下载
1.修复SQLite没有创建表查询异常 2.SQLite增加按条件查询List 3.增加PopupWindow显示位置设置 4.解决SQLit内容为null报错 5.状态栏修改:增加设置状态栏透明+黑色字体
1.去掉Relam数据模块,安装包大小减少 2.对原生SQLite数据库进行封装,使用更加方便 3.对DataManager的使用进行修整 4.增加AutoLineLayout/TagView 5.增加LinkedMultiValueMap 6.增加RxJavaUtils,可进行子/主线程数据处理切换
1.更新Realm数据库依赖。 2.更新RxJava、rxandroid、retrofit、converter-gson、adapter-rxjava2依赖。 3.封装好Fragment之间的交互,项目中可以选择使用一个Activity来作为跟容器,其它实现页面统一使用fragment来实现。 4.collectionLibary中的Config配置类增加json字段过滤、网络请求超时设置、网络请求头设置(全局请求头)。 5.增加自动换行布局。 6.Realm增加按数据字段查询和删除接口。 7.网络请求类型HttpType增加json类型请求参数。 8.网络请求增加个别接口请求头设置。 9.增加适配不同手机像素。
1.增加自定义控件TabLayout。
1.RxJava的依赖更新。 2.修正RecyclerView头部布局不能铺满问题。 3.PopupWindow的使用。 4.DisplayUtils工具类对状态栏的修改。
1.修正Retrofit DEFAULT_POST请求方式指向错误。 2.Retrofit 数据解析兼容没有公用been类,可以指定公用been类和不指定公用been类、或者混合使用。 3.Realm增加数据迁移(数据库字段增加或移除)。 4.增加几种通用的Dialog弹窗,提供方法自定义。 5.提供几种比较常用的Utils工具类
1.增加DataManager用来统一管理数据请求,包括Retrofit的请求、SharePreference以及Realm的数据请求。 2.Retrofit的请求的整合。 3.PullToRefreshRecyclerView的空布局bug修改。
implementation 'com.youngman:collectionlibrary:1.3.9'
Error:Could not find com.android.support:appcompat-v7:27.x.x. 因为library的Support Repository是27.x.x,可能跟项目有所冲突,如果sdk已经装了27还是会出现同样的错误。 解决办法:在项目根build.gradle中加入 maven { url "https://maven.google.com" }
| 属性 | 作用 | | :-----| :---- | |addHeaderView | 增加头部布局, 暂时只能添加一个头布局| |setEmptyView | 设置自定义的加载布局和空布局| |setRefreshView | 自定义刷新View| |setDefaultLoadingMoreNoDataMessage | 设置默认没有数据的内容| |setLoadMoreView | 自定义加载更多View| |setNoMoreDate | 显示没有更多数据| |setAutoRefresh | 自动刷新| |refreshComplete | 刷新数据完成| |loadMoreComplete | 加载更多数据完成| |setPullRefreshEnabled | 是否允许刷新| |setLoadMoreEnabled | 是否允许加载更多| |setRefreshTimeVisible |显示加载更新时间| |isLoading | 是否正在loading数据| |isRefreshing | 正在refreshing数据| |setRefreshAndLoadMoreListener |刷新和加载更多回调| |destroy |内存回收|
recycler_rv.setPullRefreshEnabled(true); recycler_rv.setLoadMoreEnabled(true);
##### 刷新几种状态: | 属性 | 作用 | | :-----| :---- | | STATEPULLDOWN | 拉的状态(还没到下拉到固定的高度时)| | STATERELEASEREFRESH | 下拉到固定高度提示释放刷新的状态| | STATEREFRESHING | 正在刷新状态| | STATEDONE | 刷新完成|
##### 加载更多几种状态:
| 属性 | 作用 | | :-----| :---- | | STATELOADING | 正在加载| | STATECOMPLETE |加 载完成| | STATE_NODATA | 没有数据|
recycler_rv.setPullRefreshEnabled(true); recycler_rv.setLoadMoreEnabled(true); recycler_rv.setRefreshAndLoadMoreListener(this); recycler_rv.setRefreshView(new DefinitionAnimationRefreshHeaderView(getActivity())); recycler_rv.setLoadMoreView(new DefinitionAnimationLoadMoreView(getActivity()));
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的一些动画等释放,防止内存泄漏。
1.在构造函数中设置 onStateChangeListener=this 2.onStateChange的模板样式
@Override public void onStateChange(int state) { //下拉时状态相同不做继续保持原有的状态 if (state == mState) return ; //根据状态进行动画显示 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; }
1.在initView()做自定义布局、相关动画的初始化,最后在initView()方法的最后面添加以下代码即可
mContainer = LayoutInflater.from(context) .inflate(R.layout.layout_definition_animation_loading_more, null) addView(mContainer) gravity = Gravity.CENTER
2.destroy()是用来关掉改页面时把刷新View的一些动画等释放,防止内存泄漏。 3.在setState()进行状态切换后的相关操作逻辑,模板样式
@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.注意:在自定义加载更多样式时,如果需要有没有更多加载更多数据提示同样需要在布局中写好,然后在onSatae中根据状态对加载和没有跟多显示提示进行显示隐藏操作。
<com.youngmanster.collection_kotlin.recyclerview.pulltorefreshrecyclerview android:id="@+id/recycler_rv" android:layout_width="match_parent" android:layout_height="match_parent"></com.youngmanster.collection_kotlin.recyclerview.pulltorefreshrecyclerview>
</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刷新适配器。
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(); } });
mRecyclerView.setNoMoreDate(true)
mRecyclerView.setAutoRefresh()
LoadingTextConfig textConfig=LoadingTextConfig.getInstance(getApplicationContext()); textConfig .setCollectionLoadingMore("加载更多") .setCollectionLastRefreshTimeTip("更新时间:") .setCollectionNoMoreData("没有更多数据") .setCollectionPullReleaseText("释放刷新") .setCollectionRefreshing("正在刷新") .setCollectionPullDownRefreshText("下拉刷新") .setCollectionRefreshDone("加载完成"); PullToRefreshRecyclerViewUtils.loadingTextConfig=textConfig;
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.注意问题
@Override public void onDestroy() { super.onDestroy(); mRecyclerView.destroy() }
在BaseRecyclerViewAdapter中的BaseViewHolder进行布局转化,同时定义了一些比较基本的View操作,使用简单。
public class DefinitionRecyclerAdapter extends BaseRecyclerViewAdapter {public DefinitionRecyclerAdapter(Context mContext, List 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); } }
public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List mDatas, PullToRefreshRecyclerView pullToRefreshRecyclerView) { this.mContext = mContext; this.mLayoutResId = mLayoutResId; this.mDatas = mDatas; this.mRecyclerView=pullToRefreshRecyclerView; }public BaseRecyclerViewAdapter(Context mContext, int mLayoutResId, List mDatas) { this.mContext = mContext; this.mLayoutResId = mLayoutResId; this.mDatas = mDatas; }
itemClickAdapter.setOnItemLongClickListener(new BaseRecyclerViewAdapter.onItemLongClickListener() { @Override public boolean onItemLongClick(View view, int position) { showToast("进行长按操作"); return true; } });
public class MultipleAdapter extends BaseRecyclerViewMultiItemAdapter {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; } }
ItemTouchHelper.Callback callback=new BaseRecycleItemTouchHelper(dragAndDeleteAdapter); ItemTouchHelper itemTouchHelper=new ItemTouchHelper(callback); itemTouchHelper.attachToRecyclerView(mRecyclerView);
@Override public void onMoveComplete() { ToastUtils.showToast(this, "移动操作完成"); }@Override public void onDeleteComplete() { ToastUtils.showToast(this, "删除操作完成"); }
| 属性 | 作用 | | :-----| :---- | |DEBUG | 是否为BuildConfig.DEBUG,日志输出需要| |CONTEXT | 设置Context,必填项| |URLDOMAIN | 网络请求的域名,需要以“/”结尾| |URLCACHE | 网络缓存地址,需要设置缓存才可以成功| |MAXCACHESECONDS | 设置OkHttp的缓存机制的最大缓存时间,默认为一天| |MAXMEMORYSIZE | 缓存最大的内存,默认为10M| |MClASS | 设置网络请求json通用解析类| |EXPOSEPARAM | Json数据某些字段在没有数据是会不返回来,可通过这个属性设置过滤| |USERCONFIG | SharePreference保存的名称| |CONNECTTIMEOUTSECONDS | 请求接口超时设定| |READTIMEOUTSECONDS | 请求接口超时设定| |HEADERS | 设置Http全局请求头| |SQLITEDBNAME | 数据库名称| |SQLITEDB_VERSION | 数据库版本名|
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; }
public class Result 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; }
}
(1)RequestBuilder的设置(网络请求的配置)
| 属性 | 作用 | | :-----| :---- | | ReqType |数据处理的方式,默认DEFAULTCACHELIST,使用到OkHttp缓存的需要需要设置Config.URLCACHE | | NOCACHEMODEL | 不设置缓存,返回model| | NOCACHELIST | 不设置缓存,返回list| | DEFAULTCACHEMODEL | 使用Okttp默认缓存,返回model| | DEFAULTCACHELIST | 使用Okttp默认缓存,返回list| | DISKCACHELISTLIMITTIME | 限时使用自定义磁盘缓存,返回List| | DISKCACHEMODELLIMITTIME | 限时使用自定义磁盘缓存,返回model| | DISKCACHENONETWORKLIST | 自定义磁盘缓存,没有网络返回磁盘缓存,返回List| | DISKCACHENONETWORKMODEL | /自定义磁盘缓存,没有网络返回磁盘缓存,返回Model| |DOWNLOADFILEMODEL|文件下载模式,返回Model| | HttpType |网络请求方式,默认DEFAULTGET | | DEFAULTGET |GET请求| | DEFAULTPOST |POST请求 | | FIELDMAPPOST |如果请求URL出现中文乱码,可选择这个 | | JSONPARAMPOST |json格式请求参数 | | ONEMULTIPARTPOST |上传一张图片 | | MULTIPLEMULTIPARTPOST |上传多张图片 | |DOWNLOADFILEGET|下载文件| | ReqMode |请求模式,默认ASYNCHRONOUS| | ASYNCHRONOUS |异步请求| | SYNCHRONIZATION |同步请求| | 其它参数 | | | setTransformClass |设置请求转化Class | | setUrl |设置请求url,如果不设置完全连接则会使用Config.URLDOMIN进行拼接 | | setFilePathAndFileName |设置自定义缓存时的路径和文件名 | | setLimtHours |设置自定义缓存的有效时间 | | setHeader |设置请求头 | | setHeaders |设置请求头集合 | | setHttpTypeAndReqType |设置请求数据类型和请求方式 | | setImagePath |设置上传图片路径 | | setImagePaths |设置多张图片路径 | | isUserCommonClass |设置是否使用公用类转化 | | setReqMode |设置同步异步 | | isOpenBreakpointDownloadOrUpload |是否开启断点下载 |
(2)使用模块
RequestBuilder>> resultRequestBuilder = new RequestBuilder<>(new RxObservableListener>>() { @Override public void onNext(Result> 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));
Observable observable = RetrofitManager.getNoCacheApiService(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);
public interface ApiService { /** * 微信精选 * @param url * @param map * @return */ @GET Observable>> getWeChatFeaturedNews(@Url String url, @QueryMap Map map); }
void onNext(T result); void onComplete(); void onError(NetWorkCodeException.ResponseThrowable e);
1.写一个Contract类对Presenter和View进行统一管理(View需要实现BaseView,Presenter需要实现BasePresenter
public interface WeChatFeaturedContract {interface View extends BaseView { void refreshUI(List newsList); }
abstract class Presenter extends BasePresenter { public abstract void requestFeaturedNews(int page, int num); }
}
2.写一个具体的Presenter类实现WeChatChinaNewsContract.Presenter,在里面做具体的逻辑处理,处理完成再通过mView进行View的处理
3.Activity/Fragment实现IBaseActivity/IBaseFragment以及定义好的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.插入一条数据
user=new User(); user.setId(0); user.setName("Young1"); user.setAge(14); user.setAddress("山东省"); user.setStr("eeeee"); DataManager.DataForSqlite.insert(user);
showToast("保存成功");
2.查询数据
user=DataManager.DataForSqlite.queryByFirst(User.class); String showContent="用户Id:"+user.getId()+"\n"+"用户姓名:"+user.getName()+"\n"+"用户年龄:"+user.getAge()+"\n"+"用户地址:"+user.getAddress(); showToast(showContent);
3.批量插入数据(可同步可异步)
List 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.数据表格变化(只支持增加字段)
在Application中对版本号进行监听,并对数据表进行更新
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>> resultRequestBuilder = new RequestBuilder<>(new RxObservableListener>>(mView) { @Override public void onNext(Result> 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.插入基本数据
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 | 隐藏返回按钮| | setBarBackground| 设置Bar的背景颜色| | setBarHeight | 设置Bar的高度| | setTitleColor | 设置标题颜色| | setTitle | 设置标题| | setBackClick | 设置返回按钮监听|
代码使用
defineActionBarConfig .setTitleSize(20f) .setBarHeight(DisplayUtils.dip2px(this,60f)) .setBarBackground(this,R.color.driverfont) .setTitle(getString(R.string.tabIndicator_title))
| 属性 | 作用 | | :-----| :---- | | fragmentLayoutId |设置显示Fragment的根布局id,在Activity中设置| | startFragmentForResult(...) |和回调结果跳转| | onFragmentResult(....) |Fragment的结果回调| | setResult(...) |onFragmentResult回调的结果设置 | | startFragment(...) |普通跳转,具体使用查看IBaseActivity| |isRootFragment()|判断是否是根Fragment|
| 属性 | 作用 | | :-----| :---- | | STATENODATA | 不显示加载框状态码 | | STATELOADING | 加载数据显示状态码| | STATEEMPTY | 没有数据显示状态码| | STATE_DISCONNECT | 没有网络状态码| | setOnDisConnectViewListener |点击没有网络图标回调| | setOnEmptyViewListener | 点击没有没有数据图标回调| | showViewByState | 设置显示状态| | getmEmptyView |获取无数据状态View| |布局可设置参数 || |loadingViewAnimation |设置加载的drawable动画| |loadingText |加载时的文本| |emptyImage |空布局显示的图片| |emptyText |空布局文本| |emptyViewRes |设置自定义空布局| |disConnectImage |设置断网显示的图片| |disConnectText |设置断网显示的文本| |tipTextSize |文本字体大小| |tipTextColor |文本字体颜色|
</com.youngmanster.collection_kotlin.base.stateview.stateview>
stateView.showViewByState(StateView.STATE_LOADING); stateView.showViewByState(StateView.STATE_EMPTY); stateView.showViewByState(StateView.STATE_NO_DATA); stateView.showViewByState(StateView.STATE_DISCONNECT);
// 项目的必须权限,没有这些权限会影响项目的正常运行 private static final String[] PERMISSIONS = new String[]{ Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_WAP_PUSH, Manifest.permission.READ_CONTACTS };
permissionManager=PermissionManager.with(this). setNecessaryPermissions(PERMISSIONS);permissionManager.requestPermissions();
//重写 @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(); } } }
| 属性 | 作用 | | :-----| :---- | | DIALOGTEXTTWOBUTTONDEFAULT | 默认弹出按钮提示 | | DIALOGTEXTTWOBUTTONCUSTOMIZE | 自定义弹出按钮提示 | | DIALOGLOADINGPROGRASSBAR | 默认加载弹框| | DIALOGCHOICEITEM | 没有数据显示状态码|
根据不同的构造函数设置不同的参数
| 属性 | 作用 | | :-----| :---- | | setContentView | 设置弹框布局样式 | | onViewCreated | 初始化完成后的回调,可在此做一些初始化 | | show(...) | 显示弹框 | | dismiss | 弹框销毁| | setAllCancelable| 点击返回键和外部不可取消| | setOnlyBackPressDialogCancel | 点击返回键可以取消| | setDialogInterval| 设置弹框和屏幕两边的间距| | setDialogHeight | 设置弹框高度| | setOnDismissListener | 弹框销毁回调|
| 属性 | 作用 | | :-----| :---- | | BasePopupWindow(Context context) |调用该构造函数默认弹出框铺满全屏 | | BasePopupWindow(Context context, int w, int h) | 自定义弹出框高宽 | | showPopup |在屏幕中央显示弹框| | showPopupAsDropDown | 在指定控件底部显示弹框| | showPopup |在屏幕中央显示弹框| | showPopupAsDropDown | 在指定控件底部显示弹框| | setShowMaskView | 设置是否显示遮层| | dismiss|销毁弹出框| | getPopupLayoutRes | 自定义弹出框的布局文件| | getPopupAnimationStyleRes | 自定义弹出框的动画文件,不设置动画返回0|
| 属性 | 作用 | | :-----| :---- | | tabtabIndicatorWidth |设置下滑线的长度| | tabtabIndicatorHeight | 设置下滑线的高度 | | tabtabIndicatorColor |下滑线颜色| | tabindicatormarginLeft | 设置下滑线外边距| | tabindicatormarginRight |设置下滑线外边距| | tabindicatormarginTop | 设置下滑线外边距| | tabindicatormarginBottom | 设置下滑线外边距| | tabtabTextColor|没选中字体颜色| | tabtabTextSize | 字体大小| | tabtabSelectedTextColor | 选中字体颜色| | tabpadding | 下滑线内边距,block样式时可以通过该属性设置距离| | tabtabBackground |Tab 的背景颜色| | tabindicatorcorner|下滑线的圆角大小| | tabindicatorgravity(bottom、top | 设置下滑线显示的位置,只针对line和triangle| | tabtabMode(scrollable、fixed) | Tab的显示模式| | tabindicator_style(line、triangle、block) | 下滑线的样式|
| 属性 | 作用 | | :-----| :---- | | tabtabIndicatorColor |设置Tab颜色| | tabindicatorcorner | 圆角大小 | | tabindicatormarginLeft |下滑线外边距| | tabindicatormarginRight | 下滑线外边距| | tabindicatormarginTop |下滑线外边距| | tabindicatormarginBottom | 下滑线外边距| | tabtabTextColor | 没选中字体颜色| | tabtabSelectedTextColor|选中字体颜色| | tabtabTextSize | 字体大小| | tabtabSelectedTextColor | 选中字体颜色| | tabpadding | 内边距| | tabbarcolor |bar的背景颜色| | tabbarstrokecolor|外框的颜色| | tabbarstrokewidth | 外框的大小| | tab_width |bar的长度|
在外层布局使用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) |
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); } });
| 属性 | 作用 | | :-----| :---- | | 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实现高斯模糊,可设置模糊的程度|