fragmentList) {
24 | super(fm);
25 | this.mTitleList=titleList;
26 | this.mFragmentList = fragmentList;
27 | }
28 |
29 | @Override
30 | public Fragment getItem(int position) {
31 | // TODO Auto-generated method stub
32 | return mFragmentList == null ? null : mFragmentList.get(position);
33 | }
34 |
35 | @Override
36 | public int getCount() {
37 | // TODO Auto-generated method stub
38 | return mFragmentList == null ? 0 : mFragmentList.size();
39 | }
40 |
41 | @Override
42 | public CharSequence getPageTitle(int position) {
43 | if(CollectionUtil.isNotEmpty(mTitleList)){
44 | int titleCount=mTitleList.size();
45 | int fragmentCount=getCount();
46 | if(titleCount==fragmentCount){
47 | return mTitleList.get(position);
48 | }
49 | }
50 | return null;
51 | }
52 |
53 | @Override
54 | public void destroyItem(View container, int position, Object object) {
55 | // super.destroyItem(container, position, object);
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/app/ComContext.java:
--------------------------------------------------------------------------------
1 | //package com.android.commonlibrary.app;
2 | //
3 | //import android.app.Application;
4 | //
5 | ///**
6 | // * Title:自定义的Application模板
7 | // * Description:
8 | // *
9 | // * Created by pei
10 | // * Date: 2017/12/30
11 | // */
12 | //public class ComContext extends Application {
13 | //
14 | // private static ComContext instance;
15 | //
16 | // public static synchronized ComContext getInstance() {
17 | // return instance;
18 | // }
19 | //
20 | // @Override
21 | // public void onCreate() {
22 | // super.onCreate();
23 | // instance = this;
24 | //
25 | // }
26 | //}
27 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/broadcast/NetworkReceiver.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.broadcast;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.BroadcastReceiver;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.content.IntentFilter;
8 | import android.net.ConnectivityManager;
9 | import android.net.NetworkInfo;
10 |
11 |
12 | /**
13 | * 网络实时监测广播
14 | *
15 | * @author pei
16 | * @version1.0
17 | * @create 2016-04-01
18 | * @description
19 | * 权限
20 | * 初始化并注册广播
21 | * NetworkReceiver networkReceiver=new NetworkReceiver(Mainactivity.this);
22 | * 设置网络状态监听
23 | * networkReceiver.setOnNetworkListener(new NetworkReceiver.OnNetworkListener());
24 | * 销毁
25 | * networkReceiver.onDestroy();
26 | */
27 | public class NetworkReceiver extends BroadcastReceiver{
28 |
29 | private Context mContext;
30 | private OnNetworkListener mOnNetworkListener;
31 |
32 | public NetworkReceiver(Context context){
33 | this.mContext=context;
34 | //注册广播
35 | registerReceiver();
36 | }
37 |
38 | /**设置网络监听**/
39 | public void setOnNetworkListener(OnNetworkListener listener){
40 | this.mOnNetworkListener=listener;
41 | }
42 |
43 | /**注册广播**/
44 | private void registerReceiver() {
45 | IntentFilter intentfilter = new IntentFilter();
46 | intentfilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
47 | mContext.registerReceiver(NetworkReceiver.this, intentfilter);
48 | }
49 |
50 | @Override
51 | public void onReceive(Context arg0, Intent arg1) {
52 | ConnectivityManager connectionManager = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
53 | @SuppressLint("MissingPermission")
54 | NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
55 | if (networkInfo != null && networkInfo.isAvailable()) {
56 | //有网络
57 | if(mOnNetworkListener!=null){
58 | mOnNetworkListener.available(networkInfo);
59 | }
60 | } else {
61 | //无网络
62 | if(mOnNetworkListener!=null){
63 | mOnNetworkListener.unavailable(networkInfo);
64 | }
65 | }
66 | }
67 |
68 | /**销毁网络广播监听**/
69 | public void onDestroy(){
70 | mContext.unregisterReceiver(NetworkReceiver.this);
71 | }
72 |
73 | public interface OnNetworkListener{
74 |
75 | void available(NetworkInfo networkInfo);
76 |
77 | void unavailable(NetworkInfo networkInfo);
78 |
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/cacher/normal_cache/CacheConfig.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.cacher.normal_cache;
2 |
3 | /**
4 | * Title:缓存相关配置
5 | * Description:
6 | *
7 | * Created by pei
8 | * Date: 2017/10/24
9 | */
10 | public class CacheConfig {
11 | /**内存缓存大小,默认为当前应用可用最大内存的八分之一**/
12 | public static final int MEMORY_CACHE_SIZE=(int)Runtime.getRuntime().maxMemory() / 1024 / 8;
13 | /**硬盘缓存大小,默认10M**/
14 | public static final long DISK_CACHE_SIZE=10*1024*1024;
15 | }
16 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/cacher/normal_cache/CacheListener.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.cacher.normal_cache;
2 |
3 | import java.util.List;
4 | import java.util.Map;
5 |
6 | /**
7 | * Title:
8 | * Description:
9 | *
10 | * Created by pei
11 | * Date: 2017/10/23
12 | */
13 | public interface CacheListener{
14 |
15 | void putString(String key, String value);
16 |
17 | String getString(String key);
18 |
19 | void putInt(String key, int value);
20 |
21 | int getInt(String key);
22 |
23 | void putFloat(String key, float value);
24 |
25 | float getFloat(String key);
26 |
27 | void putDouble(String key, double value);
28 |
29 | double getDouble(String key);
30 |
31 | void putLong(String key, Long value);
32 |
33 | long getLong(String key);
34 |
35 | void putBoolean(String key, boolean value);
36 |
37 | boolean getBoolean(String key);
38 |
39 | void putObject(String key, Object value);
40 |
41 | Object getObject(String key, Class cls);
42 |
43 | void putList(String key, List list);
44 |
45 | List getList(String key, Class cls);
46 |
47 | void putMap(String key, Map map);
48 |
49 | Map getMap(String key);
50 |
51 | void remove(String key);
52 |
53 | void clear();
54 | }
55 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/cacher/normal_cache/MemoryLruCache.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.cacher.normal_cache;
2 |
3 |
4 | import androidx.collection.LruCache;
5 |
6 | /**
7 | * Title:内存缓存
8 | * Description:近期最少使用算法
9 | *
10 | * Created by pei
11 | * Date: 2017/10/23
12 | */
13 | public class MemoryLruCache extends LruCache {
14 |
15 | // 构造方法传入当前应用可用最大内存的八分之一
16 | public MemoryLruCache() {
17 | super(CacheConfig.MEMORY_CACHE_SIZE);
18 | }
19 |
20 | @Override
21 | protected int sizeOf(K key, V value) {
22 | return super.sizeOf(key, value);
23 | }
24 |
25 | //当缓存被移除时调用,第一个参数是表明缓存移除的原因,true表示被LruCache移除,false表示被主动remove移除,可不重写
26 | @Override
27 | protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {
28 | super.entryRemoved(evicted, key, oldValue, newValue);
29 | }
30 |
31 | // 当get方法获取不到缓存的时候调用,如果需要创建自定义默认缓存,可以在这里添加逻辑,可不重写
32 | @Override
33 | protected V create(K key) {
34 | return super.create(key);
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/AppInfo.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.entity;
2 |
3 | import android.graphics.drawable.Drawable;
4 |
5 | /**
6 | * Title:应用信息相关model
7 | *
8 | * description:
9 | * autor:pei
10 | * created on 2021/3/9
11 | */
12 | public class AppInfo extends BaseEntity{
13 |
14 | //应用图标
15 | private Drawable icon;
16 |
17 | //应用的名字
18 | private String appName;
19 |
20 | //应用版本名称,如: 1.0.0
21 | private String versionName;
22 |
23 | //应用包名,如: "com.test.app"
24 | private String packageName;
25 |
26 | //应用程序的大小
27 | private String apkSize;
28 |
29 | //表示用户程序
30 | private boolean isUserApp;
31 |
32 | //存储的位置.
33 | private boolean isSD;
34 |
35 | public Drawable getIcon() {
36 | return icon;
37 | }
38 |
39 | public void setIcon(Drawable icon) {
40 | this.icon = icon;
41 | }
42 |
43 | public String getAppName() {
44 | return appName;
45 | }
46 |
47 | public void setAppName(String appName) {
48 | this.appName = appName;
49 | }
50 |
51 | public String getVersionName() {
52 | return versionName;
53 | }
54 |
55 | public void setVersionName(String versionName) {
56 | this.versionName = versionName;
57 | }
58 |
59 | public String getPackageName() {
60 | return packageName;
61 | }
62 |
63 | public void setPackageName(String packageName) {
64 | this.packageName = packageName;
65 | }
66 |
67 | public String getApkSize() {
68 | return apkSize;
69 | }
70 |
71 | public void setApkSize(String apkSize) {
72 | this.apkSize = apkSize;
73 | }
74 |
75 | public boolean isUserApp() {
76 | return isUserApp;
77 | }
78 |
79 | public void setUserApp(boolean userApp) {
80 | isUserApp = userApp;
81 | }
82 |
83 | public boolean isSD() {
84 | return isSD;
85 | }
86 |
87 | public void setSD(boolean SD) {
88 | isSD = SD;
89 | }
90 |
91 | @Override
92 | public String toString() {
93 | return "AppInfo{" +
94 | "icon=" + icon +
95 | ", appName='" + appName + '\'' +
96 | ", versionName='" + versionName + '\'' +
97 | ", packageName='" + packageName + '\'' +
98 | ", apkSize='" + apkSize + '\'' +
99 | ", isUserApp=" + isUserApp +
100 | ", isSD=" + isSD +
101 | '}';
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/ResponseData.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.entity;
2 |
3 | import android.annotation.SuppressLint;
4 |
5 | /**
6 | * Description:网络通讯返回数据最外层数据结构体(备用)
7 | *
8 | * Author:pei
9 | * Date: 2019/3/21
10 | */
11 | @SuppressLint("ParcelCreator")
12 | public class ResponseData extends BaseEntity {
13 |
14 | private int code;
15 | private String message;
16 | private T data;
17 |
18 | public int getCode() {
19 | return code;
20 | }
21 |
22 | public void setCode(int code) {
23 | this.code = code;
24 | }
25 |
26 | public String getMessage() {
27 | return message;
28 | }
29 |
30 | public void setMessage(String message) {
31 | this.message = message;
32 | }
33 |
34 | public T getData() {
35 | return data;
36 | }
37 |
38 | public void setData(T data) {
39 | this.data = data;
40 | }
41 |
42 | @Override
43 | public String toString() {
44 | return "ResponseData{" +
45 | "code=" + code +
46 | ", message='" + message + '\'' +
47 | ", data=" + data +
48 | '}';
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/RestTimeEntity.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.entity;
2 |
3 | /**
4 | * Title: 时间bean
5 | * description:
6 | * autor:pei
7 | * created on 2022/8/17
8 | */
9 | public class RestTimeEntity extends BaseEntity{
10 |
11 | private long day = 0;
12 | private long hour = 0;
13 | private long minutes = 0;
14 | private long second = 0;
15 |
16 | public long getDay() {
17 | return day;
18 | }
19 |
20 | public void setDay(long day) {
21 | this.day = day;
22 | }
23 |
24 | public long getHour() {
25 | return hour;
26 | }
27 |
28 | public void setHour(long hour) {
29 | this.hour = hour;
30 | }
31 |
32 | public long getMinutes() {
33 | return minutes;
34 | }
35 |
36 | public void setMinutes(long minutes) {
37 | this.minutes = minutes;
38 | }
39 |
40 | public long getSecond() {
41 | return second;
42 | }
43 |
44 | public void setSecond(long second) {
45 | this.second = second;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/RxData.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.entity;
2 |
3 | /**
4 | * Description:RxBus数据实体
5 | *
6 | * Author:pei
7 | * Date: 2019/3/21
8 | */
9 | public class RxData extends BaseEntity {
10 |
11 | private int code;
12 | private String message;
13 | private T data;
14 |
15 | public int getCode() {
16 | return code;
17 | }
18 |
19 | public void setCode(int code) {
20 | this.code = code;
21 | }
22 |
23 | public String getMessage() {
24 | return message;
25 | }
26 |
27 | public void setMessage(String message) {
28 | this.message = message;
29 | }
30 |
31 | public T getData() {
32 | return data;
33 | }
34 |
35 | public void setData(T data) {
36 | this.data = data;
37 | }
38 |
39 | @Override
40 | public String toString() {
41 | return "RxData{" +
42 | "code=" + code +
43 | ", message='" + message + '\'' +
44 | ", data=" + data +
45 | '}';
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/UIData.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.entity;
2 |
3 | /**
4 | * Description:用于业务逻辑线程更新主线程数据传值的data
5 | *
6 | * Author:pei
7 | * Date: 2019/4/12
8 | */
9 | public class UIData extends BaseEntity{
10 |
11 | private int code;
12 | private String message;
13 | private int notifyId;
14 | private T data;
15 |
16 | public int getCode() {
17 | return code;
18 | }
19 |
20 | public void setCode(int code) {
21 | this.code = code;
22 | }
23 |
24 | public String getMessage() {
25 | return message;
26 | }
27 |
28 | public void setMessage(String message) {
29 | this.message = message;
30 | }
31 |
32 | public T getData() {
33 | return data;
34 | }
35 |
36 | public void setData(T data) {
37 | this.data = data;
38 | }
39 |
40 | public int getNotifyId() {
41 | return notifyId;
42 | }
43 |
44 | public void setNotifyId(int notifyId) {
45 | this.notifyId = notifyId;
46 | }
47 |
48 | @Override
49 | public String toString() {
50 | return "UIData{" +
51 | "code=" + code +
52 | ", message='" + message + '\'' +
53 | ", notifyId=" + notifyId +
54 | ", data=" + data +
55 | '}';
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/contentprovider/ContactData.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.entity.contentprovider;
2 |
3 | import com.android.commonlibrary.entity.BaseEntity;
4 |
5 | /**
6 | * Title: 手机联系人数据载体
7 | *
8 | * description:
9 | * autor:pei
10 | * created on 2021/3/2
11 | */
12 | public class ContactData extends BaseEntity {
13 |
14 | private String name;//姓名
15 | private String number;//电话号码
16 | private String email;//邮箱
17 |
18 | public String getName() {
19 | return name;
20 | }
21 |
22 | public void setName(String name) {
23 | this.name = name;
24 | }
25 |
26 | public String getNumber() {
27 | return number;
28 | }
29 |
30 | public void setNumber(String number) {
31 | this.number = number;
32 | }
33 |
34 | public String getEmail() {
35 | return email;
36 | }
37 |
38 | public void setEmail(String email) {
39 | this.email = email;
40 | }
41 |
42 | @Override
43 | public String toString() {
44 | return "ContactData{" +
45 | "name='" + name + '\'' +
46 | ", number='" + number + '\'' +
47 | ", email='" + email + '\'' +
48 | '}';
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/contentprovider/SmsData.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.entity.contentprovider;
2 |
3 | import androidx.annotation.Nullable;
4 | import com.android.commonlibrary.entity.BaseEntity;
5 |
6 | /**
7 | * Title: 短信数据载体
8 | *
9 | * description:
10 | * autor:pei
11 | * created on 2021/3/2
12 | */
13 | public class SmsData extends BaseEntity {
14 |
15 | private String address;//短信号码
16 | private String person;//人物
17 | private String body;//信息
18 | private String date;//时间
19 | private String type;//类型
20 |
21 | public String getAddress() {
22 | return address;
23 | }
24 |
25 | public void setAddress(String address) {
26 | this.address = address;
27 | }
28 |
29 | public String getPerson() {
30 | return person;
31 | }
32 |
33 | public void setPerson(String person) {
34 | this.person = person;
35 | }
36 |
37 | public String getBody() {
38 | return body;
39 | }
40 |
41 | public void setBody(String body) {
42 | this.body = body;
43 | }
44 |
45 | public String getDate() {
46 | return date;
47 | }
48 |
49 | public void setDate(String date) {
50 | this.date = date;
51 | }
52 |
53 | public String getType() {
54 | return type;
55 | }
56 |
57 | public void setType(String type) {
58 | this.type = type;
59 | }
60 |
61 | @Override
62 | public String toString() {
63 | return "SmsData{" +
64 | "address='" + address + '\'' +
65 | ", person='" + person + '\'' +
66 | ", body='" + body + '\'' +
67 | ", date='" + date + '\'' +
68 | ", type='" + type + '\'' +
69 | '}';
70 | }
71 |
72 |
73 | /**获得对象除date属性之外的数据**/
74 | public String withOutDateToString() {
75 | return "SmsData{" +
76 | "address='" + address + '\'' +
77 | ", person='" + person + '\'' +
78 | ", body='" + body + '\'' +
79 | ", type='" + type + '\'' +
80 | '}';
81 | }
82 |
83 | /**比较两个对象除date之外是否值相等**/
84 | @Override
85 | public boolean equals(@Nullable Object obj) {
86 | if(obj!=null){
87 | if(obj instanceof SmsData){
88 | SmsData temp= (SmsData) obj;
89 | if(temp.withOutDateToString().equals(this.withOutDateToString())){
90 | return true;
91 | }
92 | }
93 | }
94 | return false;
95 | }
96 |
97 | }
98 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/af/AppActivity.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.af;
2 |
3 | import com.android.commonlibrary.frame.struct.mvp.MvpWrapper;
4 | import com.android.commonlibrary.interfacer.base.IFrame;
5 | import com.android.commonlibrary.interfacer.frame.struct.mvp.IMvpFrame;
6 | import com.android.commonlibrary.interfacer.frame.struct.mvp.IPresenter;
7 | import com.android.commonlibrary.interfacer.frame.struct.mvp.PrePresenter;
8 | import com.android.commonlibrary.ui.activity.SuperFragActivity;
9 |
10 | /**
11 | * Title: 具备MVP架构的Activity基类(具备加载Fragment的能力)
12 | * description:
13 | * autor:pei
14 | * created on 2022/7/13
15 | */
16 | public abstract class AppActivity extends SuperFragActivity implements IPresenter {
17 |
18 | //项目框架,如 mvp,mvvm等
19 | protected IFrame mStructFrame;
20 | //屏幕适配框架
21 | protected IFrame mScreenFrame;
22 |
23 | @Override
24 | public void loadFrame() {
25 | super.loadFrame();
26 | //加载项目框架
27 | mStructFrame = getFrame();
28 | ((IMvpFrame)mStructFrame).attachStruct();
29 | }
30 |
31 | @Override
32 | public void destoryFrame() {
33 | super.destoryFrame();
34 | //注销项目框架
35 | ((IMvpFrame)mStructFrame).detachStruct();
36 |
37 | }
38 |
39 | private IFrame getFrame(){
40 | //采用mvp项目架构
41 | return new MvpWrapper(getPresenter());
42 | }
43 |
44 |
45 | /***
46 | * 若要使用mvp架构,需要在子类中重写此方法并返回具体的 PrePresenter
47 | * @return
48 | */
49 | @Override
50 | public PrePresenter getPresenter() {
51 | return null;
52 | }
53 |
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/af/AppFragment.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.af;
2 |
3 | import com.android.commonlibrary.frame.struct.mvp.MvpWrapper;
4 | import com.android.commonlibrary.interfacer.base.IFrame;
5 | import com.android.commonlibrary.interfacer.frame.struct.mvp.IMvpFrame;
6 | import com.android.commonlibrary.interfacer.frame.struct.mvp.IPresenter;
7 | import com.android.commonlibrary.interfacer.frame.struct.mvp.PrePresenter;
8 | import com.android.commonlibrary.ui.fragment.SuperFragment;
9 |
10 | /**
11 | * 具备MVP架构 Fragment基类
12 | **/
13 | public abstract class AppFragment extends SuperFragment implements IPresenter {
14 |
15 | //项目框架,如 mvp,mvvm等
16 | protected IFrame mStructFrame;
17 |
18 | @Override
19 | public void loadFrame() {
20 | super.loadFrame();
21 | //加载项目框架
22 | mStructFrame = getFrame();
23 | ((IMvpFrame)mStructFrame).attachStruct();
24 | }
25 |
26 | @Override
27 | public void destoryFrame() {
28 | super.destoryFrame();
29 | //注销项目框架
30 | ((IMvpFrame)mStructFrame).detachStruct();
31 | }
32 |
33 | private IFrame getFrame() {
34 | //采用mvp项目架构
35 | return new MvpWrapper(getPresenter());
36 | }
37 |
38 |
39 | /***
40 | * 若要使用mvp架构,需要在子类中重写此方法并返回具体的 PrePresenter
41 | * @return
42 | */
43 | @Override
44 | public PrePresenter getPresenter() {
45 | return null;
46 | }
47 |
48 | }
49 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/screen/autosize/AutoAdapterHelper.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.screen.autosize;
2 |
3 | import android.app.Activity;
4 | import android.app.Application;
5 |
6 | import com.android.commonlibrary.util.ScreenUtil;
7 |
8 | import me.jessyan.autosize.AutoSize;
9 | import me.jessyan.autosize.AutoSizeCompat;
10 | import me.jessyan.autosize.AutoSizeConfig;
11 | import me.jessyan.autosize.internal.CustomAdapt;
12 | import me.jessyan.autosize.unit.Subunits;
13 |
14 | /**
15 | * Title: 头条适配帮助类
16 | *
17 | * description: Activity/Fragment 适配屏幕需要实现 CustomAdapt 接口
18 | * Activity/Fragment 取消适配屏幕需要实现 CancelAdapt 接口
19 | *
20 | * autor:pei
21 | * created on 2022/7/12
22 | */
23 | public class AutoAdapterHelper {
24 |
25 | /***
26 | * 适配框架初始化,在Application中调用,防止多线程
27 | *
28 | * @param application
29 | * @return
30 | */
31 | public AutoAdapterHelper init(Application application){
32 | AutoSize.initCompatMultiProcess(application);
33 | return this;
34 | }
35 |
36 |
37 | /***
38 | * fragment适配需要在application中初始化调用
39 | *
40 | * 自定义fragment适配时设置为true
41 | */
42 | public void initForFragment(boolean flag){
43 | AutoSizeConfig.getInstance().setCustomFragment(flag);
44 | }
45 |
46 |
47 | /**设置副单位**/
48 | public void setSupportSubunitsMM(){
49 | AutoSizeConfig.getInstance().getUnitsManager()
50 | .setSupportDP(false)
51 | .setSupportSP(false)
52 | .setSupportSubunits(Subunits.MM);
53 | }
54 |
55 | /**获取AutoSizeConfig对象**/
56 | public AutoSizeConfig getAutoSizeConfig(){
57 | return AutoSizeConfig.getInstance();
58 | }
59 |
60 | }
61 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/screen/autosize/DefaultApplyAutoActivity.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.screen.autosize;
2 |
3 | import android.app.Activity;
4 | import android.content.res.Configuration;
5 | import android.content.res.Resources;
6 | import com.android.commonlibrary.frame.af.AppActivity;
7 | import me.jessyan.autosize.internal.CustomAdapt;
8 |
9 | /**
10 | * Title: 屏幕适配Activity示例
11 | *
12 | * description: 使用时将此类拷贝到你的项目中,将DefaultApplyAutoActivity名称改为 ApplyAutoActivity
13 | * 创建新界面时(如TestActivity)去继承 ApplyAutoActivity 以实现activity的屏幕适配
14 | * 然后要改基类特性时,去你自己项目中的基类Activity(如BaseActivity)中去修改
15 | * 不要在 ApplyAutoActivity中去改基类特性
16 | *
17 | * autor:pei
18 | * created on 2022/7/12
19 | */
20 | public abstract class DefaultApplyAutoActivity extends DefaultSuperAutoSizeActivity {
21 |
22 | @Override
23 | public boolean isBaseOnWidth() {
24 | //true表示以最小屏幕宽度适配,false表示以高度适配
25 | return super.isBaseOnWidth();
26 | }
27 |
28 | @Override
29 | public float getSizeInDp() {
30 | //如果要适配其他屏幕尺寸dp,可以重写此类返回具体sizeInDp值,默认为 0 表示采用 mainfast.xml全局适配
31 | return 0;
32 | }
33 |
34 | }
35 |
36 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/screen/autosize/DefaultApplyAutoFragment.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.screen.autosize;
2 |
3 | import com.android.commonlibrary.frame.af.AppFragment;
4 | import me.jessyan.autosize.internal.CustomAdapt;
5 |
6 | /**
7 | * Title: 屏幕适配Fragment示例
8 | *
9 | * description: 使用时将此类拷贝到你的项目中,将DefaultApplyAutoFragment名称改为 ApplyAutoFragment
10 | * 然后把继承的 AppFragment 改为自己项目中的 基类Fragment(如Fragment)
11 | * 创建新界面时(如TestFragment)去继承 ApplyAutoFragment 以实现Fragment的屏幕适配
12 | * 然后要改基类特性时,去你自己项目中的基类Fragment(如BaseFragment)中去修改
13 | * 不要在 ApplyAutoFragment中去改基类特性
14 | *
15 | * autor:pei
16 | * created on 2022/7/12
17 | */
18 | public abstract class DefaultApplyAutoFragment extends AppFragment implements CustomAdapt {
19 |
20 | @Override
21 | public boolean isBaseOnWidth() {
22 | //true表示以最小屏幕宽度适配,false表示以高度适配
23 | return true;
24 | }
25 |
26 | @Override
27 | public float getSizeInDp() {
28 | //如果要适配其他屏幕尺寸dp,可以重写此类返回具体sizeInDp值,默认为 0 表示采用 mainfast.xml全局适配
29 | return 0;
30 | }
31 |
32 |
33 | }
34 |
35 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/screen/autosize/DefaultCancelAutoActivity.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.screen.autosize;
2 |
3 | import com.android.commonlibrary.frame.af.AppActivity;
4 | import me.jessyan.autosize.internal.CancelAdapt;
5 |
6 | /**
7 | * Title: 取消屏幕适配Activity示例
8 | *
9 | * description: 使用时将此类拷贝到你的项目中,将 DefaultCancelAutoActivity名称改为 CancelAutoActivity
10 | * 然后把继承的 AppActivity 改为自己项目中的 基类Activity(如BaseActivity)
11 | * 创建新界面时(如TestActivity)去继承 CancelAutoActivity 以实现取消activity的屏幕适配
12 | * 然后要改基类特性时,去你自己项目中的基类Activity(如BaseActivity)中去修改
13 | * 不要在 CancelAutoActivity中去改基类特性
14 | *
15 | * autor:pei
16 | * created on 2022/7/12
17 | */
18 | public abstract class DefaultCancelAutoActivity extends AppActivity implements CancelAdapt {
19 |
20 |
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/screen/autosize/DefaultCancelAutoFragment.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.screen.autosize;
2 |
3 | import com.android.commonlibrary.frame.af.AppFragment;
4 | import me.jessyan.autosize.internal.CancelAdapt;
5 |
6 | /**
7 | * Title: 取消屏幕适配Fragment示例
8 | *
9 | * description: 使用时将此类拷贝到你的项目中,将DefaultCancelAutoFragment名称改为 CancelAutoFragment
10 | * 然后把继承的 AppFragment 改为自己项目中的 基类Fragment(如Fragment)
11 | * 创建新界面时(如TestFragment)去继承 CancelAutoFragment 以实现取消Fragment的屏幕适配
12 | * 然后要改基类特性时,去你自己项目中的基类Fragment(如BaseFragment)中去修改
13 | * 不要在 CancelAutoFragment中去改基类特性
14 | *
15 | * autor:pei
16 | * created on 2022/7/12
17 | */
18 | public abstract class DefaultCancelAutoFragment extends AppFragment implements CancelAdapt {
19 |
20 |
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/struct/mvp/MvpWrapper.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.struct.mvp;
2 |
3 | import com.android.commonlibrary.interfacer.frame.struct.mvp.IMvpFrame;
4 | import com.android.commonlibrary.interfacer.frame.struct.mvp.PrePresenter;
5 |
6 | /**
7 | * Title: Mvp框架
8 | *
9 | * description:
10 | * autor:pei
11 | * created on 2022/7/13
12 | */
13 | public class MvpWrapper implements IMvpFrame {
14 |
15 | private PrePresenter mPresenter;
16 |
17 | public MvpWrapper(PrePresenter presenter){
18 | this.mPresenter = presenter;
19 | }
20 |
21 | @Override
22 | public void attachStruct() {
23 | if (mPresenter != null) {
24 | mPresenter.attachView();
25 | }
26 | }
27 |
28 | @Override
29 | public void detachStruct() {
30 | if (mPresenter != null) {
31 | mPresenter.detachView();
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/struct/mvp/UIPresenter.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.struct.mvp;
2 |
3 | import android.content.Context;
4 |
5 | import com.android.commonlibrary.entity.UIData;
6 | import com.android.commonlibrary.frame.af.AppActivity;
7 | import com.android.commonlibrary.interfacer.frame.struct.mvp.PreView;
8 |
9 | /**
10 | * Description:更新主线程ui帮助类
11 | *
12 | * Author:pei
13 | * Date: 2019/4/12
14 | */
15 | public class UIPresenter {
16 |
17 | /**更新ui的方法**/
18 | public void updateUI(Context context, PreView view, UIData data, OnUIListener listener){
19 | ((AppActivity)context).runOnUiThread(new Runnable() {
20 | @Override
21 | public void run() {
22 | // Object obj=data.getData();
23 | // String className=cls.getName();
24 | // if((obj instanceof List)&&CheckTypeModel.ResultListBean.class.getName().equals(className)){
25 | // view.checkTypeSuccess((List)obj);
26 | // }
27 | listener.update(view,data);
28 | }
29 | });
30 | }
31 |
32 | public interface OnUIListener{
33 | void update(PreView view, UIData data);
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/frame/view/ButterKnifeWrapper.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.frame.view;
2 |
3 | import android.app.Activity;
4 | import android.view.View;
5 | import androidx.annotation.NonNull;
6 | import androidx.fragment.app.Fragment;
7 | import com.android.commonlibrary.interfacer.base.IAF;
8 | import com.android.commonlibrary.interfacer.frame.view.butterknife.IButterKnifeFrame;
9 | import butterknife.ButterKnife;
10 | import butterknife.Unbinder;
11 |
12 | /**
13 | * Title: ButterKnife 初始化控件 框架
14 | *
15 | * description:
16 | * autor:pei
17 | * created on 2022/7/14
18 | */
19 | public class ButterKnifeWrapper implements IButterKnifeFrame {
20 |
21 | private Unbinder mUnbinder;
22 | private Object mTarget;
23 | private View mView;
24 |
25 | /**Activity初始化时调用**/
26 | public ButterKnifeWrapper(@NonNull Object target){
27 | this.mTarget=target;
28 | }
29 |
30 | /**Fragment初始化时调用**/
31 | public ButterKnifeWrapper(@NonNull Object target, @NonNull View view){
32 | this.mTarget=target;
33 | this.mView=view;
34 | }
35 |
36 | @Override
37 | public void attachView() {
38 | if (mTarget != null && mView != null && mTarget instanceof IAF) {
39 | if (mTarget instanceof Activity) {
40 | mUnbinder = ButterKnife.bind((Activity) mTarget); //绑定Activity
41 | } else if (mTarget instanceof Fragment) {
42 | mUnbinder = ButterKnife.bind((Fragment) mTarget, mView); //绑定framgent
43 | }
44 | }
45 | }
46 |
47 | @Override
48 | public void detachView() {
49 | if (mUnbinder != null) {
50 | mUnbinder.unbind();
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/base/IAFFrame.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.base;
2 |
3 | /**
4 | * Title: Activity,fragment加载和注销框架需要实现的接口
5 | * description:
6 | * autor:pei
7 | * created on 2022/7/14
8 | */
9 | public interface IAFFrame extends IFrame{
10 |
11 | /**加载**/
12 | void loadFrame();
13 |
14 | /**销毁**/
15 | void destoryFrame();
16 | }
17 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/base/IActivity.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.base;
2 |
3 | /**
4 | * Title: Activity顶级接口
5 | * description:
6 | * autor:pei
7 | * created on 2022/7/13
8 | */
9 | public interface IActivity extends ITop{
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/base/IFragment.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.base;
2 |
3 | /**
4 | * Title: Fragment顶级接口
5 | * description:
6 | * autor:pei
7 | * created on 2022/7/13
8 | */
9 | public interface IFragment extends ITop{
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/base/IFrame.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.base;
2 |
3 | /**
4 | * Title: 项目架构顶级接口
5 | *
6 | * description: 含控件初始化框架,项目结构框架,屏幕适配框架
7 | *
8 | * autor:pei
9 | * created on 2022/7/13
10 | */
11 | public interface IFrame extends ITop{
12 |
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/base/ITop.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.base;
2 |
3 | /**
4 | * Title: 项目顶级接口
5 | * description:
6 | * autor:pei
7 | * created on 2022/7/13
8 | */
9 | public interface ITop {
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/frame/IScreenFrame.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.frame;
2 |
3 | import com.android.commonlibrary.interfacer.base.IFrame;
4 |
5 | /**
6 | * Title: 屏幕适配框架顶级接口
7 | *
8 | * description:
9 | * autor:pei
10 | * created on 2022/7/14
11 | */
12 | public interface IScreenFrame extends IFrame {
13 |
14 | /**加载**/
15 | void attachScreen();
16 |
17 | /**取消**/
18 | void detachScreen();
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/frame/struct/mvp/IMvpFrame.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.frame.struct.mvp;
2 |
3 | import com.android.commonlibrary.interfacer.base.IFrame;
4 |
5 | /**
6 | * Title: mvp项目结构框架顶级接口
7 | *
8 | * description:
9 | * autor:pei
10 | * created on 2022/7/14
11 | */
12 | public interface IMvpFrame extends IFrame {
13 |
14 | /**创建**/
15 | void attachStruct();
16 |
17 | /**销毁**/
18 | void detachStruct();
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/frame/struct/mvp/IPresenter.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.frame.struct.mvp;
2 |
3 | import com.android.commonlibrary.interfacer.frame.struct.mvp.PrePresenter;
4 |
5 | /**
6 | * Title:获取Presenter对象的接口
7 | * description:
8 | * autor:pei
9 | * created on 2020/4/28
10 | */
11 | public interface IPresenter {
12 |
13 | // T getPresenter();
14 | PrePresenter getPresenter();
15 | }
16 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/frame/struct/mvp/PrePresenter.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.frame.struct.mvp;
2 |
3 | /**
4 | * Created by Admin on 2017/5/16.
5 | *
6 | * T-MVP Presenter基类
7 | */
8 |
9 | public interface PrePresenter {
10 |
11 | void attachView();
12 |
13 | void detachView();
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/frame/struct/mvp/PreView.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.frame.struct.mvp;
2 |
3 | /**
4 | * MVP-View基类
5 | */
6 | public interface PreView {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/interfacer/frame/view/butterknife/IButterKnifeFrame.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.interfacer.frame.view.butterknife;
2 |
3 | import com.android.commonlibrary.interfacer.base.IFrame;
4 |
5 | /**
6 | * Title: 控件初始化框架顶级接口,如 butterknife 等
7 | *
8 | * description:
9 | * autor:pei
10 | * created on 2022/7/14
11 | */
12 | public interface IButterKnifeFrame extends IFrame {
13 |
14 | /**创建**/
15 | void attachView();
16 |
17 | /**销毁**/
18 | void detachView();
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/listener/EditTextChangeListener.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.listener;
2 |
3 | import android.text.TextWatcher;
4 |
5 | /**
6 | * Title:输入框输入监听
7 | * description:
8 | * autor:pei
9 | * created on 2020/6/3
10 | */
11 | public abstract class EditTextChangeListener implements TextWatcher {
12 |
13 | @Override
14 | public void beforeTextChanged(CharSequence s, int start, int count, int after) {
15 |
16 | }
17 |
18 | @Override
19 | public void onTextChanged(CharSequence s, int start, int before, int count) {
20 |
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/message_data/UIHandler.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.message_data;
2 |
3 |
4 | import android.os.Handler;
5 | import android.os.Message;
6 |
7 | import java.lang.ref.WeakReference;
8 |
9 | /**
10 | * Title:封装Handler防止内存泄漏
11 | * description:
12 | * autor:pei
13 | * created on 2020/2/8
14 | */
15 | public class UIHandler extends Handler {
16 |
17 | //弱引用(引用外部类)
18 | private WeakReference weakReference;
19 | private OnUIHandListener mOnUIHandListener;
20 |
21 | public UIHandler(Object obj, OnUIHandListener listener) {
22 | if(obj==null){
23 | throw new NullPointerException("=====传入obj不能为空=====");
24 | }
25 | //构造弱引用
26 | weakReference = new WeakReference<>((T) obj);
27 | this.mOnUIHandListener=listener;
28 | }
29 |
30 | @Override
31 | public void handleMessage(Message msg) {
32 | super.handleMessage(msg);
33 | //通过弱引用获取外部类.
34 | Object obj = weakReference.get();
35 | //进行非空再操作
36 | if (obj != null&&mOnUIHandListener!=null) {
37 | mOnUIHandListener.uiHandle(obj,msg);
38 | }
39 | //移除消息
40 | removeMessages(msg.what);
41 | }
42 |
43 | public interface OnUIHandListener{
44 | void uiHandle(Object obj, Message msg);
45 | }
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/service/ServiceHelper.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.service;
2 |
3 | import android.app.Notification;
4 | import android.app.Service;
5 | import android.content.Context;
6 |
7 | import androidx.core.app.NotificationCompat;
8 |
9 | import com.android.commonlibrary.R;
10 | import com.android.commonlibrary.service.local_service.LocalServiceHelper;
11 | import com.android.commonlibrary.util.NotificationHelper;
12 |
13 | /**
14 | * Title:服务帮助类
15 | * description:
16 | * autor:pei
17 | * created on 2019/11/17
18 | */
19 | public class ServiceHelper {
20 |
21 | protected final int SERVICE_FRONT = 0x1988;
22 |
23 | /**
24 | * 开启前台运行模式(简易通知栏模式)
25 | * @param drawableId 设置小图标,一般设置app的icon,样式如:R.mipmap.ic_launcher
26 | */
27 | public void startForeService(Service service,int drawableId,Context context){
28 | if(service!=null&&context!=null&&drawableId!=0) {
29 | NotificationHelper notificationHelper = new NotificationHelper();
30 | //创建builder
31 | NotificationCompat.Builder builder = notificationHelper.init(drawableId)//初始化,设置小图标,必须调用,一般设置app的icon
32 | .setTitle("")//设置标题
33 | .setContent("")//设置内容
34 | .createBuilder(context);//创建builder
35 | Notification notification = builder.build();
36 | //设置前台模式
37 | startForeService(service, notification);
38 | }
39 | }
40 |
41 | /**开启服务前台模式**/
42 | public void startForeService(Service service, Notification notification){
43 | if(service!=null&¬ification!=null) {
44 | service.startForeground(SERVICE_FRONT, notification);
45 | }
46 | }
47 |
48 | /**关闭服务前台模式**/
49 | public void stopForeService(Service service){
50 | if(service!=null) {
51 | service.stopForeground(true);
52 | }
53 | }
54 |
55 | }
56 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/service/local_service/LocalServiceHelper.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.service.local_service;
2 |
3 | import android.app.Service;
4 | import android.content.Context;
5 | import android.content.Intent;
6 |
7 | import com.android.commonlibrary.service.ServiceHelper;
8 |
9 | /**
10 | * Title:"非绑定式"服务帮助类
11 | * description:
12 | * autor:pei
13 | * created on 2019/11/17
14 | */
15 | public class LocalServiceHelper extends ServiceHelper {
16 |
17 | private Intent mLocalIntent;//“非绑定式"服务意图
18 |
19 | /***
20 | * 启动"非绑定式"服务
21 | * @param context
22 | * @param serviceCls
23 | * @param action 要与服务在manifast.xml中注册的 中的 xxx 值保持一致
24 | */
25 | public void startLocalService(Context context, Class>serviceCls, String action){
26 | //需要注意的是:setAction中的参数要与服务在manifast.xml中注册的 中的 xxx 值保持一致
27 | mLocalIntent=new Intent(context, serviceCls);
28 | mLocalIntent=startLocalServiceByIntent(context,mLocalIntent,serviceCls,action);
29 | }
30 |
31 |
32 | /***
33 | * 关闭"非绑定式"服务
34 | */
35 | public void stopLocalService(Context context){
36 | stopLocalServiceByIntent(context,mLocalIntent);
37 | }
38 |
39 | /***
40 | * 启动"非绑定式"服务(可设置intent传参)
41 | * @param context
42 | * @param intent
43 | * @param serviceCls
44 | * @param action
45 | * @return
46 | */
47 | public Intent startLocalServiceByIntent(Context context,Intent intent,Class>serviceCls,String action){
48 | if(intent!=null){
49 | intent.setAction(action);
50 | context.startService(intent);
51 | }
52 | return intent;
53 | }
54 |
55 | /**
56 | * 关闭"非绑定式"服务(需要传intent)
57 | */
58 | public void stopLocalServiceByIntent(Context context,Intent intent){
59 | if(intent!=null){
60 | context.stopService(intent);
61 | }
62 | }
63 |
64 | /***
65 | * "非绑定式"服务主动关闭自己
66 | */
67 | public void stopLocalBySelf(Service service){
68 | if(service!=null) {
69 | service.stopSelf();
70 | }
71 | }
72 |
73 | /***
74 | * "非绑定式"服务主动关闭自己
75 | */
76 | public void stopLocalSelfById(Service service,int startId){
77 | if(service!=null) {
78 | service.stopSelf(startId);
79 | }
80 | }
81 |
82 | }
83 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/service/remote_service/RemoteService.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.service.remote_service;
2 |
3 | import android.app.Service;
4 | import android.content.Intent;
5 | import android.os.Binder;
6 | import android.os.IBinder;
7 |
8 | /***
9 | * 绑定式服务
10 | *
11 | * @author pei
12 | * @create 2016-4-28
13 | *
14 | */
15 | public abstract class RemoteService extends Service{
16 |
17 | private IBinder mBinder=new RemoteBinder();
18 |
19 | @Override
20 | public void onCreate() {
21 | super.onCreate();
22 | }
23 |
24 | @Override
25 | public IBinder onBind(Intent arg0) {
26 | // TODO Auto-generated method stub
27 | return mBinder;
28 | }
29 |
30 | @Override
31 | public boolean onUnbind(Intent intent) {
32 | return super.onUnbind(intent);
33 | }
34 |
35 | @Override
36 | public void onDestroy() {
37 | super.onDestroy();
38 | }
39 |
40 | public class RemoteBinder extends Binder {
41 | public T getService() {
42 | return (getSelfService() == null) ? (T) RemoteService.this : (T) getSelfService();
43 | }
44 | }
45 |
46 | /**子类需要重写**/
47 | protected abstract RemoteService getSelfService();
48 |
49 | }
50 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/ui/activity/SuperFragActivity.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.ui.activity;
2 |
3 | import android.view.KeyEvent;
4 | import com.android.commonlibrary.util.LogUtil;
5 |
6 | /**
7 | * Description: AppActivity的父类,具备加载fragment的能力
8 | *
9 | * 在SuperActivity基础之上增加activity加载fragment的能力
10 | * 处理了Fragment和activity的返回键功能
11 | *
12 | * Author:pei
13 | * Date: 2019/7/16
14 | */
15 | public abstract class SuperFragActivity extends SuperActivity {
16 |
17 | protected OnFragmentBackListener mOnFragmentBackListener;
18 |
19 | /**设置监听**/
20 | public void setOnFragmentBackListener(OnFragmentBackListener listener){
21 | this.mOnFragmentBackListener=listener;
22 | }
23 |
24 | /**重写返回键,用于处理Activity和Fragment界面的返回键逻辑**/
25 | @Override
26 | public boolean onKeyDown(int keyCode, KeyEvent event) {
27 | if ((keyCode == KeyEvent.KEYCODE_BACK)) {
28 | if (mOnFragmentBackListener != null) {
29 | LogUtil.i("======fragment中拦截处理返回键========");
30 | //fragment中拦截处理返回键
31 | mOnFragmentBackListener.onBackForward(keyCode,event);
32 | return true;
33 | } else {
34 | LogUtil.i("======activity中拦截返回键的处理========");
35 | //activity中拦截返回键的处理
36 | return onActivityKeyDown(keyCode,event);
37 | }
38 | }
39 | return super.onKeyDown(keyCode, event);
40 | }
41 |
42 | /**
43 | * activity中拦截返回键的处理
44 | *
45 | * 当activity中加载有Fragment时需要处理返回键,重写此方法就行
46 | * @param keyCode
47 | * @param event
48 | */
49 | protected boolean onActivityKeyDown(int keyCode, KeyEvent event){
50 | return super.onKeyDown(keyCode, event);
51 | }
52 |
53 |
54 | /**Activity与Fragment交互时,对于返回键处理的监听**/
55 | public interface OnFragmentBackListener {
56 |
57 | /**返回键的处理**/
58 | void onBackForward(int keyCode, KeyEvent event);
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/DoubleClickUtil.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util;
2 |
3 | import android.view.View;
4 |
5 | /**
6 | * Created by Admin on 2017/6/26.
7 | * 防止按钮连击工具类
8 | */
9 | public class DoubleClickUtil {
10 |
11 | private static final long DEFAULT_MILLISECONDS=1000;//一秒
12 | private static long mLastClick;
13 |
14 | public static boolean isDoubleClick(){
15 | return isDoubleClick(DEFAULT_MILLISECONDS);
16 | }
17 |
18 | public static boolean isDoubleClick(long milliseconds){
19 | //大于一秒方个通过
20 | if (System.currentTimeMillis() - mLastClick <= milliseconds){
21 | return true;
22 | }
23 | mLastClick = System.currentTimeMillis();
24 | return false;
25 | }
26 |
27 | public static void shakeClick(final View v) {
28 | shakeClick(v,DEFAULT_MILLISECONDS);
29 | }
30 |
31 | public static void shakeClick(final View v, long milliseconds) {
32 | v.setClickable(false);
33 | v.postDelayed(new Runnable(){
34 | @Override
35 | public void run() {
36 | v.setClickable(true);
37 | }
38 | }, milliseconds);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/FlashHelper.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util;
2 |
3 | import android.view.View;
4 | import android.view.animation.AlphaAnimation;
5 | import android.view.animation.Animation;
6 | import android.view.animation.LinearInterpolator;
7 |
8 | /**
9 | * Title:控件闪烁帮助类
10 | * Description:
11 | *
12 | * Created by pei
13 | * Date: 2018/4/22
14 | */
15 | public class FlashHelper {
16 |
17 | private long mFlashTime=300;//闪烁默认时间间隔(毫秒)
18 |
19 | private FlashHelper() {}
20 |
21 | private static class Holder {
22 | private static FlashHelper instance = new FlashHelper();
23 | }
24 |
25 | public static FlashHelper getInstance() {
26 | return Holder.instance;
27 | }
28 |
29 | /**设置闪烁时间间隔**/
30 | public FlashHelper setFlashTime(long flashTime){
31 | this.mFlashTime=flashTime;
32 | return FlashHelper.this;
33 | }
34 |
35 | /**开启View闪烁效果**/
36 | public void startFlick(View view) {
37 | if (null == view) {
38 | return;
39 | }
40 | Animation alphaAnimation = new AlphaAnimation(1, 0);
41 | alphaAnimation.setDuration(mFlashTime);
42 | alphaAnimation.setInterpolator(new LinearInterpolator());
43 | alphaAnimation.setRepeatCount(Animation.INFINITE);
44 | alphaAnimation.setRepeatMode(Animation.REVERSE);
45 | view.startAnimation(alphaAnimation);
46 | }
47 |
48 | /**取消View闪烁效果**/
49 | public void stopFlick(View view) {
50 | if (null == view) {
51 | return;
52 | }
53 | view.clearAnimation();
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/ScreenOrientationUtil.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util;
2 |
3 | import android.app.Activity;
4 | import android.content.pm.ActivityInfo;
5 | import android.content.res.Configuration;
6 |
7 | /**
8 | * Title:设置屏幕方向
9 | * description:
10 | * autor:pei
11 | * created on 2020/8/16
12 | */
13 | public class ScreenOrientationUtil {
14 |
15 | /**设置竖屏**/
16 | public static void setPortrait(Activity activity){
17 | activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
18 | }
19 |
20 | /**设置竖屏**/
21 | public static void setLandscape(Activity activity){
22 | //由于横屏有两个方向的横法,而这个设置横屏的语句,假设不是默认的横屏方向,会把已经横屏的屏幕旋转180°
23 | //所以能够先推断是否已经为横屏了
24 | if(activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
25 | activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
26 | }
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/ToastUtil.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util;
2 |
3 | import android.content.Context;
4 | import android.view.Gravity;
5 | import android.view.View;
6 | import android.widget.TextView;
7 | import android.widget.Toast;
8 | import com.android.commonlibrary.R;
9 | import com.android.commonlibrary.app.LibraryConfig;
10 |
11 | /**
12 | * Created by codeest on 2016/8/4.
13 | */
14 | public class ToastUtil {
15 |
16 | private static ToastUtil TD;
17 |
18 | private Context mContext;
19 | private Toast mToast;
20 | private String msg;
21 |
22 | public ToastUtil(Context context) {
23 | // this.mContext = context;
24 | this.mContext = LibraryConfig.getInstance().getApplication();
25 | }
26 |
27 | public static void show(int resId){
28 | show(LibraryConfig.getInstance().getApplication().getString(resId));
29 | }
30 |
31 | public static void show(String msg) {
32 | if (TD == null) {
33 | TD = new ToastUtil(LibraryConfig.getInstance().getApplication());
34 | }
35 | TD.setText(msg);
36 | TD.create().show();
37 | }
38 |
39 | public static void shortShow(String msg) {
40 | if (TD == null) {
41 | TD = new ToastUtil(LibraryConfig.getInstance().getApplication());
42 | }
43 | TD.setText(msg);
44 | TD.createShort().show();
45 | }
46 |
47 | private Toast create() {
48 | View contentView = View.inflate(mContext, R.layout.dialog_toast, null);
49 | TextView tvMsg = (TextView) contentView.findViewById(R.id.tv_toast_msg);
50 | mToast = new Toast(mContext);
51 | mToast.setView(contentView);
52 | mToast.setGravity(Gravity.CENTER, 0, 0);
53 | mToast.setDuration(Toast.LENGTH_LONG);
54 | tvMsg.setText(msg);
55 | return mToast;
56 | }
57 |
58 | private Toast createShort() {
59 | View contentView = View.inflate(mContext, R.layout.dialog_toast, null);
60 | TextView tvMsg = (TextView) contentView.findViewById(R.id.tv_toast_msg);
61 | mToast = new Toast(mContext);
62 | mToast.setView(contentView);
63 | mToast.setGravity(Gravity.CENTER, 0, 0);
64 | mToast.setDuration(Toast.LENGTH_SHORT);
65 | tvMsg.setText(msg);
66 | return mToast;
67 | }
68 |
69 | private void show() {
70 | if (mToast != null){
71 | mToast.show();
72 | }
73 | }
74 |
75 | public void setText(String text) {
76 | msg = text;
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/VersionHelper.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util;
2 |
3 | /**
4 | * Title: app版本判断工具类
5 | * description:
6 | * autor:pei
7 | * created on 2019/12/16
8 | */
9 | public class VersionHelper{
10 |
11 | /**
12 | * 判断版本,版本号为 1.2.3样式,返回ture时表示当前版本过低,需要更新
13 | *
14 | * @param loadVersion 官网app版本号
15 | * @param currentVersion 当前app版本号
16 | * @return
17 | */
18 | public static boolean isLowerVersion(String loadVersion, String currentVersion) {
19 | if (StringUtil.isNotEmpty(loadVersion) && StringUtil.isNotEmpty(currentVersion)) {
20 | if (loadVersion.contains(".") && currentVersion.contains(".")) {
21 | String oldVersion[] = loadVersion.split("\\.");
22 | String newVersion[] = currentVersion.split("\\.");
23 | try {
24 | int oldNum0 = Integer.valueOf(oldVersion[0]);
25 | int newNum0 = Integer.valueOf(newVersion[0]);
26 | if (newNum0 > oldNum0) {
27 | return false;
28 | } else if (newNum0 < oldNum0) {
29 | return true;
30 | } else {
31 | int oldNum1 = Integer.valueOf(oldVersion[1]);
32 | int newNum1 = Integer.valueOf(newVersion[1]);
33 | if (newNum1 > oldNum1) {
34 | return false;
35 | } else if (newNum1 < oldNum1) {
36 | return true;
37 | } else {
38 | int oldNum2 = Integer.valueOf(oldVersion[2]);
39 | int newNum2 = Integer.valueOf(newVersion[2]);
40 | if (newNum2 < oldNum2) {
41 | return true;
42 | }
43 | }
44 | }
45 | } catch (NumberFormatException e) {
46 | e.printStackTrace();
47 | return false;
48 | }
49 | }
50 | }
51 | return false;
52 | }
53 |
54 | }
55 |
56 | //==============使用范例================
57 | //
58 | // //获取当前app版本号,如:1.0.0
59 | // String currentVersionName=AppUtil.getVersionName()
60 | //
61 | // //逻辑判断
62 | // if (VersionHelper.isLowerVersion(versionName, currentVersionName)) {//更新app
63 | // //弹出是否更新的dialog
64 | // updateAppDialog(url);
65 | // } else {//不更新
66 | // //进入app
67 | // intoApp();
68 | // }
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/VibratorUtil.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util;
2 |
3 | import android.app.Service;
4 | import android.os.Vibrator;
5 | import com.android.commonlibrary.app.LibraryConfig;
6 |
7 | /**
8 | * 手机震动工具类
9 | *
10 | * @author Administrator
11 | * 权限
12 | *
13 | */
14 | public class VibratorUtil {
15 | /**
16 | * final Activity activity :调用该方法的Activity实例
17 | * long milliseconds :震动的时长,单位是毫秒
18 | * long[] pattern :自定义震动模式 。数组中数字的含义依次是[震动时长,静止时长,震动时长,静止时长。。。]时长的单位是毫秒
19 | * boolean isRepeat : 是否反复震动,如果是true,反复震动,如果是false,只震动一次
20 | */
21 |
22 | private static long[] defaultpattern = {400, 800, 400, 800};
23 |
24 | public static boolean isLongVibrate;
25 |
26 | private static Vibrator getVibrator() {
27 | Vibrator vibrator = (Vibrator) LibraryConfig.getInstance().getApplication().getSystemService(Service.VIBRATOR_SERVICE);
28 | return vibrator;
29 | }
30 |
31 | public static void startVibrate() {
32 | Vibrator vibrator = getVibrator();
33 | vibrator.vibrate(500);
34 | }
35 |
36 | public static void startVibrate(long[] pattern, boolean isRepeat) {
37 | isLongVibrate = true;
38 | if (pattern == null) {
39 | pattern = defaultpattern;
40 | }
41 | Vibrator vibrator = getVibrator();
42 | vibrator.vibrate(pattern, isRepeat ? 1 : -1);
43 | }
44 |
45 | // 停止震动
46 | public static void stopVibrate() {
47 | isLongVibrate = false;
48 | Vibrator vibrator = getVibrator();
49 | vibrator.cancel();
50 | }
51 |
52 | }
53 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/WakeUpUtil.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.app.KeyguardManager;
5 | import android.content.Context;
6 | import android.os.PowerManager;
7 | import com.android.commonlibrary.app.LibraryConfig;
8 | import static android.content.Context.KEYGUARD_SERVICE;
9 |
10 | /**
11 | * Title:
12 | * Description:
13 | *
14 | * Created by pei
15 | * Date: 2018/5/21
16 | */
17 | public class WakeUpUtil {
18 |
19 | /**
20 | * 唤醒手机屏幕并解锁
21 | */
22 | @SuppressLint("InvalidWakeLockTag")
23 | public static void wakeUpAndUnlock() {
24 | // 获取电源管理器对象
25 | PowerManager pm = (PowerManager) LibraryConfig.getInstance().getApplication().getSystemService(Context.POWER_SERVICE);
26 | boolean screenOn = pm.isScreenOn();
27 | if (!screenOn) {
28 | // 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag
29 | PowerManager.WakeLock wl = pm.newWakeLock(
30 | PowerManager.ACQUIRE_CAUSES_WAKEUP |
31 | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
32 | wl.acquire(10000); // 点亮屏幕
33 | wl.release(); // 释放
34 | }
35 | // 屏幕解锁
36 | KeyguardManager keyguardManager = (KeyguardManager)LibraryConfig.getInstance().getApplication()
37 | .getSystemService(KEYGUARD_SERVICE);
38 | KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("unLock");
39 | // 屏幕锁定
40 | keyguardLock.reenableKeyguard();
41 | keyguardLock.disableKeyguard(); // 解锁
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/encrypt/AES.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util.encrypt;
2 |
3 | /**
4 | * Title: AES加密解密基类
5 | *
6 | * description:
7 | * autor:pei
8 | * created on 2021/5/12
9 | */
10 | public class AES {
11 |
12 | /**字符集**/
13 | public static final String UTF_8 = "utf-8";
14 | public static final String GBK = "gbk";
15 |
16 | /**算法/模式/填充**/
17 | //16字节加密后数据长度变为16,不支持不满16字节的加密
18 | public static final String CBC_NOPADDING="AES/CBC/NoPadding";
19 |
20 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
21 | public static final String CBC_PKCS5PADDING="AES/CBC/PKCS5Padding";
22 |
23 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
24 | public static final String CBC_ISO10126PADDING="AES/CBC/ISO10126Padding";
25 |
26 | //16字节加密后数据长度变为16,不满16字节加密后长度为原始数据长度
27 | public static final String CFB_NOPADDING="AES/CFB/NoPadding";
28 |
29 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
30 | public static final String CFB_PKCS5PADDING="AES/CFB/PKCS5Padding";
31 |
32 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
33 | public static final String CFB_ISO10126PADDING="AES/CFB/ISO10126Padding";
34 |
35 | //16字节加密后数据长度变为16,不支持不满16字节的加密
36 | public static final String ECB_NOPADDING="AES/ECB/NoPadding";
37 |
38 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
39 | public static final String ECB_PKCS5PADDING="AES/ECB/PKCS5Padding";
40 |
41 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
42 | public static final String ECB_ISO10126PADDING="AES/ECB/ISO10126Padding";
43 |
44 | //16字节加密后数据长度变为16,不满16字节加密后长度为原始数据长度
45 | public static final String OFB_NOPADDING="AES/OFB/NoPadding";
46 |
47 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
48 | public static final String OFB_PKCS5PADDING="AES/OFB/PKCS5Padding";
49 |
50 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
51 | public static final String OFB_ISO10126PADDING="AES/OFB/ISO10126Padding";
52 |
53 | //16字节加密后数据长度变为16,不支持不满16字节的加密
54 | public static final String PCBC_NOPADDING="AES/PCBC/NoPadding";
55 |
56 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
57 | public static final String PCBC_PKCS5PADDING="AES/PCBC/PKCS5Padding";
58 |
59 | //16字节加密后数据长度变为32,不满16字节加密后长度为16字节
60 | public static final String PCBC_ISO10126PADDING="AES/PCBC/ISO10126Padding";
61 |
62 |
63 | /**采用AES加密算法**/
64 | protected static final String CIPHER_ALGORITHM = "AES";
65 |
66 | //私钥,AES固定格式为 128/192/256 bits.即:16/24/32 bytes
67 | protected String mKey = null; //密钥
68 | protected String mCharsetName = AES.UTF_8; //默认字符集为AES.UTF_8
69 |
70 |
71 | }
72 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/util/encrypt/MD5Util.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary.util.encrypt;
2 |
3 | import java.security.MessageDigest;
4 | import java.security.NoSuchAlgorithmException;
5 |
6 | /**
7 | * MD5加密,只能单向加密,不能解密
8 | *
9 | * @author pei
10 | * @create 2016-6-13
11 | *
12 | */
13 | public class MD5Util {
14 |
15 | /***
16 | * 加密成 32 位 MD5字符串
17 | *
18 | * @param str 要加密的字符串
19 | * @return
20 | */
21 | public static String getMD5(String str) {
22 | if(str!=null){
23 | return getMD5(str.getBytes());
24 | }
25 | return "";
26 | }
27 |
28 | /***
29 | * 加密成 32 位 MD5字符串
30 | * @param data 要加密的字节数组
31 | * @return
32 | */
33 | public static String getMD5(byte data[]){
34 | if(data!=null){
35 | try {
36 | MessageDigest md = MessageDigest.getInstance("MD5");
37 | md.update(data);
38 | return getString2(md.digest());
39 | } catch (NoSuchAlgorithmException e) {
40 | e.printStackTrace();
41 | }
42 | }
43 | return "";
44 | }
45 |
46 | private static String getString2(byte[] hash) {
47 | StringBuilder hex = new StringBuilder(hash.length * 2);
48 | for (byte b : hash) {
49 | if ((b & 0xFF) < 0x10) {
50 | hex.append("0");
51 | }
52 | hex.append(Integer.toHexString(b & 0xFF));
53 | }
54 | return hex.toString();
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_bottom_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_bottom_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_left_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_left_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_right_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_right_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_screen_bottom_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_screen_bottom_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_top_in.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/anim/popu_top_out.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
18 |
19 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/drawable/ic_clear_edit_delete.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaoqiangPei/AndroidLibrary/462c8be8d0acea940dcc0ba1c4273aaca333f75c/androidlibrary/commonlibrary/src/main/res/drawable/ic_clear_edit_delete.png
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/drawable/toast_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/layout/dialog_toast.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/layout/title_bar_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
27 |
28 |
40 |
41 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/mipmap-xhdpi/ic_left_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaoqiangPei/AndroidLibrary/462c8be8d0acea940dcc0ba1c4273aaca333f75c/androidlibrary/commonlibrary/src/main/res/mipmap-xhdpi/ic_left_back.png
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/mipmap-xhdpi/ic_right_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaoqiangPei/AndroidLibrary/462c8be8d0acea940dcc0ba1c4273aaca333f75c/androidlibrary/commonlibrary/src/main/res/mipmap-xhdpi/ic_right_back.png
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | CommonLibrary
3 | 侧滑菜单
4 |
5 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
12 |
13 |
17 |
18 |
22 |
23 |
27 |
28 |
32 |
33 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/main/res/xml/update_files.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/androidlibrary/commonlibrary/src/test/java/com/android/commonlibrary/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.android.commonlibrary;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/androidlibrary/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | android.enableJetifier=true
13 | android.useAndroidX=true
14 | org.gradle.jvmargs=-Xmx1536m
15 |
16 | # When configured, Gradle will run in incubating parallel mode.
17 | # This option should only be used with decoupled projects. More details, visit
18 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
19 | # org.gradle.parallel=true android.enableAapt2=false
20 |
--------------------------------------------------------------------------------
/androidlibrary/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShaoqiangPei/AndroidLibrary/462c8be8d0acea940dcc0ba1c4273aaca333f75c/androidlibrary/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/androidlibrary/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Jun 08 00:00:35 CST 2022
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/androidlibrary/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/androidlibrary/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':commonlibrary'
2 |
--------------------------------------------------------------------------------
/read/AdapterHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## AdapterHelper使用说明
2 |
3 | ### 概述
4 | AdapterHelper是一个Adapter的帮助类,里面集成一些adapter创建和使用时需要的方法。通过这个类,我们可以方便的使用adapter。
5 |
6 | ### 使用说明
7 | AdapterHelper这个类比较简单,下面就里面的方法做些简单的介绍。
8 | #### 1. AdapterHelper类初始化
9 | AdapterHelper是一个单例,初始化你可以这样:
10 | ```
11 | AdapterHelper adapter=AdapterHelper.getInstance();
12 | ```
13 | 一般我们都直接这样用:
14 | ```
15 | AdapterHelper.getInstance()
16 | ```
17 | #### 2. 根据布局id获取布局对象
18 | ```
19 | /**根据布局id获取布局对象**/
20 | public View getLayoutView(int layoutId, Context context)
21 | ```
22 | #### 3. 设置String值,obj一般是String或int
23 | ```
24 | /**设置String值**/
25 | public String getAdapterString(Object obj)
26 | ```
27 | #### 4. 设置线性RecyclerView
28 | ```
29 | /**设置线性RecyclerView**/
30 | public void setRecyclerLinearManager(RecyclerView.Adapter adapter, RecyclerView recyclerView, Context context)
31 | ```
32 | #### 5. 设置线性RecycleView间距,返回LinearDividerItemDecoration对象
33 | ```
34 | /**设置线性RecycleView间距**/
35 | public LinearDividerItemDecoration setLinearLayoutItemSpace(RecyclerView recyclerView, int dp, int colorId, Context context)
36 | ```
37 | #### 6. 设置九宫格RecyclerView
38 | ```
39 | /**设置九宫格RecyclerView**/
40 | public void setRecyclerGridManager(RecyclerView.Adapter adapter, RecyclerView recyclerView, int itemCount, Context context)
41 | ```
42 | #### 7. 设置九宫格间距,返回GridDividerItemDecoration对象
43 | ```
44 | /**设置九宫格间距**/
45 | public GridDividerItemDecoration setGridLayoutItemSpace(RecyclerView recyclerView, int dp, int colorId, Context context)
46 | ```
47 | #### 8. 移除RecycleView间距
48 | ```
49 | /**移除RecycleView间距**/
50 | public void removeItemSpace(RecyclerView recyclerView, RecyclerView.ItemDecoration divider)
51 | ```
52 | #### 9. 获取position,当添加有header或footer要注意改变
53 | ```
54 | /**获取position,当添加有header或footer要注意改变**/
55 | public int getPosition(BaseViewHolder viewHolder)
56 | ```
57 | #### 10. 添加控件监听
58 | ```
59 | /**
60 | * 添加控件监听
61 | **/
62 | public void addOnClickListener(OnItemClickListener listener, View view, final BaseViewHolder viewHolder, final Object obj)
63 | ```
64 | ### 11.滑动到指定位置(此position会列表置顶)
65 | ```
66 | /***
67 | * 滑动到指定位置(此position会列表置顶)
68 | * @param context
69 | * @param position
70 | */
71 | public void moveToPosition(RecyclerView recyclerView, int position, Context context)
72 | ```
73 | ### 12.adapter中设置item高度
74 | 当你的adaper为九宫格模式。要设置item的高度与宽度一样,形成方块造型的话,你可以在adapter中view初始化的时候,类似下面这样设置view高度:
75 | ```
76 | //在九宫格adapter初始化方法中设置item高度
77 | //此段代码仅作使用参考
78 | public void itemHeight() {
79 | //九宫格设置item高度[思路:(屏幕宽度-间隙*间隙个数)/item个数]
80 | int height = (ScreenUtil.getWidth() - ScreenUtil.dp2px(5, context)*2) / 3;
81 | ViewUtil.setViewHeight(height, view);
82 | }
83 | ```
84 |
--------------------------------------------------------------------------------
/read/AppActivityManager使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppActivityManager使用说明
2 |
3 | ### 说明
4 | AppActivityManager类提供对于整个app中Activity的管理,方便控制activity的打开和关闭流程。
5 |
6 | ### AppActivityManager的使用简介
7 | #### 1. 初始化
8 | AppActivityManager为单例类,其初始化如下:
9 | ```
10 | AppActivityManager appActivityManager=AppActivityManager.getInstance();
11 | ```
12 | #### 2. 添加Activity到堆栈
13 | ```
14 | addActivity(Activity activity)
15 | ```
16 | #### 3. 获取app中Activity打开数目,默认返回值为 0
17 | ```
18 | getActivitySize()
19 | ```
20 | #### 4. 获取当前Activity(堆栈中最后一个压入的),默认返回为 null
21 | ```
22 | getCurrentActivity()
23 | ```
24 | #### 5. 结束当前Activity(堆栈中最后一个压入的)
25 | ```
26 | finishActivity()
27 | ```
28 | #### 6. 结束指定的Activity
29 | ```
30 | finishActivity(Activity activity)
31 | ```
32 | #### 7. 结束指定类名的Activity
33 | ```
34 | finishActivity(Class> cls)
35 | ```
36 | #### 8. 结束指定类名以外的Activity
37 | ```
38 | finishOtherActivity(Class> cls)
39 | ```
40 | #### 9. 结束所有Activity
41 | ```
42 | finishAllActivity()
43 | ```
44 | #### 10. 退出应用程序
45 | ```
46 | appExit()
47 | ```
48 | #### 11. 判断当前activity是否存在
49 | ```
50 | isCurActivityExists(Class> cls)
51 | ```
52 | #### 12. 判断应用是否已经启动
53 | ```
54 | isAppAlive(Context context)
55 | ```
56 |
--------------------------------------------------------------------------------
/read/AppActivity使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppActivity使用说明
2 |
3 | ### 概述
4 | `AppActivity`作为`Activity`基类,具备以下功能:
5 | - Activity基础能力(`状态栏设置`,`控件初始化`,`非空判断`,`界面跳转传值`,`系统级dialog的创建`)
6 | - 加载Fragment能力
7 | - MVP架构(网络通讯能力)
8 |
9 | 你可以继承`AppActivity`快速创建自己的`Activity`.
10 |
11 | ### 使用说明
12 | #### 一.activity的继承
13 | 当你要新建一个activity(假设你新建的为TestActivity类),你只需要让TestActivity继承AppActivity并实现AppActivity的getContentViewId(),
14 | initData()和setListener()这三个方法即可.你新建的TestActivity可以类似这样创建:
15 | ```
16 | public class TestActivity extends AppActivity {
17 |
18 | @Override
19 | public int getContentViewId() {
20 | return R.layout.activity_test;//activity_test为TestActivity对应的xml文件
21 | }
22 |
23 | @Override
24 | public void initData() {
25 |
26 | }
27 |
28 | @Override
29 | public void setListener() {
30 |
31 | }
32 | }
33 | ```
34 | #### 二. activity的注册通用配置
35 | activity 在 Mainfast.xml 中注册的时候,通常会添加一些常用的配置属性.例如你的 TestActivity 在 Mainfast.xml 中注册的时候,可以这样配置:
36 | ```
37 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
52 |
53 |
54 | ```
55 | #### 三. 更多使用介绍
56 | [AppActivity基础能力](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/AppActivity%E5%9F%BA%E7%A1%80%E8%83%BD%E5%8A%9B%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md) ——— 处理`Activity`状态栏设置,控件初始化,非空判断,界面跳转传值,系统级dialog的创建
57 | [AppActivity加载Fragment能力](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/AppActivity%E5%8A%A0%E8%BD%BDFragment%E8%83%BD%E5%8A%9B%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md) ——— 处理`Activity`中含`Fragment`加载时的情况
58 | [AppActivity网络通讯能力](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/AppActivity%E7%BD%91%E7%BB%9C%E9%80%9A%E8%AE%AF%E8%83%BD%E5%8A%9B%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md) ——— 涉及到`网络通讯时`,迅速接入`mvp模式`
59 |
--------------------------------------------------------------------------------
/read/AppActivity网络通讯能力使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppActivity网络通讯能力使用说明
2 |
3 | ### 概述
4 | 主要讲述`Activity`基类 —— `AppActivity` 在需要进行`网络通讯`时,如何快速接入`MVP模式`,可以协助开发者快速实现`MVP`模式。
5 |
6 | ### 说明
7 | 当一个`Activity`不牵涉到网络通讯的时候,我们直接继承`AppActivity`写自己的`activity`并实现`AppActivity`的`getContentViewId()`, `initData()`和`setListener()`这三个方法即可,示例如下:
8 | ```
9 | public class TestActivity extends AppActivity {
10 |
11 | @Override
12 | public int getContentViewId() {
13 | return R.layout.activity_test;//activity_test为TestActivity对应的xml文件
14 | }
15 |
16 | @Override
17 | public void initData() {
18 |
19 | }
20 |
21 | @Override
22 | public void setListener() {
23 |
24 | }
25 | }
26 | ```
27 | 若涉及到`mvp架构`(即涉及到网络通讯会用到),那么你还要重写`AppActivity`的`getPresenter()`方法,示例如下:
28 | ```
29 | public class TestActivity extends AppActivity implements MainContract.View {
30 |
31 | @Override
32 | public int getContentViewId() {
33 | return R.layout.activity_temp;
34 | }
35 |
36 |
37 | @Override
38 | public PrePresenter getPresenter() {
39 | return new MainPresenter(mContext,this);
40 | }
41 |
42 | @Override
43 | public void initData() {
44 |
45 | }
46 |
47 |
48 | @Override
49 | public void setListener() {
50 |
51 | }
52 |
53 | @Override
54 | public void onClick(View v) {
55 | super.onClick(v);
56 |
57 | }
58 |
59 | //其他方法省略
60 | //......
61 | }
62 | ```
63 |
64 | 更多关于`MVP架构`网络通讯的使用,可参考
65 | [mvp-frame使用说明](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/mvp-frame%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
66 |
67 |
68 |
--------------------------------------------------------------------------------
/read/AppFragmentManager使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppFragmentManager使用说明
2 |
3 | ### 概述
4 | AppFragmentManager是一个处理 Fragment跳转,移除的管理类,可以方便的进行Activity与Fragment间的界面跳转,以及Fragment的关闭。其采取的Fragment管理方式为非回退栈,若想利用Fragment的回退栈来管理Fragment,可参考[FragmentStackManager](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/FragmentStackManager%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
5 |
6 | ### 使用说明
7 | #### 1. 初始化
8 | ```
9 | AppFragmentManager appFragmentManager=AppFragmentManager.getInstance();
10 | ```
11 | 一般我们都直接用:
12 | ```
13 | AppFragmentManager.getInstance();
14 | ```
15 | #### 2. 获取Fragment(启动的,未销毁的)个数(默认返回个数为0)
16 | ```
17 | int getFragmentSize()
18 | ```
19 | #### 3.打开一个Fragment,其他Fragment隐藏,返回Fragment对象
20 | 此方法使用到FragmentTransaction的show()和hide()方法,show()和hide()方法执行的时候不走Fragment的生命周期,使用时需要注意。
21 | ```
22 | /***
23 | * 打开一个Fragment,其他Fragment隐藏
24 | *
25 | * @param containerId 加载fragment的容器id
26 | * @param tag fragment对应的tag
27 | * @param bundle 传值
28 | * @param listener 若fragment为空则在这个listener中创建fragment
29 | * @return
30 | */
31 | Fragment startFragmentOtherHide(int containerId, Context context, String tag, Bundle bundle, OnCreateFragmentListener listener)
32 | ```
33 | #### 4.单纯的打开一个Fragment,返回Fragment对象
34 | 此方法遵循Fragment的生命周期
35 | ```
36 | /***
37 | * 单纯的打开一个Fragment
38 | *
39 | * @param containerId 加载fragment的容器id
40 | * @param tag fragment对应的tag
41 | * @param bundle 传值
42 | * @param listener 若fragment为空则在这个listener中创建fragment
43 | * @return
44 | */
45 | Fragment startFragment(int containerId, Context context, String tag, Bundle bundle, OnCreateFragmentListener listener)
46 | ```
47 | 如果你要打开一个Fragment,在Activity中你可以类似如下处理:
48 | ```
49 | //声明跳转Fragment的tag
50 | public static final String TAG_A="A";
51 | //声明Fragment对象
52 | private FragmentA mFragmentA;
53 |
54 | //跳转Fragment
55 | mFragmentA= (FragmentA) AppFragmentManager.getInstance().startFragment(R.id.fr_layout, mContext, TAG_A, null, new AppFragmentManager.OnCreateFragmentListener() {
56 | @Override
57 | public Fragment createFragment() {
58 | return new FragmentA();
59 | }
60 | });
61 | ```
62 | #### 5.根据tag关闭对应Fragment
63 | ```
64 | /**根据tag关闭对应Fragment**/
65 | public void finishFragmentByTag(String tag,Context context)
66 | ```
67 | #### 6.关闭所有fragment
68 | ```
69 | public void finishAllFrdagments(Context context)
70 | ```
71 |
72 |
--------------------------------------------------------------------------------
/read/AppFragment使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppFragment使用说明
2 |
3 | ### 概述
4 | `AppFragment`作为一个`Fragment`的父类,可以帮助开发者快速创建自己的`Fragment`,`AppFragment`继承自`SuperFragment`。
5 |
6 | ### 使用说明
7 | #### 一. 使用说明
8 | 要创建`Fragment`的话,需要继承`AppFragment`,更多使用介绍请参考:
9 | `AppFragment`基础能力参考: [SuperFragment](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/SuperFragment%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
10 | `AppFragment`网络通讯能力参考: [mvp-frame使用说明](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/mvp-frame%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
11 |
12 |
--------------------------------------------------------------------------------
/read/AppHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppHelper使用说明
2 |
3 | ### 说明
4 | AppHelper作为Activity基类的一个辅助类,提供必要的基本方法,包括控件值的获取,非空判断,吐司显示,沉浸式状态栏和控件初始化等方法
5 |
6 | ### AppHelper使用介绍
7 | #### 1. 设置状态栏透明,状态栏文字变黑
8 | 更多状态栏设置请参考util工具包中的 StatusBarUtil 类
9 | ```
10 | setStatusBar(Context context)
11 | ```
12 | #### 2. 获取控件值
13 | ```
14 | getTextOfView(TextView textView)
15 | ```
16 | #### 3. 获取非空字符串,默认返回 ""
17 | ```
18 | getNotEmptyString(String str)
19 | ```
20 | #### 4. 长吐司
21 | ```
22 | showToast(String msg)
23 | ```
24 | #### 5. 短吐司
25 | ```
26 | showShortToast(String msg)
27 | ```
28 | #### 6. 用于初始化控件的
29 | obj 为AppCompatActivity或ViewGroup或View的实例,rId 控件id
30 | ```
31 | /***
32 | * 用于初始化控件的
33 | * @param obj 为AppCompatActivity或ViewGroup或View的实例
34 | * @param rId 控件id
35 | * @return
36 | */
37 | public T getView(Object obj,int rId)
38 | ```
39 | #### 7. 将字符串的id转成int类型(控件初始化)
40 | ```
41 | /**
42 | * 通过字符串"R.id.btn"获取控件对象
43 | * @param rId
44 | * @param idType
45 | * @param activity
46 | * eg : Button btn=getView("R.id.btn","id",context);
47 | *
48 | * 若获取图片id,你也可以这样:
49 | * int drawableId=activity.getResources().getIdentifier("R.drawable.ic_launch", "drawable", ctx.getPackageName());
50 | *
51 | * @return
52 | */
53 | public View getView(String rId,String idType,AppCompatActivity activity){
54 | ```
55 | 当你要将一个字符串类型的控件id,转成可用于初始化的int类型的id的时候,你可以这样:
56 | ```
57 | int rId=activity.getResources().getIdentifier("R.id.btn", "id", ctx.getPackageName());
58 | ```
59 | 当你要将一个字符串类型的drawable id,转成可用于初始化的int类型的drawable id的时候,你可以这样:
60 | ```
61 | int drawableId=activity.getResources().getIdentifier("R.drawable.ic_launch", "drawable", ctx.getPackageName());
62 | ```
63 |
--------------------------------------------------------------------------------
/read/AppInstallReceiver使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppInstallReceiver使用说明
2 |
3 | ### 概述
4 | AppInstallReceiver 是一个监听 app 安装完成,替换完成,和 卸载完成的广播。主要用于对一个app的安装,替换,卸载 做监听。
5 |
6 | ### 使用说明
7 | #### 1. 基本使用
8 | 需要在项目的 mainfast 文件中静态注册此Receiver,示例代码如下:
9 | ```
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | ```
20 | 需要注意:
21 | ```
22 | 1. XXXReceiver 为你项目中的监听程序安装,替换和卸载的广告播类名,XXXReceiver需要继承AppInstallReceiver
23 | 2. 当App的versionCode不同的时候,在安装时才会触发替换等广播
24 | 3. 如无特别要求,你项目中的XXXReceiver只需要继承AppInstallReceiver,然后实现install,uninstall和replace即可.
25 | 如有更多要求,则需要重写AppInstallReceiver的onReceive方法,然后在mainfast中注册的时候,添加必要的action
26 | ```
27 | 相关解释:
28 | ```
29 | ACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)
30 | ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本
31 | ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包名
32 | ACTION_PACKAGE_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)
33 | ACTION_PACKAGE_RESTARTED 用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,
34 | 包括包名(重新开始包程序不能接收到这个广播)
35 | ACTION_PACKAGE_DATA_CLEARED 用户已经清楚一个包的数据,包括包名(清除包程序不能接收到这个广播)
36 | ```
37 | #### 2. 使用示例
38 | ```
39 | public class MyReceiver extends AppInstallReceiver{
40 |
41 | @Override
42 | protected void install(Context context, Intent intent) {
43 | LogUtil.i("========安装========");
44 | }
45 |
46 | @Override
47 | protected void uninstall(Context context, Intent intent) {
48 | LogUtil.i("========卸载========");
49 | }
50 |
51 | @Override
52 | protected void replace(Context context, Intent intent) {
53 | LogUtil.i("========替换========");
54 | }
55 | }
56 | ```
57 |
--------------------------------------------------------------------------------
/read/AppLocalReceiver使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppLocalReceiver使用说明
2 | ### 概述
3 | AppLocalReceiver是一个本地广播工具类,是对LocalBroadcastManager功能的一个封装使用类。AppLocalReceiver本质是一个BroadCast,
4 | 它的出现是为了让 动态注册本地广播 流程变得简洁。开发者无需再去关注广播的注册,使用,注销细节,这些统统被封装到AppLocalReceiver的方法中。AppLocalReceiver
5 | 由于是本地广播,故比全局广播更具安全性,适合仅需在本app内部传递广播消息的场景。
6 |
7 | ### 使用说明
8 | #### 一.AppLocalReceiver基本方法
9 | ```
10 | //构造方法<在非注册Receiver界面给注册Receiver界面发送广播时调用,用于创建广播对象。>
11 | AppLocalReceiver()
12 |
13 | //构造该方法<创建广播接收器对象,并动态注册广播>
14 | AppLocalReceiver(Context context, String activityName)
15 |
16 | /**设置监听**/
17 | setOnReceiverListener(OnReceiverListener listener)
18 |
19 | /**发送广播**/
20 | sendToBroadcast(Context context,String sendToActivityName, Bundle bundle)
21 |
22 | /**注销广播**/
23 | onDestroy()
24 | ```
25 | #### 二.AppLocalReceiver的使用
26 | 以在MainActivity中使用为例,你需要对AppLocalReceiver声明:
27 | ```
28 | //声明对象
29 | private AppLocalReceiver mAppLocalReceiver;
30 | ```
31 | 然后初始化兼注册本地广播:
32 | ```
33 | //初始化并注册本地广播
34 | mAppLocalReceiver=new AppLocalReceiver(MainActivity.this,MainActivity.class.getName());
35 | ```
36 | 设置广播监听:
37 | ```
38 | //设置本地广播监听
39 | mAppLocalReceiver.setOnReceiverListener(new AppLocalReceiver.OnReceiverListener() {
40 | @Override
41 | public void receiver(String action, Bundle bundle) {
42 | //接收逻辑处理
43 | //......
44 |
45 | }
46 | });
47 | ```
48 | 在MainActivity界面销毁时,注销本地广播:
49 | ```
50 | //销毁本地广播
51 | mAppLocalReceiver.onDestroy();
52 | LogUtil.i("===注销本地广播===");
53 | ```
54 | 若你需要在MainActivity中发送广播,你可以像下面这样:
55 | ```
56 | //发送广播
57 | Bundle bundle=new Bundle();
58 | bundle.putInt("code",0);
59 | bundle.putString("pp","测试");
60 | mAppLocalReceiver.sendToBroadcast(MainActivity.this,MainActivity.class.getName(),bundle);
61 | ```
62 | 若你不在MainActivity界面发送广播,而是在另一个界面(如 ActivityB界面),即你要在ActivityB界面向MainActivity界面发送本地广播,那么在ActivityB界面你可以像下面这样发送广播:
63 | ```
64 | //发送广播
65 | AppLocalReceiver receiver=new AppLocalReceiver();
66 | Bundle bundle=new Bundle();
67 | bundle.putInt("code",1);
68 | bundle.putString("pp","测试B");
69 | receiver.sendToBroadcast(ActivityB.this,MainActivity.class.getName(),bundle);
70 | ```
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/read/AppReceiver使用说明.md:
--------------------------------------------------------------------------------
1 | ## AppReceiver使用说明
2 | ### 概述
3 | AppReceiver本质是一个BroadcastReceiver,是一个基于BroadcastReceiver的封装类。它的出现是为了让手动注册广播的使用更加方便快捷。使注册和使用广播时不再繁琐。作为一个全局广播工具类,适合涉及监听本app广播,也有监听其他app广播需求的场景使用。
4 |
5 | ### 使用说明
6 | #### 一. 基本方法介绍
7 | AppReceiver作为 BroadcastReceiver的封装类,具备以下方法:
8 | ```
9 | //构造方法1
10 | AppReceiver()
11 |
12 | //构造方法2
13 | AppReceiver(Context context,String activityName)
14 |
15 | //设置监听,广播接收在此处理
16 | setOnReceiverListener(OnReceiverListener listener)
17 |
18 | //发送广播
19 | sendToBroadcast(Context ctx, String sendToActivityName, Bundle bundle)
20 |
21 | //注销广播
22 | onDestroy()
23 | ```
24 | #### 二. 基本使用介绍
25 | 以MainActivity为例,当我们要在MainActivity中注册一个广播监听的时候,我们可以这样:
26 | ```
27 | //声明广播对象
28 | private AppReceiver mAppReceiver;
29 |
30 | //初始化(含注册广播逻辑)mAppReceiver对象
31 | mAppReceiver=new AppReceiver(MainActivity.this,MainActivity.class.getName());
32 |
33 | //接收广播
34 | mAppReceiver.setOnReceiverListener(new AppReceiver.OnReceiverListener() {
35 | @Override
36 | public void receiver(String action, Bundle b) {
37 | //接收数据,并做相关逻辑处理
38 | //......
39 | }
40 | });
41 |
42 |
43 | //在MainActivity销毁时,注销广播
44 | mAppReceiver.onDestroy();
45 | ```
46 | 若要在MainActivity中发起广播,你可以像下面这样:
47 | ```
48 | //发送广播
49 | Bundle bundle=new Bundle();
50 | bundle.putInt("code",0);
51 | bundle.putString("key","我是MainActivity自己发送的值");
52 | mAppReceiver.sendToBroadcast(MainActivity.this,MainActivity.class.getName(),bundle);
53 | ```
54 | 若你要在其他界面,如 ActivityB 界面给 MainActivity 发送广播,你可以在ActivityB 中像下面这样给MainActivity发送广播:
55 | ```
56 | //发送广播
57 | AppReceiver receiver=new AppReceiver();
58 | Bundle bundle=new Bundle();
59 | bundle.putInt("code",1);
60 | bundle.putString("key","我是B发过来的值");
61 | receiver.sendToBroadcast(this,MainActivity.class.getName(),bundle);
62 | ```
63 |
--------------------------------------------------------------------------------
/read/BaseEntity使用说明.md:
--------------------------------------------------------------------------------
1 | ### BaseEntity使用说明
2 |
3 | BaseEntity 作为一个可序列化对象的基类,其实现了Parcelable,Serializable接口,当你需要建一个可序列化对象的时候,你的对象类去继承BaseEntity类是一个比较快捷的办法。
4 |
5 | #### 继承BaseEntity,使对象类具备看序列化属性的范例
6 | 假如你有一个Person类,希望这个类具备可序列化属性,你可以像下面这样来写你这个Person类:
7 |
8 | ```
9 | package com.androidlibrary;
10 |
11 | import com.android.commonlibrary.entity.BaseEntity;
12 |
13 | /**
14 | * Description:可序列化对象示例
15 | *
16 | * Author:pei
17 | * Date: 2019/7/2
18 | */
19 | public class Person extends BaseEntity {
20 |
21 | private String name;
22 | private int age;
23 |
24 | public String getName() {
25 | return name;
26 | }
27 |
28 | public void setName(String name) {
29 | this.name = name;
30 | }
31 |
32 | public int getAge() {
33 | return age;
34 | }
35 |
36 | public void setAge(int age) {
37 | this.age = age;
38 | }
39 |
40 | @Override
41 | public String toString() {
42 | return "Person{" +
43 | "name='" + name + '\'' +
44 | ", age=" + age +
45 | '}';
46 | }
47 | }
48 |
49 | ```
50 |
--------------------------------------------------------------------------------
/read/ByteStreamUtil使用说明.md:
--------------------------------------------------------------------------------
1 | ## ByteStreamUtil使用说明
2 |
3 | ### 概述
4 | `ByteStreamUtil`是一个用于处理文本类型的`IO流`工具类,主要包含文本类文件的`读`,`写`和`复制`功能。以字节流的方式实现。
5 |
6 | ### 使用说明
7 | #### 一. 前置
8 | 在使用`ByteStreamUtil`工具之前,你先要给自己的项目添加各种文件读写权限,包括在`Androidmanifast.xml`中添加读写权限,添加`FileProvider`文件读写权限,
9 | 然后在你项目中添加`Android 6.0+`手动授权库权限.
10 | #### 二. ByteStreamUtil主要方法
11 | `ByteStreamUtil`具有以下几个重要方法:
12 | ```
13 | /**
14 | * 字节流读文件
15 | * @param filePath 文件路径
16 | * @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
17 | * 此参数为null时,返回编译器默认编码格式
18 | * @return 读出的文件内容
19 | */
20 | public static String readFile(String filePath,String charsetName)
21 |
22 | /***
23 | * 字节流写文件
24 | * @param message 要写入的内容
25 | * @param filePath 要写入的文件路径,若文件不存在,会自行创建
26 | * @param append true:表示在文件中追加内容, false:表示在文件中写新内容,覆盖以前内容
27 | *
28 | * @return true:写文件成功 false:写文件失败
29 | */
30 | public static boolean writeFile(String message,String filePath,boolean append)
31 |
32 | /**
33 | * 字节流复制文件
34 | *
35 | * @param readFilePath 要复制的文件路径
36 | * @param writeFilePath 新生成的文件路径
37 | * @return true:复制成功 false:复制失败
38 | */
39 | public static boolean copyFile(String readFilePath,String writeFilePath)
40 | ```
41 | #### 三. 注意项
42 | - 对于文件读的方法,若读出的内容出现乱码,可以考虑在读文件时,更换字符编码集,常用的字符编码集有: `StreamUtil.UTF_8`和`StreamUtil.GBK`
43 | - 对于文件写的方法,我们有注意最后一个参数是一个boolean值,当为true时,表示给文件里面追加内容,当为false时,表示重写文件,即写的内容会完全覆盖原文件中的所有内容,这是需要注意的点。
44 |
45 |
46 |
--------------------------------------------------------------------------------
/read/Cache使用说明.md:
--------------------------------------------------------------------------------
1 | ## Cache使用说明
2 |
3 | ### 特性
4 | cache 类是一个利用Lru,即使用时间最短,利用频率越低则会在一定时间类移除的算法做的 app缓存,集成app内存缓存与app硬盘缓存与一体,适用于减少通讯需要暂时性缓存的情况。
5 |
6 | ### 使用介绍
7 | #### 1. 存储String
8 | ```
9 | Cache.getInstance().putString(String key, String value);
10 | ```
11 | #### 2. 获取String,默认取值为 null
12 | ```
13 | Cache.getInstance().getString(String key);
14 | ```
15 | #### 3. 存储int
16 | ```
17 | Cache.getInstance().putInt(String key, int value);
18 | ```
19 | #### 4. 获取int,默认取值为 0
20 | ```
21 | Cache.getInstance().getInt(String key);
22 | ```
23 | #### 5. 存储float
24 | ```
25 | Cache.getInstance().putFloat(String key, float value);
26 | ```
27 | #### 6. 获取float,默认取值为 0f
28 | ```
29 | Cache.getInstance().getFloat(String key);
30 | ```
31 | #### 7. 存储double
32 | ```
33 | Cache.getInstance().putDouble(String key, double value);
34 | ```
35 | #### 8. 获取double,默认取值为 0d
36 | ```
37 | Cache.getInstance().getDouble(String key);
38 | ```
39 | #### 9. 存储long
40 | ```
41 | Cache.getInstance().putLong(String key, Long value);
42 | ```
43 | #### 10. 获取long,默认取值为 0L
44 | ```
45 | Cache.getInstance().getLong(String key);
46 | ```
47 | #### 11. 存储boolean
48 | ```
49 | Cache.getInstance().putBoolean(String key, boolean value);
50 | ```
51 | #### 12. 获取boolean,默认取值为 false
52 | ```
53 | Cache.getInstance().getBoolean(String key);
54 | ```
55 | #### 13. 存储可序列化obj
56 | obj需要实现Serializable 或 Parcelable
57 | ```
58 | Cache.getInstance().putObject(String key, Object obj);
59 | ```
60 | #### 14. 获取可序列化obj,默认取值为 null
61 | obj需要实现Serializable 或 Parcelable
62 | ```
63 | Cache.getInstance().getObject(String key, Class cls);
64 | ```
65 | #### 15. 存储List集合
66 | 当list中装的是对象的时候,对象需要实现Serializable 或 Parcelable接口
67 | ```
68 | Cache.getInstance().putList(String key, List list);
69 | ```
70 | #### 16. 获取List集合
71 | 当list中装的是对象的时候,对象需要实现Serializable 或 Parcelable接口,默认获取一个空集合(list!=null&&List.size=0)
72 | ```
73 | Cache.getInstance().getList(String key, Class cls);
74 | ```
75 | #### 17. 存储Map
76 | 此处map只接受Mapmap类型,若要存储可序列化对象,可以考虑将对象用gson转化成String,然后存储
77 | ```
78 | Cache.getInstance().putMap(String key, Map map);
79 | ```
80 | #### 18. 获取Map,默认取值为 null
81 | 若map中存储的是经过gson转化成的字符串对象,则需要通过gson将map中的value转化成对应的对象
82 | ```
83 | Cache.getInstance().getMap(String key);
84 | ```
85 | #### 19. 根据key移除对应的缓存值
86 | ```
87 | Cache.getInstance().remove(String key);
88 | ```
89 | #### 20. 清理缓存中所有值
90 | ```
91 | Cache.getInstance().clear();
92 | ```
93 | #### 21. 关闭缓存
94 | app退出的时候调用,关闭缓存的时候会清空缓存中所有值
95 | ```
96 | //app退出时关闭缓存流
97 | Cache.getInstance().closeCache();
98 | ```
99 |
--------------------------------------------------------------------------------
/read/CharStreamUtil使用说明.md:
--------------------------------------------------------------------------------
1 | ## CharStreamUtil使用说明
2 |
3 | ### 概述
4 | `CharStreamUtil`是一个用于处理文本类型的`IO流`工具类,主要包含文本类文件的`读`,`写`和`复制`功能。以字符流的方式实现。
5 |
6 | ### 使用说明
7 | #### 一.前置
8 | 在使用`CharStreamUtil`工具之前,你先要给自己的项目添加各种文件读写权限,包括在`Androidmanifast.xml`中添加读写权限,添加`FileProvider`文件读写权限,
9 | 然后在你项目中添加`Android 6.0+`手动授权库权限.
10 | #### 二.CharStreamUtil主要方法
11 | `CharStreamUtil`具有以下几个重要方法:
12 | ```
13 | /***
14 | * 字节流转字符流读文件
15 | *
16 | * @param filePath 文件路径
17 | * @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
18 | * 此参数为null时,返回编译器默认编码格式
19 | * @return 读取的文件内容
20 | */
21 | public static String readFileChange(String filePath,String charsetName)
22 |
23 | /***
24 | * 字节流转字符流写文件
25 | * @param message 要写入的内容
26 | * @param filePath 要写入的文件路径,若文件不存在,会自行创建
27 | * @param append true:表示在文件中追加内容, false:表示在文件中写新内容,覆盖以前内容
28 | *
29 | * @return true:写文件成功 false:写文件失败
30 | */
31 | public static boolean writeFileChange(String message,String filePath,boolean append)
32 |
33 | /**
34 | * 字符流读文件
35 | *
36 | * @param filePath 文件路径
37 | * @return 读取的文件内容
38 | */
39 | public static String readFile(String filePath)
40 |
41 | /***
42 | * 字符流写文件
43 | * @param message 要写入的内容
44 | * @param filePath 要写入的文件路径,若文件不存在,会自行创建
45 | * @param append true:表示在文件中追加内容, false:表示在文件中写新内容,覆盖以前内容
46 | *
47 | * @return true:写文件成功 false:写文件失败
48 | */
49 | public static boolean writeFile(String message,String filePath,boolean append)
50 |
51 | /**
52 | * 字符流复制文件
53 | *
54 | * @param readFilePath 要复制的文件路径
55 | * @param writeFilePath 新生成的文件路径
56 | * @return true:复制成功 false:复制失败
57 | */
58 | public static boolean copyFile(String readFilePath,String writeFilePath)
59 | ```
60 | #### 三. 注意项
61 | - 对于文件读的方法,若读出的内容出现乱码,可以考虑在读文件时,更换字符编码集,常用的字符编码集有: StreamUtil.UTF_8和StreamUtil.GBK
62 | - 对于文件写的方法,我们有注意最后一个参数是一个boolean值,当为true时,表示给文件里面追加内容,当为false时,表示重写文件,
63 | 即写的内容会完全覆盖原文件中的所有内容,这是需要注意的点。
64 |
65 |
66 |
--------------------------------------------------------------------------------
/read/Clipboard使用说明.md:
--------------------------------------------------------------------------------
1 | ## Clipboard使用说明
2 |
3 | ### 概述
4 | Clipboard作为一个剪切板工具类,具备监听本app界面中复制/剪切/粘贴 操作 的功能,同时还能监听其他app复制的内容,然后打开本app也能获取到
5 | (即在当前app读取剪切板内容的功能)。下面对 Clipboard 的使用做一个说明。
6 |
7 | ### 使用说明
8 | #### 一.对象初始化
9 | Clipboard作为剪切板监听帮助类,初始化ClipboardHelper对象的话,你可以这样:
10 | ```
11 | Clipboard clipboard=new Clipboard();
12 | ```
13 | #### 二.监听本app的 复制/剪切/粘贴 操作
14 | 监听本app的 “复制/剪切/粘贴”动作时,涉及到注册注销的问题。
15 | ##### 2.1 注册监听
16 | 若在MainActivity中,你需要监听剪切板操作的时候,你可以像下面这样:
17 | ```
18 | //注册并监听剪切板操作
19 | clipboard.registerClipEvents(MainActivity.this,new Clipboard.OnClipboardListener() {
20 | @Override
21 | public void clipboard(String content) {
22 | LogUtil.i("==========监听剪切内容======="+content);
23 |
24 |
25 | }
26 | });
27 | ```
28 | registerClipEvents(Context context,OnClipboardListener listener) 此方法用于监听本app中复制,剪切,粘贴动作。
29 | ##### 2.2 注销监听
30 | 注销基于本app的监听,你可以像下面这样处理:
31 | ```
32 | //注销剪切板事件
33 | clipboard.unRegisterClipEvents();
34 | ```
35 | #### 三.监听其他app的 复制/剪切/粘贴 过来的内容(即获取剪切板内容)
36 | ##### 3.1 适用场景
37 | 当你需要用户在其他app中复制了一个链接,然后进入 本app时,立马打开与该链接对应的活动的时候,可以使用本方法实现。
38 | ##### 3.2 获取剪切板内容
39 | 若你要在你的app中获取剪切板内容,你可以像下面这样:
40 | ```
41 | @Override
42 | protected void onResume() {
43 | super.onResume();
44 |
45 | //获取剪切板内容
46 | clipboard.getClipboardContent(MainActivity.this, new Clipboard.OnClipboardListener() {
47 | @Override
48 | public void clipboard(String content) {
49 |
50 | }
51 | });
52 | }
53 | ```
54 | ##### 3.3 需要注意的问题
55 | 由于 clipboard.getClipboardContent 方法想要实现的效果是:用户一打开本app就获取剪切板的内容,所以你最后将获取剪切板
56 | 内容的这段代码放到activity生命周期的 onResume() 方法中,以达到一旦app回到前台,就能读取到剪切板内容。
57 |
58 | #### 四.复制口令
59 | ##### 4.1 使用场景
60 | 当你在你app中点击button,需要将某一数值复制到剪切板上(类似你选中你app中某值,然后复制的操作),你可以考虑使用复制口令的方法。
61 | ##### 4.2 复制口令的方法
62 | 例如需要将"大家后"复制到粘贴板上,你可以这样:
63 | ```
64 | clipboard.setClipboardContent(MainActivity.this,"大家好");
65 | ```
66 |
67 | #### 五. 其他方法
68 | 除此之外,Clipboard还提供了一个设置本app中TextView内容可直接复制的设置方法。因为一般写的app中,如无特殊需求,TextView显示的内容都是禁止复制的。
69 | 设置TextView内容可复制方法如下:
70 | ```
71 | /**设置textView可被复制,剪切和粘贴**/
72 | canBePasted(TextView textView)
73 | ```
74 |
--------------------------------------------------------------------------------
/read/ComAdapter使用说明.md:
--------------------------------------------------------------------------------
1 | ## ComAdapter使用说明
2 |
3 | ### 概述
4 | ComAdapter是一个通用适配器基类,里面集成了adapter创建需要的一些基本方法,包括控件初始化,获取布局对象,加载动画,列表数据加载,控件点击事件监听等方法(具体可参见代码)。
5 | 当你要实现一个线性列表,需要创建adapter的时候,继承ComAdapter可以帮你快速实现自己的adapter。
6 |
7 | ### 使用说明
8 | #### 一. 继承ComAdapter,写自己的Adapter
9 | 当RecyclerView加载列表的时候,需要一个适配器(NameAdapter),你可以像这样快速来创建它:
10 | ```
11 | public class NameAdapterextends ComAdapter {
12 |
13 | private TextView mTvName;
14 |
15 | public NameAdapter(List data, Context context) {
16 | //加载布局和数据
17 | super(R.layout.item_layout, data, context);
18 | }
19 |
20 | @Override
21 | public void initView(BaseViewHolder viewHolder, T obj) {
22 | //控件初始化
23 | mTvName=viewHolder.getView(R.id.tv);
24 | }
25 |
26 | @Override
27 | public void initData(BaseViewHolder viewHolder, T obj) {
28 | String name=obj.toString();
29 | mTvName.setText(name);
30 | }
31 |
32 | @Override
33 | public void setListener(BaseViewHolder viewHolder, T obj) {
34 | //添加控件监听
35 | addOnClickListener(mTvName,viewHolder,obj);
36 | }
37 |
38 | }
39 | ```
40 | #### 二. 在mainActivity中调用
41 | ##### 2.1 线性布局调用
42 | ```
43 | mNames=new ArrayList<>();
44 | //for (int i = 0; i < 10; i++) {
45 | // mNames.add("小黄"+i);
46 | //}
47 | mNameAdapter=new NameAdapter<>(mNames,MainActivity.this);
48 | mNameAdapter.setRecyclerLinearManager(mRecyclerView);
49 | ```
50 | ##### 2.2 九宫格布局调用
51 | ```
52 | mNames=new ArrayList<>();
53 | //for (int i = 0; i < 10; i++) {
54 | // mNames.add("小黄"+i);
55 | //}
56 | mNameAdapter=new NameAdapter<>(mNames,MainActivity.this);
57 | mNameAdapter.setRecyclerGridManager(mRecyclerView,4);
58 | ```
59 | #### 三. 设置分割线,返回RecyclerView.ItemDecoration对象
60 | ```
61 | //设置线性布局分割线
62 | LinearDividerItemDecoration linearDivider=mNameAdapter.setLinearLayoutItemSpace(mRecyclerView,5,R.color.colorAccent);
63 | //设置九宫格局分割线
64 | GridDividerItemDecoration gridDivider=mNameAdapter.setGridLayoutItemSpace(mRecyclerView,5,R.color.colorAccent);
65 | ```
66 | #### 四. 移除分割线
67 | ```
68 | /**移除RecycleView间距**/
69 | removeItemSpace(RecyclerView recyclerView, RecyclerView.ItemDecoration divider)
70 | ```
71 | #### 五.点击事件
72 | ```
73 | //点击事件
74 | mNameAdapter.setOnItemClickListener(new AdapterHelper.OnItemClickListener() {
75 | @Override
76 | public void itemClickListener(View view, BaseViewHolder viewHolder, Object obj) {
77 | switch (view.getId()) {
78 | case R.id.tv:
79 | ToastUtil.shortShow("====1====="+obj.toString());
80 | break;
81 | default:
82 | break;
83 | }
84 | }
85 | });
86 | ```
87 |
--------------------------------------------------------------------------------
/read/CompareSortor使用说明.md:
--------------------------------------------------------------------------------
1 | ## CompareSortor使用说明
2 |
3 | ### 概述
4 | CompareSortor是一个排列集合类,主要用于集合的升序,降序排列。针对int类型的List集合,数字字符串的集合,以及包含int属性或数字字符串属性的对象类结合List
5 | 的排列。
6 |
7 | ### 使用说明
8 | #### 1. CompareSortor对数字排序
9 | 代码如下:
10 | ```
11 | Listlistk=new ArrayList<>();
12 | listk.add(1);
13 | listk.add(9);
14 | listk.add(3);
15 | listk.add(7);
16 | ListfList=CompareSortor.getInstance().sortList(listk);
17 | LogUtil.e(MainActivity.class,"=====fList====="+fList.toString());
18 | ```
19 | 打印结果:
20 | ```
21 | MainActivity:=====fList=====[1, 3, 7, 9]
22 | ```
23 | #### 2. CompareSortor对对像按其属性中数字大小排序
24 | 这里需要注意的是,用于对比的对象里面的属性要写 Setter/Getter 方法,若没有会导致排序异常。
25 | 下面是对Student以age排序(注:age需要是数字,即int,float,double,long类型)
26 | ```
27 | Student stu1=new Student("c",12);
28 | Student stu2=new Student("a",17);
29 | Student stu3=new Student("d",10);
30 | Student stu4=new Student("b",15);
31 |
32 | Listlist=new ArrayList<>();
33 | list.add(stu1);
34 | list.add(stu2);
35 | list.add(stu3);
36 | list.add(stu4);
37 |
38 | //ListstudentList=CompareSortor.getInstance().sortList(list,"age");
39 | ListstudentList=CompareSortor.getInstance().reverseList(list,"age");
40 | for(Student s:studentList){
41 | LogUtil.e(MainActivity.class,"=========s="+s.toString());
42 | }
43 | ```
44 | 打印结果:
45 | ```
46 | MainActivity:=========s=age=17 name=a
47 | MainActivity:=========s=age=15 name=b
48 | MainActivity:=========s=age=12 name=c
49 | MainActivity:=========s=age=10 name=d
50 | ```
51 | CompareSortor.getInstance().sortList(list,"age");方法中list表示要排序的集合,age表示list中对象是以age属性进行排列的。
52 |
53 | 当然,仅这些远远不足以满足我们的开发需求,于是有一个自定义比较方法
54 | #### 3.CompareSortor自定义排序方法
55 | ```
56 | ListstudentList=CompareSortor.getInstance().customList(list, new Comparator() {
57 | @Override
58 | public int compare(Object obj1, Object obj2) {
59 | //写自己的排序规则
60 | //...
61 | return 0;
62 | }
63 | });
64 | ```
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/read/EditTextChangeListener使用说明.md:
--------------------------------------------------------------------------------
1 | ## EditTextChangeListener使用说明
2 |
3 | ### 概述
4 | `EditTextChangeListener`主要用于监听`EditText`的实时输入结果,若有相关需求,可用此类快捷处理。
5 |
6 | ### 使用说明
7 | 你可以像下面这样监听输入框的实时输入结果:
8 | ```
9 | /**设置监听**/
10 | private void setListener(){
11 | //输入监听
12 | mEditText.addTextChangedListener(new EditTextChangeListener() {
13 | @Override
14 | public void afterTextChanged(Editable editable) {
15 | //注:editable就是 mEditText.getText() 的值
16 | //Editable是个接口,而且内容是可以改变的,但string类型的content是不能改变的
17 | //所以获取 输入框的值可以这样:String value=editable.toString();
18 |
19 | LogUtil.i("======editable=="+editable.toString());
20 | }
21 | });
22 | }
23 | ```
24 | 这里需要注意的是`editable`就是`mEditText.getText()`的值。要获取输入框的结果,可以这样:
25 | ```
26 | String value=editable.toString();
27 | ```
28 |
--------------------------------------------------------------------------------
/read/EmotionView使用说明.md:
--------------------------------------------------------------------------------
1 | ## EmotionView使用说明
2 |
3 | ### 概述
4 | `EmotionView`是一个自定义实现表情雨效果的控件。
5 | 使用效果详见 [Android实现表情雨效果](https://www.jianshu.com/p/dec57327ecef)
6 |
7 | ### 使用说明
8 | #### 一.布局及初始化
9 | 在`xml`文件中引用控件:
10 | ```
11 |
20 | ```
21 | 在`activity`中声明及初始化:
22 | ```
23 | //声明控件
24 | private EmotionView mEmotionView;
25 |
26 | //初始化
27 | mEmotionView=findViewById(R.id.emotion);
28 | ```
29 | #### 二.使用及监听
30 | 开启动画效果并监听,你可以这样:
31 | ```
32 | //设置图片组并开始表情雨
33 | mEmotionView.setDuration(1000)//设置下落时间2秒
34 | .startRain(getBitmaps(), new EmotionView.OnRainListener() {
35 | @Override
36 | public void start() {
37 | ToastUtil.shortShow("我是开始");
38 |
39 | }
40 |
41 | @Override
42 | public void stop() {
43 | ToastUtil.shortShow("我是结束");
44 |
45 | }
46 | });
47 | ```
48 | `getBitmaps()`返回的是一个bitmap集合,涉及相关代码如下:
49 | ```
50 | private List getBitmaps(){
51 | Listlist=new ArrayList<>();
52 | Drawable drawable=ContextCompat.getDrawable(MainActivity.this, R.mipmap.ic_launcher);
53 | Bitmap bitmap= drawableToBitmap(drawable);
54 | list.add(bitmap);
55 | list.add(bitmap);
56 | list.add(bitmap);
57 | list.add(bitmap);
58 | return list;
59 | }
60 |
61 | /**
62 | * Drawable转换成一个Bitmap
63 | *
64 | * @param drawable drawable对象
65 | * @return
66 | */
67 | private Bitmap drawableToBitmap(Drawable drawable) {
68 | Bitmap bitmap = Bitmap.createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
69 | drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
70 | Canvas canvas = new Canvas(bitmap);
71 | drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
72 | drawable.draw(canvas);
73 | return bitmap;
74 | }
75 | ```
76 | #### 三.销毁
77 | 在使用结束之后,界面销毁或程序退出的时候,为了增加代码的健壮性,你最好做下销毁动作,类似如下:
78 | ```
79 | @Override
80 | protected void onDestroy() {
81 | super.onDestroy();
82 | if(mEmotionView!=null){
83 | mEmotionView.resetRain();
84 | LogUtil.i("=====表情雨重置========");
85 | }
86 | }
87 | ```
88 |
89 |
--------------------------------------------------------------------------------
/read/FlashHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## FlashHelper使用说明
2 |
3 | ### 概述
4 | FlashHelper 是一个实现控件闪烁效果的帮助类。当你需要点击按钮,让按钮不断闪烁的时候,可以考虑使用此类。FlashHelper中包含启动和停止控件闪烁的效果。
5 |
6 | ### 使用说明
7 | #### 1. FlashHelper对象初始化
8 | FlashHelper 是一个单例,你可以像下面这样初始化FlashHelper对象:
9 | ```
10 | FlashHelper helper=FlashHelper.getInstance();
11 | ```
12 | 一般我们直接用:
13 | ```
14 | FlashHelper.getInstance();
15 | ```
16 | #### 2. 设置控件闪烁时间间隔
17 | 默认时间间隔为 300 毫秒
18 | ```
19 | //flashTime单位为毫秒
20 | setFlashTime(long flashTime)
21 | ```
22 | #### 3. 启动控件闪烁特效
23 | ```
24 | /**开启View闪烁效果**/
25 | startFlick(View view)
26 | ```
27 | #### 4. 停止控件闪烁特效
28 | ```
29 | /**取消View闪烁效果**/
30 | stopFlick(View view)
31 | ```
32 | #### 5. 调用示例
33 | ```
34 | //启动mTextView闪烁特效
35 | FlashHelper.getInstance()
36 | .setFlashTime(300)//若不设置,则默认时间间隔为300毫秒
37 | .startFlick(mTextView);
38 |
39 |
40 | //停止闪烁
41 | FlashHelper.getInstance().stopFlick(mTextView);
42 | ```
43 |
--------------------------------------------------------------------------------
/read/FragmentStackManager使用说明.md:
--------------------------------------------------------------------------------
1 | ## FragmentStackManager使用说明
2 |
3 | ### 概述
4 | FragmentStackManager是一个处理 Fragment跳转,关闭的管理类,可以方便的进行Activity与Fragment间的界面跳转,以及Fragment的关闭。其采取的Fragment管理方式为回退栈方式,若想利用Fragment的非回退栈来管理Fragment,可参考[AppFragmentManager](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/AppFragmentManager%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
5 |
6 | ### 使用说明
7 | 1. 初始化
8 | ```
9 | FragmentStackManager fragmentStackManager=FragmentStackManager.getInstance();
10 | ```
11 | 一般我们都直接用:
12 | ```
13 | FragmentStackManager.getInstance();
14 | ```
15 | 2. 跳转/打开 Fragment并将Fragment添加到回退栈
16 | ```
17 | /***
18 | * 跳转fragmnet并添加到回退栈
19 | *
20 | * @param containerId 装fragment的控件id,一般是FrameLayout的id
21 | * @param context 上下文
22 | * @param tag fragment对应的tag
23 | * @param bundle 传值用的bundle
24 | * @param listener 创建一个frgmment实例的监听
25 | * @return
26 | */
27 | public Fragment startFragment(int containerId, Context context, String tag, Bundle bundle, OnCreateFragmentListener listener)
28 | ```
29 | 3. 关闭当前Fragment
30 | ```
31 | /***
32 | * 关闭回退栈中最后一个Fragment
33 | * 即关闭当前fragment
34 | */
35 | public void finish(Context context)
36 | ```
37 | 4. 返回到指定已经打开的fragment,并关闭当前及当前与指定Fragment间的所有Fragment
38 | ```
39 | /***
40 | * 返回到指定已经打开的fragment,并关闭当前及当前与指定Fragment间的所有Fragment
41 | * @param tag 需要返回到指定Fragment的tag
42 | * 若你需要返回到FragmentOne,且FragmentOne的tag为“one”,则此处tag参数填“one”
43 | * @param context
44 | */
45 | public void goBackToFragmentByTag(String tag,Context context)
46 | ```
47 | 5. 关闭回退栈中所有Fragment
48 | ```
49 | /**关闭回退栈中所有Fragment**/
50 | public void finishAllFragments(Context context)
51 | ```
52 | 6. 获取回退栈中fragment个数
53 | ```
54 | /**获取回退栈中fragment个数**/
55 | public int getFragmentSize(Context context)
56 | ```
57 | 7. 获取回退栈中fragment对应的tag集合
58 | ```
59 | /**获取回退栈中fragment对应的tag集合**/
60 | public List getFragmentTags(Context context)
61 | ```
62 |
--------------------------------------------------------------------------------
/read/IntentHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## IntentHelper使用说明
2 |
3 | ### 说明
4 | IntentHelper是一个activity跳转帮助类,它提供activity与activity之间各种跳转与传值
5 |
6 | ### 使用简介
7 | #### 1. 初始化
8 | IntentHelper是一个单例,初始化如下:
9 | ```
10 | IntentHelper.getInstance()
11 | ```
12 | #### 2. 无参界面跳转
13 | ```
14 | startAct(Context context,Class> cls)
15 | ```
16 | #### 3. 带单个参数的界面跳转
17 | parameter可以是以下类型:
18 | short, int, float, double, long, byte, char, String, boolean, Bundle对象, 实现Serializable接口的对象, 实现Parcelable接口的对象
19 | ```
20 | startParameterAct(Context context,Class> cls, String tag, Object parameter)
21 | ```
22 | #### 4. 用intent接收上一个界面传过来的Short,默认取值 0
23 | ```
24 | getShortParameter(Context context,String tag)
25 | ```
26 | #### 5. 用intent接收上一个界面传过来的int,默认取值 0
27 | ```
28 | getIntParameter(Context context,String tag)
29 | ```
30 | #### 6. 用intent接收上一个界面传过来的float,默认取值 0f
31 | ```
32 | getFloatParameter(Context context,String tag)
33 | ```
34 | #### 7. 用intent接收上一个界面传过来的double,默认取值 0d
35 | ```
36 | getDoubleParameter(Context context,String tag)
37 | ```
38 | #### 8. 用intent接收上一个界面传过来的long,默认取值 0L
39 | ```
40 | getLongParameter(Context context,String tag)
41 | ```
42 | #### 9. 用intent接收上一个界面传过来的byte,默认取值 0
43 | ```
44 | getByteParameter(Context context,String tag)
45 | ```
46 | #### 10. 用intent接收上一个界面传过来的char,默认取值 ' '
47 | ```
48 | getCharParameter(Context context,String tag)
49 | ```
50 | #### 11. 用intent接收上一个界面传过来的String,默认取值 null
51 | ```
52 | getStringParameter(Context context,String tag)
53 | ```
54 | #### 12. 用intent接收上一个界面传过来的boolean,默认取值 false
55 | ```
56 | getBooleanParameter(Context context,String tag)
57 | ```
58 | #### 13. 用intent接收上一个界面传过来的Bundle
59 | ```
60 | getBundleParameter(Context context,String tag)
61 | ```
62 | #### 14. 用intent接收上一个界面传过来的对象
63 | 对象需要实现Serializable
64 | ```
65 | getSerializableObject(Context context,String tag)
66 | ```
67 | 对象需要实现Parcelable
68 | ```
69 | getParcelableObject(Context context,String tag)
70 | ```
71 | #### 15. 带Listlist的界面跳转
72 | ```
73 | startIntegerListAct(Context context,Class> cls, String tag, List list)
74 | ```
75 | #### 16. 用intent接收上一个界面传过来的listlist
76 | ```
77 | getIntegerList(Context context,String tag)
78 | ```
79 | #### 17. 带Listlist的界面跳转
80 | ```
81 | startStringListAct(Context context,Class> cls, String tag, List list)
82 | ```
83 | #### 18. 用intent接收上一个界面传过来的listlist
84 | ```
85 | getStringList(Context context,String tag)
86 | ```
87 | #### 19. 带Listlist的界面跳转
88 | List中的item对象需要实现Parcelable接口
89 | ```
90 | startStringListAct(Context context,Class> cls, String tag, List list)
91 | ```
92 | #### 20. 用intent接收上一个界面传过来的listlist
93 | List中的item对象需要实现Parcelable接口
94 | ```
95 | getParcelableList(Context context,String tag)
96 | ```
97 |
--------------------------------------------------------------------------------
/read/LaunchUtil使用说明.md:
--------------------------------------------------------------------------------
1 | #### LaunchUtil使用说明
2 | ##### 实现启动页view颜色渐变的工具类
3 |
4 | ##### 1.初始化
5 | ```
6 | /**
7 | * 初始化
8 | *
9 | * @param startColor 八位或六位色值,如:"#F3D266" 或 "#FFF3D266"
10 | * @param endColor 八位或六位色值,如:"#FFFFFF" 或 "#FFFFFFFF"
11 | */
12 | init(String startColor,String endColor);
13 | ```
14 | 初始化时需要传两个色值,渐变起始色值 startColor 和渐变终止色值 endColor,色值均为String数据类型,色值为八位或六位色值,如:"#F3D266" 或 "#FFF3D266"
15 |
16 | ##### 2.设置颜色变化时间总长(单位毫秒)
17 | ```
18 | LaunchUtil setDelayTime(long delayTime);
19 | ```
20 |
21 | ##### 3.获取颜色渐变时间总长(单位毫秒)
22 | ```
23 | long getDelayTime();
24 | ```
25 | 若未设置此属性,则得到默认时间为 1500毫秒
26 |
27 | ##### 4.设置颜色渐变频率(单位毫秒)
28 | ```
29 | setChangeTime(long changeTime);
30 | ```
31 | ##### 5.获取颜色渐变频率(单位毫秒)
32 | ```
33 | getChangeTime();
34 | ```
35 | 若未设置此属性,则得到默认渐变频率为 10毫秒
36 |
37 | ##### 6.执行渐变效果的方法
38 | ```
39 | start(final View view, final LaunchUtil.OnFinishListener listener)
40 | ```
41 | 其中 view 为要执行渐变效果的控件,listener为渐变执行完毕的监听,一般在启动页用此方法的时候,view设为布局控件。
42 |
43 | 具体调用:
44 | ```
45 | LaunchUtil.getInstance().init("#FF0000","#0000FF");//初始化
46 | LaunchUtil.getInstance().setDelayTime(1500);//设置渐变总时长,可不设置
47 | LaunchUtil.getInstance().setChangeTime(10);//设置渐变总时长,可不设置
48 | LaunchUtil.getInstance().start(mLayoutView, new LaunchUtil.OnFinishListener() {
49 | @Override
50 | public void onFinish() {
51 | //启动页执行完毕的处理
52 | //......
53 | }
54 | });
55 | ```
56 | LaunchUtil支持链式调用,但init方法必须是第一个调用,start方法必须是最后一个调用,调用示例如下:
57 | ```
58 | LaunchUtil.getInstance().init("#FF0000", "#0000ff")//初始化时设置渐变起始和终止颜色
59 | .setDelayTime(1500)//设置变化总时长,不设置的时候,默认时间是1.5秒
60 | .setChangeTime(10)//设置变化频率,不设置的时候,默认时间是10毫秒
61 | //渐变结束时的监听(启动页的时候,一般设置mView为最外层布局控件)
62 | .start(mLayoutView, new LaunchUtil.OnFinishListener() {
63 | @Override
64 | public void onFinish() {
65 | //LogUtil.i("===启动页加载完毕====");
66 | //颜色渐变加载完毕的监听
67 | }
68 | });
69 |
70 | ```
71 |
72 |
--------------------------------------------------------------------------------
/read/LoadingDialog使用说明.md:
--------------------------------------------------------------------------------
1 | ## LoadingDialog使用说明
2 |
3 | ### 概述
4 | LoadingDialog 是专门用于网络通讯期间用于显示的 dialog,其目的是防止用户在通讯期间对界面进行操作,也在一定程度上防止了用户重复点击的可能。增加用户体验。
5 |
6 | ### 使用说明
7 | #### 一. LoadingDialog 弹出的简单使用
8 | 如果你想弹出一个简单快速的LoadingDialog,你可以像下面这样:
9 | ```
10 | //显示网络加载dialog
11 | LoadingDialog.getInstance().showLoading(mContext);
12 | ```
13 | #### 二. LoadingDialog 设置提示语 及 不弹出的设置
14 | LoadingDialog 默认弹出时显示的提示语为:"正在加载...",若你想更改提示语,你可以像下面这样:
15 | ```
16 | //显示网络加载dialog
17 | LoadingDialog.getInstance()
18 | //设置弹出dialog时提示语
19 | .setTitle("大家好")
20 | //弹出dialog
21 | .showLoading(mContext);
22 | ```
23 | LoadingDialog在使用的时候,一般是会弹出的,若你在通讯过程中已经设置好了LoadingDialog弹出和隐藏的位置,那么想快速做到通讯时不弹出此dialog,你可以这样:
24 | ```
25 | //网络加载框的处理
26 | //显示网络加载dialog
27 | LoadingDialog.getInstance()
28 | //设置不弹出dialog
29 | .setDismiss(true)
30 | //此句代码要加
31 | .showLoading(mContext);
32 |
33 | //网络发起通讯
34 | //接收返回结果
35 |
36 | //隐藏网络加载dialog
37 | ```
38 | #### 三. LoadingDialog的隐藏
39 | 通讯收到结果后,你可以像下面这样隐藏你的网络加载框:
40 | ```
41 | //隐藏网络加载dialog
42 | LoadingDialog.getInstance().hideLoading();
43 | ```
44 | #### 四. 其他方法
45 | LoadingDialog还有一个用于判断dialog是否该显示的通用方法:
46 | ```
47 | /**
48 | * 判断dialog是否该show
49 | * @param dialog
50 | * @param context 为 activity 上下文
51 | * @return
52 | */
53 | public boolean shouldShow(Dialog dialog, Context context)
54 | ```
55 |
56 |
--------------------------------------------------------------------------------
/read/MaskButton使用说明.md:
--------------------------------------------------------------------------------
1 | ## MaskButton使用说明
2 |
3 | ### 概述
4 | MaskButton 是一款 实现按钮点击变暗 特效的 button。它的出现是为了方便快捷的实现 按钮点击变色效果。开发过程中,若涉及到按钮点击效果的话,
5 | 你再也不用写那么多繁琐的 xml背景文件了,只需要一个,甚至只需要给 button设置一个颜色,便可实现按钮点击特效。
6 |
7 | ### 使用说明
8 | #### 1. MaskButton使用
9 | 若你要在你的MainActivity中使用MaskButton控件,你需要在MainActivity对应的布局中添加控件引用,类似下面这样(注:具体包路径以代码为准):
10 | ```
11 |
22 | ```
23 | #### 2. 支持背景设置种类
24 | MaskButton 的变色特效主要作用于 android:background="xxx" 属性上,其中 xxx 支持以下几种background的设置:
25 | ```
26 | android:background="@drawable/confirm_btn_bg" //drawable类xml文件
27 | android:background="#00ff00" //纯色值
28 | android:background="@mipmap/ic_launcher" // mipmap类图片
29 | ```
30 | #### 3. 设置/取消 按钮点击效果
31 | MaskButton 默认是开启 按钮点击变暗特效的,按钮点击变暗特效 的开启与关闭 设置如下:
32 | ```
33 | //开启按钮点击变暗特效
34 | maskBtn.setTouchEffect(true);
35 |
36 | //关闭按钮点击变暗特效
37 | maskBtn.setTouchEffect(false);
38 | ```
39 |
--------------------------------------------------------------------------------
/read/NIOStreamUtil使用说明.md:
--------------------------------------------------------------------------------
1 | ## NIOStreamUtil使用说明
2 |
3 | ### 概述
4 | `NIOStreamUtil`是一个以`NIO`实现数据流操作的`IO流`工具类,可实现文件的`读`、`写`及`复制`功能,效率高于传统的`IO流`。
5 |
6 | ### 使用说明
7 | #### 一.前置
8 | 在使用`NIOStreamUtil`工具之前,你先要给自己的项目添加各种文件读写权限,包括在`Androidmanifast.xml`中添加读写权限,添加`FileProvider`文件读写权限,
9 | 然后在你项目中添加`Android 6.0+`手动授权库权限.
10 |
11 | 二.NIOStreamUtil主要方法
12 | `NIOStreamUtil`具有以下几个重要方法:
13 | ```
14 | /**
15 | * nio读文件的方式一
16 | * @param filePath 文件路径
17 | * @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
18 | * 此参数为null时,返回编译器默认编码格式
19 | * @return 读出的文件内容
20 | */
21 | public static String readFile1(String filePath, String charsetName)
22 |
23 | /**
24 | * nio读文件的方式二
25 | * @param filePath 文件路径
26 | * @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
27 | * 此参数为null时,返回编译器默认编码格式
28 | * @return 读出的文件内容
29 | */
30 | public static String readFile2(String filePath, String charsetName)
31 |
32 | /***
33 | * 将文件读成 byte 数组
34 | *
35 | * @param filePath 文件路径
36 | * @return 文件的字节数组
37 | */
38 | public static byte[] getBytes(String filePath)
39 |
40 | /**
41 | * NIO 写文件
42 | *
43 | * @param message 要写入文件的字符串
44 | * @param filePath 文件路径
45 | * @param charsetName 字符编码格式,如:StreamUtil.UTF_8,StreamUtil.GBK 等.
46 | * 此参数为null时,返回编译器默认编码格式
47 | * @param append true:表示在文件中追加内容, false:表示在文件中写新内容,覆盖以前内容
48 | * @return true:写文件成功 false:写文件失败
49 | */
50 | public static boolean writeFile(String message,String filePath,String charsetName,boolean append)
51 |
52 | /**
53 | * NIO复制文件
54 | *
55 | * @param readFilePath 要复制的文件路径
56 | * @param writeFilePath 新生成的文件路径
57 | * @return true:复制成功 false:复制失败
58 | */
59 | public static boolean copyFile(String readFilePath,String writeFilePath)
60 | ```
61 | 其中`getBytes(String filePath)`方法也可实现图片类文件的读取,示例如下:
62 | ```
63 | /**读图片**/
64 | private void readImage(){
65 | String path="/data/data/com.testdemo/cache/1.jpg";
66 | byte bytes[]=NIOStreamUtil.getBytes(path);
67 | if(bytes!=null){
68 | Bitmap bitmap= BitmapFactory.decodeByteArray(bytes,0,bytes.length);
69 | mImv.setImageBitmap(bitmap);
70 | }
71 | }
72 | ```
73 | #### 三. 注意项
74 | - 对于文件读的方法,若读出的内容出现乱码,可以考虑在读文件时,更换字符编码集,常用的字符编码集有: StreamUtil.UTF_8和StreamUtil.GBK
75 | - 对于文件写的方法,我们有注意最后一个参数是一个boolean值,当为true时,表示给文件里面追加内容,当为false时,表示重写文件,
76 | 即写的内容会完全覆盖原文件中的所有内容,这是需要注意的点。
77 |
--------------------------------------------------------------------------------
/read/NetSpeed使用说明.md:
--------------------------------------------------------------------------------
1 | ## NetSpeed使用说明
2 |
3 | ### 概述
4 | NetSpeed是一个监测网速的工具类。内置定时器,用户只需要简单的调用即可获得当前网络链接速度。
5 |
6 | ### 使用说明
7 | #### 一. NetSpeed方法介绍
8 | NetSpeed主要有以下几个公开方法
9 | ```
10 | /**
11 | * 设置延时启动时间
12 | *
13 | * @param delayTime 单位毫秒,默认500毫秒
14 | * @return
15 | */
16 | public NetSpeed setDelayTime(long delayTime)
17 |
18 | /***
19 | * 设置循环时间间隔
20 | *
21 | * @param recycleTime 单位毫秒,默认1500毫秒
22 | * @return
23 | */
24 | public NetSpeed setRecycleTime(long recycleTime)
25 |
26 | /***
27 | * 开始监测网速
28 | *
29 | * @param view 显示网速的控件,TextView子类
30 | * @param context AppCompatActivity实例,不能是application实例
31 | */
32 | public void start(TextView view,Context context)
33 |
34 | /**取消网速监测**/
35 | public void cancel()
36 |
37 | /***
38 | * 获取某一时刻网速
39 | *
40 | * 需要结合定时器更新
41 | * @return
42 | */
43 | public String getNetSpeed()
44 |
45 | /**将byte自动转换为其他单位**/
46 | public String formatNetSpeed(long bytes)
47 | ```
48 | #### 二. NetSpeed方法介绍
49 | ##### 2.1 简单使用
50 | 如果对于网速监测没有开始延迟时间和循环监测时间间隔的需求(即使用默认时间设置),你可以直接在`MainActivity`中这样监测网络:
51 | ```
52 | //网速监测(已内置定时器,结束监测时需要调用取消方法)
53 | NetSpeed.getInstance().start(mTextView,MainActivity.this);//开始监测网速,传入要显示网速的控件
54 | ```
55 | 然后在界面销毁时调用:
56 | ```
57 | //取消网络监测
58 | NetSpeed.getInstance().cancel();
59 | ```
60 | ##### 2.2 配置时间参数的使用
61 | 若对网络监测时间间隔想自己设置,你可以像下面这样在`MainActivity`中调用:
62 | ```
63 | //网速监测(已内置定时器,结束监测时需要调用取消方法)
64 | NetSpeed.getInstance()
65 | .setDelayTime(500)//设置延迟执行时间,单位毫秒,默认500毫秒
66 | .setRecycleTime(1500)//设置监测时间间隔,单位毫秒,默认1500毫秒
67 | .start(mTextView,MainActivity.this);//开始监测网速,传入要显示网速的控件
68 | ```
69 | 当然,在界面销毁时,你仍需取消监测:
70 | ```
71 | //取消网络监测
72 | NetSpeed.getInstance().cancel();
73 | ```
74 | #### 三. 其他
75 | ##### 3.1 获取网速
76 | 若由于上面方法传参固化,无法满足你的定制需求,你可以像下面这样获得某一时刻的网速:
77 | ```
78 | /***
79 | * 获取某一时刻网速
80 | *
81 | * 需要结合定时器更新
82 | * @return
83 | */
84 | public String getNetSpeed()
85 | ```
86 | 不过为了监听实时网速,你还需要自己新起一个定时器来间隔时间调用`getNetSpeed()`,以获取实时网速。
87 | ##### 3.1 规范网速数据包单位
88 | 若有根据网速数据包大小获取含单位的字符串需求的话,可以调用以下方法:
89 | ```
90 | /**将byte自动转换为其他单位**/
91 | public String formatNetSpeed(long bytes)
92 | ```
93 |
--------------------------------------------------------------------------------
/read/NetworkReceiver使用说明.md:
--------------------------------------------------------------------------------
1 | ## NetworkReceiver使用说明
2 |
3 | ### 概述
4 | NetworkReceiver 是一个用于实时监听网络链接状态的工具类,可以方便于开发者来监听app是否在当前时间链接了网络。
5 | 本监听只能获取两种状态:已经链接的网络,未链接网络
6 |
7 | ### 使用说明
8 | #### 使用前置
9 | NetworkReceiver是一个网络监听类,它的使用涉及到网络权限,所以我们在使用之前,需要在 AndroidManifast.xml中增加以下权限:
10 | ```
11 |
12 | ```
13 | 注意:你并不需要另外在代码中添加 Android6.0+ 权限。
14 |
15 | #### 使用说明
16 | 在MainActivity中声明对象:
17 | ```
18 | //声明对象
19 | private NetworkReceiver mNetworkReceiver;
20 | ```
21 | 然后初始化时,实例化广播对象:
22 | ```
23 | //初始化对象并注册网络监听广播
24 | mNetworkReceiver = new NetworkReceiver(MainActivity.this);
25 | ```
26 | 你可以像下面这样在需要的地方监听网络连接状态:
27 | ```
28 | /**监听网络**/
29 | mNetworkReceiver.setOnNetworkListener(new NetworkReceiver.OnNetworkListener() {
30 | @Override
31 | public void available(NetworkInfo networkInfo) {
32 | LogUtil.i("=========有网络====");
33 | ToastUtil.shortShow("有网络");
34 | mTv.setText("有网络");
35 |
36 |
37 | }
38 |
39 | @Override
40 | public void unavailable(NetworkInfo networkInfo) {
41 | LogUtil.i("=========无网络====");
42 | ToastUtil.shortShow("无网络");
43 | mTv.setText("无网络");
44 |
45 |
46 | }
47 | });
48 | ```
49 | 在MainActivity中使用完广播监听后,注销广播:
50 | ```
51 | //注销网络广播监听
52 | if (mNetworkReceiver != null) {
53 | mNetworkReceiver.onDestroy();
54 | }
55 | ```
56 |
57 |
58 |
--------------------------------------------------------------------------------
/read/PermissionHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ### PermissionHelper使用说明
2 | #### app权限申请工具类
3 |
4 | #### 一.提前准备
5 | 在你项目的 mainfast.xml中增加以下权限:
6 | ```
7 |
8 |
9 | ```
10 |
11 | ok,接下来你才能开始使用PermissionHelper这个类的相关方法了。
12 | #### 二.具体使用
13 | ##### 2.1 定义申请权限的常量
14 | 在你项目的常量类(假设你常量类名为Contents)中定义权限申请的常量:
15 | ```
16 | public static final int PERMISSION_CODE=555;//值自己定义
17 | ```
18 | ##### 2.2 具体操作
19 | 在你要申请权限的activity中添加以下代码
20 | ```
21 | @PermissionSuccess(requestCode = Contents.PERMISSION_CODE)
22 | public void requestSuccess() {
23 | //申请到权限后的处理
24 | //......
25 |
26 | }
27 |
28 | @PermissionFail(requestCode = Contents.PERMISSION_CODE)
29 | public void requestFail() {
30 | //未获取到权限的处理
31 | //......
32 |
33 | }
34 |
35 | @Override
36 | public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
37 | PermissionHelper.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
38 | }
39 | ```
40 | 注意:此段代码只在activity中使用,在Fragment中不起作用。注解 @PermissionSuccess 和 @PermissionFail中涉及的requesCode对应的值即为你定义的
41 | 申请权限的值,如上面的 Constents.PERMISSION_CODE
42 |
43 | 假设你要申请文件读写权限,那么你需要先在你的 mainfast.xml中添加对应权限:
44 | ```
45 |
46 |
47 |
48 | ```
49 | 然后你需要写一个类似下面的方法,在方法中定义读写权限:
50 | ```
51 | private void requestPermission(int requestCode) {
52 | String permissions[] = {
53 | Manifest.permission.READ_EXTERNAL_STORAGE,
54 | Manifest.permission.WRITE_EXTERNAL_STORAGE};
55 | PermissionHelper.getInstance().checkPermissions(permissions, requestCode,MainActivity.this);
56 | }
57 | ```
58 | 然后在你申请权限的地方调用:
59 | ```
60 | requestPermission(Constents.PERMISSION_CODE);
61 | ```
62 | ok,以上即为权限申请调用类的基本使用。
63 |
64 |
--------------------------------------------------------------------------------
/read/RemoteService使用说明.md:
--------------------------------------------------------------------------------
1 | ## RemoteService使用说明
2 |
3 | ### 概述
4 | RemoteService作为一个绑定式服务的父类,主要用作创建一个服务对象及bind的相关处理,并不做外部使用,也不给特定“绑定式”service提供有效的调用方法。
5 |
6 | ### 使用
7 | RemoteService仅作为自建的绑定式服务的基类,协助开发者快速创建一个自建的service。
8 | 若你要自建一个“绑定式”服务 MyService,你可以这样:
9 | ```
10 | /**
11 | * Title:自建绑定式服务,继承RemoteService
12 | * description:
13 | * autor:pei
14 | * created on 2019/11/28
15 | */
16 | public class MyService extends RemoteService{
17 |
18 | @Override
19 | public void onCreate() {
20 | super.onCreate();
21 | }
22 |
23 | @Override
24 | public IBinder onBind(Intent arg0) {
25 | return super.onBind(arg0);
26 | }
27 |
28 | @Override
29 | public boolean onUnbind(Intent intent) {
30 | return super.onUnbind(intent);
31 | }
32 |
33 | @Override
34 | public void onDestroy() {
35 | super.onDestroy();
36 | }
37 |
38 | @Override
39 | protected RemoteService getSelfService() {
40 | return MyService.this;
41 | }
42 |
43 | }
44 | ```
45 | 值得注意的是,getSelfService() 方法必须重写,并且返回当前Service对象。
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/read/RxBus使用说明.md:
--------------------------------------------------------------------------------
1 | ## RxBus使用说明
2 |
3 | ### 概述
4 | RxBus 是基于 rxJava2.x 封装的一个消息事务传递总线。方便在app中进行消息的传递。使用方便快捷。
5 | RxBu传值post的时候既可以直接传Object,也可以传封装的数据实体RxData。
6 | RxData源码看[这里](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/RxData.java)
7 |
8 | ### 使用说明
9 | RxBus的使用有以下几个步骤:
10 | 1. 注册
11 | 2. 传值
12 | 3. 注销
13 | #### 一. RxBus注册及接收数据
14 | 你可以在你需要接收传值的地方像下面这样注册一个RxBus:
15 | ```
16 | //注册RxBus
17 | RxBus.getInstance().register(MainActivity.class, new RxBus.OnCallBack() {
18 | @Override
19 | public void callBack(Object obj) {
20 | //接收传过来的值
21 | //......
22 | }
23 | });
24 | ```
25 | 这里需要注意的是,register第一个传的值是class类型,这里的class不一定要是Activity或Fragment哟,只要是一个class就行。
26 | #### 二. RxBus传值
27 | 在你需要传值的时候,你可以像下面这样:
28 | ```
29 | //RxBus传值
30 | RxBus.getInstance().post(rxData);
31 | ```
32 | post的时候可以传Object,但是在一个app项目中会有多个值传来传去,为了防止消息传递中混淆,我将要传值的数据封装到RxData实体类中(后面会给出RxData代码),这时RxBus传值则变成(以传一个字符串为例):
33 | ```
34 | RxData rxData=new RxData();
35 | rxData.setCode(1);
36 | rxData.setData("我是rx传值");
37 | RxBus.getInstance().post(rxData);
38 | ```
39 | 然后在接收值的时候则这样处理:
40 | ```
41 | //注册RxBus
42 | RxBus.getInstance().register(MainActivity.class, new RxBus.OnCallBack() {
43 | @Override
44 | public void callBack(Object obj) {
45 | if(obj!=null&&obj instanceof RxData){
46 | int code=((RxData) obj).getCode();
47 | LogUtil.i("=======code=="+code);
48 |
49 | switch (code) {
50 | case 1:
51 | String data=((RxData) obj).getData().toString();
52 |
53 | break;
54 | default:
55 | break;
56 | }
57 | }
58 | }
59 | });
60 | ```
61 | #### 三. RxBus注销
62 | 最后在使用完RxBus后,要注销RxBus,像下面这样:
63 | ```
64 | //注销RxBus
65 | RxBus.getInstance().unRegister(MainActivity.class);
66 | ```
67 | 需要注意的是,注销时传的class要和注册时传的class一 一对应。
68 |
69 |
--------------------------------------------------------------------------------
/read/RxTimer定时器使用说明.md:
--------------------------------------------------------------------------------
1 | ## RxTimer定时器使用说明
2 |
3 | ### 概述
4 | RxTimer定时器是一款经 RxJava2.x实现的定时器。与 [TimerManager](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/TimerManager%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md) 定时器不同,你可以通过 new 不同的 RxTimer 对象,来建立多个定时器。
5 | 定时器之间互不干扰。
6 |
7 | ### 使用说明
8 | #### 一. 初始化定时器
9 | 你可以有两种方式初始化一个RxTimer定时器:
10 | ```
11 | //初始化一个不设置tag的定时器
12 | RxTimer rxTimerOne=new RxTimer();
13 |
14 | //初始化一个带tag的定时器
15 | RxTimer rxTimerTwo=new RxTimer("Two");
16 | ```
17 | 以上两种方式的不同在于,不设置参数的时候是设置一个不带Tag的定时器,设置参数是初始化一个带tag的定时器,而tag的作用是用来标志一个定时器。
18 | 当然,如果你不想那么麻烦的话,你完全可以不设置tag。倘若你以"RxTimer rxTimerOne=new RxTimer();" 方式初始化了一个RxTimer后,你又想给它设置一个Tag,
19 | 那么你可以像下面这样设置Tag:
20 | ```
21 | rxTimerOne.setTag("One");
22 | ```
23 | #### 二. 延时定时器
24 | 需要执行延时操作的话,你可以用以下方法:
25 | ```
26 | /** milliseconds毫秒后执行next操作
27 | *
28 | * @param milliseconds:毫秒
29 | * @param next
30 | */
31 | public void timer(long milliseconds,final OnRxTimeListener next)
32 | ```
33 | 此方法执行完后,定时器会自行注销,你完全不需要做任何处理。
34 | #### 二. 循环执行定时器
35 | 若有需要循环操作的动作,你可以调用以下方法:
36 | ```
37 | /** 每隔milliseconds毫秒后执行next操作
38 | *
39 | * @param milliseconds:毫秒
40 | * @param next
41 | */
42 | public void interval(long milliseconds,final OnRxTimeListener next)
43 | ```
44 | 当你需要关闭一个循环定时器,你需要做注销操作:
45 | ```
46 | /**
47 | * 取消订阅
48 | */
49 | public void cancel()
50 | ```
51 | #### 三. 获取定时器tag
52 | 若你的RxTimer已经设置了tag,那么,你还可以代码获取该RxTimer的tag
53 | ```
54 | /**获取定时器tag**/
55 | public String getTag()
56 | ```
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/read/ServiceHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## ServiceHelper使用说明
2 |
3 | ### 概述
4 | ServiceHelper是为方便创建服务而产生的一个帮助类,目前里面的主要方法是用来创建 服务前台模式的,目的是最大限度的保持创建的服务不在app生命周期内“意外死亡”。
5 | ServiceHelper拥有两个子类
6 | - [LocalServiceHelper](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/LocalServiceHelper%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md) :"非绑定式"服务帮助类
7 | - [RemoteServiceHelper](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/RemoteServiceHelper%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md) :"绑定式"服务帮助类
8 |
9 | ### 使用说明
10 | #### 1. ServiceHelper初始化
11 | 初始化ServiceHelper,你可以像下面这样:
12 | ```
13 | ServiceHelper mServiceHelper=new ServiceHelper();
14 | ```
15 | 由于 ServiceHelper 仅仅是为了给"绑定式"服务和"非绑定式"服务提供公共的可调用的方法。因此我们很少直接去创建 ServiceHelper 对象,而是直接去创建其子类对象
16 | 然后调用相关方法。
17 |
18 | #### 2. 开启前台模式
19 | 开启前台模式之前,你需要在自己的manifast.xml文件中添加以下权限:
20 | ```
21 |
22 | ```
23 | 开启前台服务,必须结合通知栏使用,若你需要快速开启一个含简易通知栏的前台服务,你可以在你创建的“非绑定式”service中调用以下方法:
24 | ```
25 | /**
26 | * 开启前台运行模式(简易通知栏模式)
27 | * @param drawableId 设置小图标,一般设置app的icon,样式如:R.mipmap.ic_launcher
28 | */
29 | public void startForeService(Service service,int drawableId,Context context)
30 | ```
31 | 若你要开启一个自定义或者布局比较自由的通知栏 前台服务,你需要自定义一个Notification,然后调用以下方法开启一个服务前台模式
32 | ```
33 | /**开启服务前台模式**/
34 | public void startForeService(Service service, Notification notification){
35 | ```
36 | 关于通知栏的快速创建,你可以参考[NotificationHelper使用说明](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/NotificationHelper%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
37 | #### 3. 关闭前台模式
38 | 如果你的服务已经开启了前台模式,那么在服务销毁的时候,你需要关闭前台模式:
39 | ```
40 | /**关闭服务前台模式**/
41 | stopForeService(Service service)
42 | ```
43 |
44 |
--------------------------------------------------------------------------------
/read/SoftKeyBoardHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## SoftKeyBoardHelper使用说明
2 |
3 | ### 概述
4 | SoftKeyBoardHelper是一个软键盘监听工具类,主要用于监听软件盘的 显示 和 隐藏。
5 | 使用方便简单,对界面布局无限制。
6 |
7 | ### 使用说明
8 | 以在TestActivity中监听软键盘为例。
9 | #### 1. 在 manifast.xml中给TestActivity设置键盘相关属性:
10 | ```
11 |
14 | ```
15 | #### 2. 在TestActivity中使用
16 | 在activity中监听软键盘的显示和隐藏,你可以类似下面这样:
17 | ```
18 | //监听软键盘的显示和隐藏
19 | SoftKeyBoardHelper.setOnListener(TestActivity.this, new SoftKeyBoardHelper.OnSoftKeyBoardChangeListener() {
20 | @Override
21 | public void keyBoardShow(int height) {
22 | //软键盘显示时处理你的逻辑 (height为软键盘高度)
23 | //......
24 | }
25 |
26 | @Override
27 | public void keyBoardHide(int height) {
28 | //软键盘隐藏时处理你的逻辑 (height为软键盘高度)
29 | //......
30 | }
31 | });
32 | ```
33 |
34 |
35 |
--------------------------------------------------------------------------------
/read/StreamUtil使用说明.md:
--------------------------------------------------------------------------------
1 | ## StreamUtil使用说明
2 |
3 | ### 概述
4 | `StreamUtil`是一个`IO流`工具类,主要给`IO流`提供关闭的方法,以及各种字符集常量。
5 |
6 | ### 使用说明
7 | #### 一. 包含的字符集编码格式
8 | `StreamUtil`包含以下几种字符集编码格式:
9 | ```
10 | //编码格式
11 | public static final String UTF_8="UTF-8";
12 | public static final String UTF_16="UTF-16";
13 | public static final String UTF_32="UTF-32";
14 | public static final String GBK="GBK";//中文简体与繁体
15 | public static final String GB2312="GB2312";//中文简体
16 | public static final String GB18030="GB18030";
17 | public static final String ANSI="ANSI";
18 |
19 | ```
20 | 我们一般常用的就两种:`StreamUtil.UTF_8`,`StreamUtil.GBK`.
21 | #### 二. 主要方法
22 | `StreamUtil`包含以下几个方法,主要用于处理`IO流`相关问题。
23 | ```
24 | /***
25 | * 关闭流
26 | * @param in 输入流
27 | * @param out 输出流
28 | */
29 | public static void closeStream(InputStream in, OutputStream out)
30 |
31 | /***
32 | * 关闭流
33 | * @param in 输入流
34 | * @param out 输出流
35 | */
36 | public static void closeStream(Reader in, Writer out)
37 |
38 | /**关闭文件通道**/
39 | public static void closeStream(FileChannel channel)
40 |
41 | /**
42 | * 判断要读的文件路径是否为有效路径
43 | *
44 | * @param filePath 要读出文件的文件路径
45 | * @return null:表示文件路径无效 file:文件路径有效则返回file对象
46 | */
47 | public static File checkReadFilePath(String filePath)
48 |
49 | /**
50 | * 判断将要写入的文件路径是否为有效路径
51 | *
52 | * @param filePath 要写入文件的文件路径
53 | * @return null:表示文件路径无效 file:文件路径有效则返回file对象
54 | */
55 | public static File checkWriteFilePath(String filePath)
56 | ```
57 |
58 |
--------------------------------------------------------------------------------
/read/SyDialogHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## SyDialogHelper使用说明
2 |
3 | ### 概述
4 | SyDialogHelper 是对 SyDialogFragment 的一个再封装,它的出现是为了更加快捷的创建dialog。
5 | 进一步了解SyDialogFragment,可查看[SyDialogFragment使用说明](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/SyDialogFragment使用说明.md)
6 |
7 | ### 使用说明
8 | #### 一. Dialog整体风格设置
9 | 我们在选哟使用`SyDialogHelper`时,一般是用于对整个`app`而言设置一个通用风格的弹窗。直接调用`SyDialogHelper`类相关方法的时候,可以快速弹出一个`Dialog`窗口宽度为
10 | 屏幕宽度0.8d,高度为屏幕高度0.28d的`Dialog`,且确认按钮文字颜色为`#68c81c`,取消按钮文字颜色为`#68c81c`。若你在自己的项目中要对这个通用`Dialog`做微调,你可以在自己的
11 | `Application`中做类似如下设置:
12 | ```
13 | public class AppContext extends Application {
14 |
15 | @Override
16 | public void onCreate() {
17 | super.onCreate();
18 |
19 | //其他代码省略
20 | //......
21 |
22 | //SyDialogHelper帮助类全局dialog属性设置
23 | SyDialogHelper.setDialogSize(0.5d,0.4d);//设置dialog尺寸
24 | SyDialogHelper.setCancelTextColor(R.color.blue); //取消按钮颜色
25 | SyDialogHelper.setConfirmTextColor(R.color.blue); //确定按钮颜色
26 |
27 | }
28 |
29 | }
30 | ```
31 |
32 | #### 二. 其他方法说明
33 | ##### 2.1显示含一个按钮的提示dialog,按钮文字默认为"确定"
34 | ```
35 | /**显示一个按钮的提示dialog(默认按钮文字为"确定")**/
36 | showDialogOneBtn(String tipMsg,Context context,View.OnClickListener listener)
37 | ```
38 | ##### 2.2显示含一个按钮的提示dialog,按钮文字需要定义
39 | ```
40 | /**显示一个按钮的提示dialog(自己写按钮文字)**/
41 | showDialogOneBtn(String tipMsg, String btnText, Context context, View.OnClickListener listener)
42 | ```
43 | ##### 2.3显示含两个按钮的提示dialog,按钮文字固定是"确定"和"取消",只需要写确定功能
44 | ```
45 | /**显示两个按钮的提示dialog(确定,取消按钮的文字固定,只需自己写确定功能)**/
46 | showDialogTwoBtn(String tipMsg,Context context,View.OnClickListener listener)
47 | ```
48 | ##### 2.4显示含两个按钮的提示dialog,按钮文字自定义,只需要写确定功能
49 | ```
50 | /**显示两个按钮的提示dialog(确定,取消按钮文字自定义,点击取消按钮dialog消失)**/
51 | showDialogTwoBtn(String tipMsg,String cancelText,String confirmText,Context context,View.OnClickListener listener)
52 | ```
53 | ##### 2.5显示含两个按钮的提示dialog,按钮文字自定义,确定取消的功能也需要自定义
54 | ```
55 | /**显示两个按钮的提示dialog(确定,取消按钮文字和功能自定义)**/
56 | showDialogTwoBtn(String tipMsg,String cancelText,String confirmText,Context context,View.OnClickListener cancelListener,View.OnClickListener confirmListener)
57 | ```
58 | #### 三. 使用范例
59 | 以显示含一个按钮的提示dialog,按钮文字默认为"确定",只需实现确定功能为例,在使用的时候,你可以类似这样:
60 | ```
61 | SyDialogHelper.showDialogOneBtn("要关闭码?", MainActivity.this, new View.OnClickListener() {
62 | @Override
63 | public void onClick(View v) {
64 | ToastUtil.shortShow("dajillllppppp");
65 | }
66 | });
67 | ```
68 |
69 |
--------------------------------------------------------------------------------
/read/TimerManager使用说明.md:
--------------------------------------------------------------------------------
1 | ## TimerManager使用说明
2 |
3 | ### 概述
4 | TimerManager类是对 Timer 使用的一个封装,用户可以方便的使用到 timer 相关的定时,延时功能。
5 | 需要注意的是:TimerManager只能建立一个定时器。若需要使用多个定时器,可以查看另一个定时器类 [RxTimer](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/read/RxTimer%E5%AE%9A%E6%97%B6%E5%99%A8%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md)
6 |
7 | ### 使用说明
8 | #### 一. TimerManager初始化
9 | TimerManager是一个单例,你可以像下面这样初始化一个TimerManager对象
10 | ```
11 | TimerManager timerManager=TimerManager.getInstance();
12 | ```
13 | 但是我们一般都直接用
14 | ```
15 | TimerManager.getInstance()
16 | ```
17 | #### 二. TimerManager中提供的方法
18 | TimerManager作为一个定时器工具类,提供以下几个公开方法:
19 | ```
20 | /**启动定时器循环调用(context设置为null时可执行非ui的逻辑,context不为null时可更新ui)**/
21 | startRecycle(Context context,OnTimerListener onTimerListener)
22 |
23 | /**启动定时器延时调用(context设置为null时可执行非ui的逻辑,context不为null时可更新ui)**/
24 | startDelay(Context context,OnTimerListener onTimerListener)
25 |
26 | /**停止定时器**/
27 | cancel()
28 |
29 | /**设置延时启动时间(若不设置,则默认时间间隔为0,即立刻启动)**/
30 | setDelayTime(long delayTime)
31 |
32 | /**设置循环时间间隔(若不设置,则默认时间间隔为1秒)**/
33 | setRecycleTime(long recycleTime)
34 | ```
35 | #### 三. 调用示例
36 | ##### 3.1 延时执行
37 | 若要启动一个延时执行的业务逻辑,你可以像下面这样:
38 | **注**:此时不需要设置`setRecycleTime(long recycleTime)`方法,因为此方法只对`循环执行`有效
39 | ```
40 | //定时器延时
41 | TimerManager.getInstance()
42 | .setDelayTime(1000)//设置延时执行时间,默认为0(即默认情况下会立即执行)
43 | //context设置为null时可执行非ui的逻辑,context不为null时可执行更新ui逻辑
44 | .startDelay(MainActivity.this,new TimerManager.OnTimerListener() {
45 | @Override
46 | public void schedule() {
47 | //延时执行逻辑
48 | //......
49 | }
50 | });
51 | ```
52 | 延时执行的话,是不需要去取消定时器的,因为它执行完毕后就会自动注销掉。
53 | ##### 3.2 循环执行
54 | 你可以像下面这样启动一个循环执行的定时器
55 | ```
56 | //定时器循环
57 | TimerManager.getInstance()
58 | .setDelayTime(0)//设置延时执行时间,默认为0(即默认情况下会立即执行)
59 | .setRecycleTime(1000)//设置循环时间间隔,默认为1000,即1秒
60 | //context设置为null时可执行非ui的逻辑,context不为null时可执行更新ui逻辑
61 | .startRecycle(MainActivity.this,new TimerManager.OnTimerListener() {
62 | @Override
63 | public void schedule() {
64 | //循环执行逻辑
65 | //......
66 | }
67 | });
68 |
69 | ```
70 | 循环执行的定时器,在使用完毕后,需要手动取消定时器
71 | ##### 3.3 定时器取消
72 | 在使用玩定时器后,需要释放资源,取消定时器方法如下:
73 | ```
74 | //取消定时器
75 | TimerManager.getInstance().cancel();
76 | ```
77 |
--------------------------------------------------------------------------------
/read/UIHandler使用说明.md:
--------------------------------------------------------------------------------
1 | ## UIHandler使用说明
2 |
3 | ### 简介
4 | `UIHandler`是对 `Handler`的一个封装,其继承自`Handler`,本质还是一个`Handler`,封装的目的是为了避免`Handler`在使用过程中出现内存泄漏。
5 |
6 | ### 使用说明,
7 | #### 一.声明及初始化接收消息
8 | 你可以在需要用到`UIHandler`传递消息时,这样初始化它:
9 | ```
10 | //声明
11 | private UIHandler mUIHandler;
12 |
13 | //然后在初始化时接收处理消息
14 | mUIHandler=new UIHandler(MainActivity.this,new UIHandler.OnUIHandListener() {
15 | @Override
16 | public void uiHandle(Object obj, Message msg) {
17 | //处理接收消息的逻辑
18 | //...
19 | }
20 | });
21 | ```
22 | 注:在`uiHandle(Object obj, Message msg)`方法内部已经做了`msg.what`的移除,所以你在调用`uiHandle(Object obj, Message msg)`处理内部逻辑的时候,
23 | 无需再调用`removeMessages(msg.what)`方法。
24 | #### 二.发送消息
25 | `UIHandler`继承自`Handler`,故发下哦那个消息和`Handler`一样。下面给出一个`UIHandler`发送消息的示例:
26 | ```
27 | //发送消息
28 | mUIHandler.sendEmptyMessage(1);
29 | ```
30 |
--------------------------------------------------------------------------------
/read/UIPresenter使用说明.md:
--------------------------------------------------------------------------------
1 | ## UIPresenter使用说明
2 |
3 | ### 概述
4 | UIPresenter 隶属于 mvp-frame 框架,主要用于 Presenter类 中涉及到数据更新主线程ui时调用。
5 |
6 | ### 使用说明
7 | #### 一.UIPresenter使用
8 | 初始化:
9 | ```
10 | UIPresenter uiPresenter=new UIPresenter();
11 | ```
12 | 更新方法如下:
13 | ```
14 | /**更新ui的方法**/
15 | public void updateUI(Context context, PreView view, UIData data, OnUIListener listener)
16 | ```
17 | #### 二.UIPresenter在Presenter类中使用范例
18 | UIPresenter主要在Presenter类中使用,下面以在MainPresenter通过UIPresenter更新主线程UI为例:
19 | 数据实体类 UIData,请参看[源码](https://github.com/ShaoqiangPei/AndroidLibrary/blob/master/androidlibrary/commonlibrary/src/main/java/com/android/commonlibrary/entity/UIData.java)
20 | ```
21 | /**
22 | * Title:登录功能通讯逻辑层
23 | * description:
24 | * autor:pei
25 | * created on 2019/12/16
26 | */
27 | public class MainPresenter implements MainContract.Presenter{
28 |
29 | private Context mContext;
30 | private MainContract.View mView;
31 |
32 | //声明UIPresenter
33 | private UIPresenter mUiPresenter;
34 |
35 |
36 | public MainPresenter(Context context, PreView view) {
37 | this.mContext = context;
38 | this.mView = (MainContract.View) view;
39 |
40 | //初始化UIPresenter
41 | mUiPresenter=new UIPresenter();
42 | }
43 |
44 | @Override
45 | public void attachView() {//可以用来注册RxBus
46 |
47 | }
48 |
49 | @Override
50 | public void detachView() {//可以用来注销RxBus
51 |
52 | }
53 |
54 | @Override
55 | public void login() {
56 | //以下写通讯代码
57 | //......
58 |
59 | //将返回结果封装到UIData
60 |
61 | UIData uiData=new UIData();
62 | uiData.setCode(1);
63 | uiData.setNotifyId(2);
64 | uiData.setMessage("oaiuehe");
65 | uiData.setData("kajene");
66 | //将返回结果去更新ui
67 | mUiPresenter.updateUI(mContext, mView, uiData, new UIPresenter.OnUIListener() {
68 | @Override
69 | public void update(PreView view, UIData data) {
70 |
71 | //将值通过mView传给activity
72 | mView.loginSuccess(data);
73 | }
74 | });
75 | }
76 |
77 | }
78 | ```
79 |
--------------------------------------------------------------------------------
/read/VersionHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## VersionHelper使用说明
2 |
3 | ### 概述
4 | VersionHelper是用于判断app版本的工具类。
5 |
6 | ### 使用说明
7 | #### 一. 对app版本格式要求
8 | VersionHelper用于判断app版本,但是对版本格式有要求。版本格式需满足以下要求:
9 | 1. 版本字符串是三个数字,中间以“.”隔开
10 | 2. 数字不能以0开头,必须是整数
11 | 则格式类似下面这样:
12 | ```
13 | 12.5.6
14 | ```
15 | #### 二. 判断版本高低的方法
16 | 判断当前版本是否低于服务器版本,你可以用下面的方法:
17 | ```
18 | /**
19 | * 判断版本,版本号为 1.2.3样式,返回ture时表示当前版本过低,需要更新
20 | *
21 | * @param loadVersion 官网app版本号
22 | * @param currentVersion 当前app版本号
23 | * @return
24 | */
25 | public static boolean isLowerVersion(String loadVersion, String currentVersion)
26 | ```
27 | #### 三. 使用实例
28 | 在项目中使用,你可以类似下面这样:
29 | ```
30 | //获取当前app版本号,如:1.0.0
31 | String currentVersionName= AppUtil.getVersionName()
32 |
33 | //逻辑判断(versionName为服务器获取版本)
34 | if (VersionHelper.isLowerVersion(versionName, currentVersionName)) {//更新app
35 | //更新app的处理(弹出是否更新的dialog)
36 | //......
37 | } else {//不更新
38 | //不更新app(进入app)
39 | //......
40 | }
41 | ```
42 |
--------------------------------------------------------------------------------
/read2020/AES加密使用说明.md:
--------------------------------------------------------------------------------
1 | ## AES加密使用说明
2 |
3 | ### 概述
4 | `AES`作为一中高级加密方式,是目前应用十分广泛的`对称性加密`模式。为了方便使用,我封装了一个`Aes256`和`Aes128`加密工具类。
5 | 在`Android`开发过程中,我们用得比较多的是`Aes256`工具类
6 |
7 | ### 使用说明
8 | #### 一. Aes256加密使用
9 | 使用示例如下:
10 | ```
11 | //Aes256加密初始化
12 | Aes256.getInstance()
13 | // //设置加密模式,一般使用默认,除非对填充模式有特殊要求才设置(不设置的话默认为AES.CBC_PKCS5PADDING)
14 | // .setFillModel(AES.CBC_PKCS5PADDING)
15 | .setCharsetName(AES.UTF_8) //设置字符集(不设置的话默认为AES.UTF_8)
16 | .init(key,iv);//设置私钥,向量(偏移量)
17 |
18 | //Aes256加密
19 | String enCode256= Aes256.getInstance().encrypt(message);
20 | LogUtil.i("======Aes256加密结果: enCode256="+enCode256);
21 | //Aes256解密
22 | String deCode256= Aes256.getInstance().decrypt(enCode256);
23 | LogUtil.i("======Aes256解密结果: deCode256="+deCode256);
24 | ```
25 | **这里需要注意的是,我们很少去设置`setFillModel`方法,默认为`AES.CBC_PKCS5PADDING`,除非对填充模式有特殊要求才设置**
26 | #### 二. Aes128加密使用
27 | 使用示例如下:
28 | ```
29 | String message = "中国";
30 | String key = "46cc793c53dc451b";
31 |
32 | //Aes128加密初始化
33 | Aes128.getInstance()
34 | // //设置加密模式,一般使用默认,除非对填充模式有特殊要求才设置(不设置的话默认为AES.ECB_PKCS5PADDING)
35 | // .setFillModel(AES.ECB_PKCS5PADDING)
36 | .setCharsetName(AES.UTF_8) //设置字符集(不设置的话默认为AES.UTF_8)
37 | .init(key); //设置私钥
38 | //Aes128加密
39 | String enCode128 = Aes128.getInstance().encrypt(message);
40 | LogUtil.i("======Aes128加密结果: enCode128=" + enCode128);
41 | //Aes128解密
42 | String deCode128 = Aes128.getInstance().decrypt(enCode128);
43 | LogUtil.i("======Aes128解密结果: deCode128=" + deCode128);
44 | ```
45 | **这里需要注意的是,我们很少去设置`setFillModel`方法,默认为`AES.ECB_PKCS5PADDING`,除非对填充模式有特殊要求才设置**
46 | #### 三. AES 加密/解密 注意的问题
47 | 当`AES`加/解密出现问题时,我们可以从以下几个方面排除
48 | ```
49 | 1. AES 加密/解密 使用相同的密钥
50 | 2. 若涉及到偏移量,则AES 加密/解密 使用的偏移量要一样
51 | 3. AES 加密/解密 要使用相同加密数位,如都使用`AES_256`
52 | 4. AES 加密/解密 使用相同的字符集
53 | 5. AES 加密/解密 使用相同的加密,填充模式,如都使用`AES/CBC/PKCS5Padding`模式
54 | 6. 由于不同开发语言(如C 和 Java)及不同开发环境(如 Java 和 Android)的影响,可能相同的加解密算法在实现上出现差异,若你们注意到这个差异,就可能导致加解密出现问题
55 | ```
56 | 更多相关知识,可查看[AES加密(一) — 详解](https://www.jianshu.com/p/afa713345d96)
57 |
58 |
--------------------------------------------------------------------------------
/read2020/GestureHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## GestureHelper使用说明
2 |
3 | ### 概述
4 | `GestureHelper`主要用来快速实现无障碍服务`AccessibilityService`中的手势相关操作,如`水平滑动`,`竖直滑动`,`手势点击`等。
5 |
6 | ### 使用说明
7 | #### 一.GestureHelper主要方法
8 | `GestureHelper`主要有以下方法:
9 | ```
10 | /***
11 | * 设置屏幕尺寸
12 | *
13 | * @param currentScreenWidth 开发设备的实际屏幕宽度值
14 | * @param currentScreenHeight 开发设备的实际屏幕高度值
15 | * @return
16 | */
17 | public GestureHelper initSize(int currentScreenWidth,int currentScreenHeight)
18 |
19 | /**手指竖直方向滑动**/
20 | public boolean verticalSlide(AccessibilityService service,
21 | int startY, int endY,
22 | long startTime,long duration)
23 |
24 | /**手指竖直方向滑动**/
25 | public boolean verticalSlide(AccessibilityService service,
26 | int startY, int endY)
27 |
28 | /**手指水平方向滑动**/
29 | public boolean horizontalSlide(AccessibilityService service,
30 | int startX,int endX,
31 | long startTime,long duration)
32 |
33 | /**手指水平方向滑动**/
34 | public boolean horizontalSlide(AccessibilityService service,
35 | int startX,int endX)
36 |
37 | /**手势点击**/
38 | public boolean clickByGesture(AccessibilityService service, int x, int y,
39 | long startTime,long duration)
40 |
41 | /**手势点击**/
42 | public boolean clickByGesture(AccessibilityService service, int x, int y)
43 | ```
44 | #### 二.GestureHelper使用示例
45 | 初始化(假设手机屏幕宽高为 1081x1792):
46 | ```
47 | GestureHelper.getInstance().initSize(1080,1792);
48 | ```
49 | 手指向上滑动:
50 | ```
51 | //手指向上滑动
52 | GestureHelper.getInstance().verticalSlide(accessibilityService,896,300);
53 | ```
54 | 手指从右向左滑动:
55 | ```
56 | //手指从右向左滑动
57 | GestureHelper.getInstance().horizontalSlide(accessibilityService,980,100);
58 | ```
59 | 点击界面上的坐标点:
60 | ```
61 | //点击界面上的坐标点
62 | GestureHelper.getInstance().clickByGesture(accessibilityService,400,400);
63 | ```
64 |
65 |
--------------------------------------------------------------------------------
/read2020/RandomUtil使用说明.md:
--------------------------------------------------------------------------------
1 | ## RandomUtil使用说明
2 |
3 | ### 概述
4 | `RandomUtil`主要用于处理事件概率执行场景。当我们知道某事件可能发生的概率时,又需要判断该事件在此概率下会不会执行时,就可以使用此类做处理。
5 |
6 | ### 使用方法
7 | #### 一. RandomUtil 中方法简介
8 | `RandomUtil`作为一个概率执行的工具类,具有以下几个方法:
9 | ```
10 | /***
11 | * 随机生成 [start,end] 之间的数字
12 | *
13 | * @param start
14 | * @param end
15 | * @return
16 | */
17 | public static int getRandomInt(int start,int end)
18 |
19 | /***
20 | * 根据概率执行
21 | *
22 | * @param rate 概率范围[0.0000,1.0000] 小数点后保留4位小数
23 | * @return true:执行 false:不执行
24 | */
25 | public static boolean getProbability(double rate)
26 |
27 | /****
28 | * 根据概率执行
29 | *
30 | * @param rate 概率范围[0.0000,maxRate] 小数点后保留4位小数
31 | * @param maxRate 最大概率范围
32 | * @return true:执行 false:不执行
33 | */
34 | public static boolean getProbability(double rate,double maxRate)
35 |
36 | /***
37 | * 给一个集合(map)设置item,并给每个item设置执行概率
38 | *
39 | * @param map 集合
40 | * @param key item
41 | * @param probability 概率
42 | */
43 | public static void putProbability(Mapmap,String key,double probability)
44 |
45 | /***
46 | * map中单个key根据概率是否执行
47 | *
48 | * @param key
49 | * @return true:执行 false:不执行
50 | */
51 | public static boolean getProbabilityByKey(Map map, String key)
52 | ```
53 | #### 二. RandomUtil 在 Activity 中的使用
54 | 下面贴出`RandomUtil`在`Activity`中使用时计算单个事件和单个事件在集合中执行可能性的主要代码:
55 | ```
56 | //计算单个概率,总概率为1
57 | boolean flag = RandomUtil.getProbability(0.6);
58 | if (flag) {
59 | LogUtil.i("=====总概率为1,该执行概率为0.6,是否会执行:是");
60 | } else {
61 | LogUtil.i("=====总概率为1,该执行概率为0.6,是否会执行:否");
62 | }
63 |
64 | //计算一组数据中单个item执行的概率
65 | Mapmap=new HashMap<>();
66 | //设置集合
67 | RandomUtil.putProbability(map,"逛街",0.6);
68 | RandomUtil.putProbability(map,"看电影",0.2);
69 | RandomUtil.putProbability(map,"吃饭",0.3);
70 | //是否吃饭
71 | boolean eatFlag=RandomUtil.getProbabilityByKey(map,"吃饭");
72 | if(eatFlag){
73 | LogUtil.i("===去吃饭===");
74 | }else{
75 | LogUtil.i("===做其他的事===");
76 | }
77 | ```
78 |
--------------------------------------------------------------------------------
/read2020/ScreenBrightUtil使用说明.md:
--------------------------------------------------------------------------------
1 | ## ScreenBrightUtil使用说明
2 |
3 | ### 简介
4 | `ScreenBrightUtil`是一个快速 `获取/设置` 当前屏幕亮度的工具类,其还有 设置和取消 屏幕常亮的方法。对于需要涉及屏幕亮度功能使用的时候,有恨到帮助。
5 |
6 | ### 使用说明
7 | #### 一. 需要权限
8 | `ScreenBrightUtil`在使用前,需要在`Androidmanifast.xml`中添加如下权限:
9 | ```
10 |
11 | ```
12 | #### 二. 主要方法
13 | `ScreenBrightUtil`主要有以下几个方法:
14 | ```
15 | /***
16 | * 获取屏幕亮度
17 | *
18 | * 注:屏幕亮度最亮255,最暗0
19 | */
20 | public static int getScreenBrightness(Context context)
21 |
22 | /***
23 | * 设置屏幕亮度
24 | *
25 | * 注:屏幕亮度最亮255,最暗0
26 | */
27 | public static void setScreenBrightness(int brightness,Context context)
28 |
29 | /**设置屏幕最亮**/
30 | public static void setMaxBrightness(Context context)
31 |
32 | /**设置屏幕最暗**/
33 | public static void setMinBrightness(Context context)
34 |
35 | /***
36 | * 设置屏幕常亮
37 | * 需要在界面调用 "setContentView(R.layout.布局id);" 之前调用。
38 | * @param context
39 | */
40 | public static void setScreenKeepOn(Context context)
41 |
42 | /***
43 | * 清除屏幕常亮
44 | *
45 | * 常在activity的onPause()周期内调用(仅供参考)
46 | * @param context
47 | */
48 | public static void cancelScreenKeepOn(Context context)
49 | ```
50 |
--------------------------------------------------------------------------------
/read2020/ScreenOrientationUtil使用说明.md:
--------------------------------------------------------------------------------
1 | ## ScreenOrientationUtil使用说明
2 |
3 | ### 简介
4 | `ScreenOrientationUtil`是一个能方便设置手机屏幕方向的工具类,使用它你能快捷的设置手机当前界面的屏幕方向。
5 |
6 | ### 使用说明
7 | `ScreenOrientationUtil` 主要有以下方法:
8 |
9 | ```
10 | /**设置竖屏**/
11 | public static void setPortrait(Activity activity)
12 |
13 | /**设置竖屏**/
14 | public static void setLandscape(Activity activity)
15 | ```
16 |
--------------------------------------------------------------------------------
/read2020/SmallWidthDimensHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## SmallWidthDimensHelper使用说明
2 |
3 | ### 概述
4 | `SmallWidthDimensHelper`采用的是`最小屏幕宽度适配原理`.结合此类的运用,我们可以在`Android`项目的
5 | `res/`文件夹下批量生成类似`values-swxxxdp`的文件夹,其中`xxxdp`表示屏幕的最小宽度。
6 |
7 | ### 一.概念理解
8 | #### 1.1 最小宽度的理解
9 | 之前我们已经讲过屏幕适配的原理是: `px=(实际分辨率/涉及基准分辨率)*dp`,由于无法兼顾横竖两个方向,所以会采取宽,或者高的一个方向来适配。
10 | 今天要讲的最小宽度`smallWidth`适配与之前又有所区别。最小宽度是指对手机或平板而言,最短的两条边,不一定是屏幕的宽度。
11 | (例如对平板而言,有的高度其实是小于宽度的,这是所谓的最小宽度其实是平板的高度)
12 | #### 1.2 values文件夹理解
13 | 利用`SmallWidthDimensHelper`帮助类,我们生成的`values`文件夹名字类似如下:
14 | ```
15 | values-sw240dp
16 | values-sw360dp
17 | values-sw400dp
18 | values-sw960dp
19 | values-sw1080dp
20 | ......
21 | ```
22 | 其中的`240dp`,`360dp`,`400dp`等表示的就是屏幕的最小宽度。
23 | 以我手机屏幕尺寸: 1080x2032,dpi=480,density(屏幕像素比例)=3.0,接着有一个smallwidthDensity(最小宽度)=360.0,这里想告诉大家的是
24 | 手机的屏幕最小宽度并不是手机屏幕尺寸,且每个手机的smallwidthDensity(最小宽度)也是固定的。
25 | ### 二.SmallWidthDimensHelper屏幕values文件夹生成帮助类的使用
26 | `SmallWidthDimensHelper`类的使用是要在`Android`项目中新建一个`Java_module`,然后在`Java`的`main`方法中执行以下调用:
27 | ```
28 | public static void main(String[] args) {
29 | System.out.println("======我是中国人=======");
30 |
31 | SmallWidthDimensHelper helper = new SmallWidthDimensHelper();
32 | helper.setBase(1080, 1920) //设计图基准宽高
33 | .setDefaultScale(1.0f) //默认缩放比
34 | .createSmallWidthDimens(); //最小宽度适配
35 | }
36 | ```
37 | 以上代码的`setBase(1080, 1920)`设置的是设计图即`UI`给出的基准屏幕宽高, `setDefaultScale(1.0f)`设置的是默认`values`文件夹中`dp`和实际`dp`的比值
38 | 生成的文件夹列表大致如下:
39 | ```
40 | values-sw240dp
41 | values-sw360dp
42 | values-sw400dp
43 | values-sw960dp
44 | values-sw1080dp
45 | ......
46 | ```
47 | 每个`values`文件夹下有一个`dimens.xml`文件,该文件打开类容大致如下:
48 | ```
49 |
50 |
51 | 0.0dp
52 | 0.29dp
53 | 0.59dp
54 | 0.88dp
55 | 1.18dp
56 | 1.48dp
57 | 1.77dp
58 | 2.07dp
59 | 2.37dp
60 | ......
61 |
62 | ```
63 | 注意,这里生成的值也是`dp`。
64 | 这样的话我们就可以在项目中使用`values`文件夹中的`dp`值达到屏幕适配目的了。
65 |
66 |
--------------------------------------------------------------------------------
/read2020/WidthHeightDimensHelper使用说明.md:
--------------------------------------------------------------------------------
1 | ## WidthHeightDimensHelper使用说明
2 |
3 | ### 概述
4 | `WidthHeightDimensHelper`作为一个`android`屏幕适配帮助类,主要用于生成`res/`文件夹下不同`values`文件夹。
5 | 使用的是宽高限定符原理。
6 |
7 | ### 使用
8 | 在你`Android`项目下建`java_module`,然后将`WidthHeightDimensHelper`复制到此`module`下,接着在`java`的
9 | `Main`方法中执行以下代码:
10 |
11 | ```
12 | public static void main(String[] args) {
13 | System.out.println("======我是中国人=======");
14 |
15 | WidthHeightDimensHelper helper=new WidthHeightDimensHelper();
16 | helper.setBaseWidth(1080,1920) //设计图基准宽高
17 | .setDefaultScale(1.0f) //默认缩放比
18 | .createWidthDimens(); //宽度基准适配
19 | // .createHeightDimens(); //高度基准适配
20 |
21 | }
22 | ```
23 | 以上需要说明的是,`setBaseWidth(1080,1920)`中传入的是设计图的基准屏幕宽高。
24 | `setDefaultScale(1.0f)`设置的是默认布局中`dp`和`px`缩放比例。
25 | 然后`createWidthDimens();`表示是以宽度进行生成`values`文件适配,
26 | `createHeightDimens();`表示的是以高度进行生成`values`文件适配。
27 | 一般情况下,我们采用以宽度进行生成`values`文件适配,然后在竖直方向辅以滚动,以达到屏幕适配的目的。
28 |
29 | 最后会在`Android`项目的`res\`文件夹下生成一系列`values`文件夹,部分如下:
30 |
31 | ```
32 | values
33 | valuse-320x240
34 | valuse-480x320
35 | valuse-800x480
36 | valuse-800x600
37 | ...
38 | ```
39 | 这样我们就生成很多布局对应需要的`dp`和`px`对等关系了。
40 | 让我们打开一个`dimens`文件看看(以`values-19200x1200`为例),该`dimens`文件内容如下:
41 |
42 | ```
43 |
44 |
45 | 1.11px
46 | 2.22px
47 | 3.33px
48 | 4.44px
49 | 5.55px
50 | 6.66px
51 | 7.77px
52 | 8.88px
53 | 10.0px
54 | ......
55 |
56 |
57 | ```
58 | 在`Activity`的布局中,我们就可以使用`values`文件夹中`dimen`值来达到屏幕适配的目的了。
59 |
60 |
61 |
--------------------------------------------------------------------------------