Skip to content

Commit fc595c8

Browse files
committed
重大更新: 同时兼容 Androidx 和 Support, 框架会根据您项目的依赖情况自动选择对应的 Library
1 parent e2683c0 commit fc595c8

File tree

11 files changed

+115
-32
lines changed

11 files changed

+115
-32
lines changed

autosize/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ android {
2727

2828
dependencies {
2929
compileOnly rootProject.appcompat_v7
30+
compileOnly rootProject.androidx_appcompat
3031
}
3132

3233
apply from: 'bintray.gradle'

autosize/src/main/java/me/jessyan/autosize/ActivityLifecycleCallbacksImpl.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
import android.app.Activity;
1919
import android.app.Application;
2020
import android.os.Bundle;
21-
import android.support.v4.app.Fragment;
22-
import android.support.v4.app.FragmentActivity;
21+
22+
import static me.jessyan.autosize.AutoSizeConfig.DEPENDENCY_ANDROIDX;
23+
import static me.jessyan.autosize.AutoSizeConfig.DEPENDENCY_SUPPORT;
2324

2425
/**
2526
* ================================================
@@ -37,20 +38,27 @@ public class ActivityLifecycleCallbacksImpl implements Application.ActivityLifec
3738
*/
3839
private AutoAdaptStrategy mAutoAdaptStrategy;
3940
/**
40-
* 让 {@link Fragment} 支持自定义适配参数
41+
* 让 Fragment 支持自定义适配参数
4142
*/
4243
private FragmentLifecycleCallbacksImpl mFragmentLifecycleCallbacks;
44+
private FragmentLifecycleCallbacksImplToAndroidx mFragmentLifecycleCallbacksToAndroidx;
4345

4446
public ActivityLifecycleCallbacksImpl(AutoAdaptStrategy autoAdaptStrategy) {
45-
mFragmentLifecycleCallbacks = new FragmentLifecycleCallbacksImpl(autoAdaptStrategy);
47+
if (DEPENDENCY_ANDROIDX) {
48+
mFragmentLifecycleCallbacksToAndroidx = new FragmentLifecycleCallbacksImplToAndroidx(autoAdaptStrategy);
49+
} else if (DEPENDENCY_SUPPORT){
50+
mFragmentLifecycleCallbacks = new FragmentLifecycleCallbacksImpl(autoAdaptStrategy);
51+
}
4652
mAutoAdaptStrategy = autoAdaptStrategy;
4753
}
4854

4955
@Override
5056
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
5157
if (AutoSizeConfig.getInstance().isCustomFragment()) {
52-
if (activity instanceof FragmentActivity) {
53-
((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacks, true);
58+
if (mFragmentLifecycleCallbacksToAndroidx != null && activity instanceof androidx.fragment.app.FragmentActivity) {
59+
((androidx.fragment.app.FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacksToAndroidx, true);
60+
} else if (mFragmentLifecycleCallbacks != null && activity instanceof android.support.v4.app.FragmentActivity) {
61+
((android.support.v4.app.FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacks, true);
5462
}
5563
}
5664

@@ -99,6 +107,10 @@ public void onActivityDestroyed(Activity activity) {
99107
*/
100108
public void setAutoAdaptStrategy(AutoAdaptStrategy autoAdaptStrategy) {
101109
mAutoAdaptStrategy = autoAdaptStrategy;
102-
mFragmentLifecycleCallbacks.setAutoAdaptStrategy(autoAdaptStrategy);
110+
if (mFragmentLifecycleCallbacksToAndroidx != null) {
111+
mFragmentLifecycleCallbacksToAndroidx.setAutoAdaptStrategy(autoAdaptStrategy);
112+
} else if (mFragmentLifecycleCallbacks != null) {
113+
mFragmentLifecycleCallbacks.setAutoAdaptStrategy(autoAdaptStrategy);
114+
}
103115
}
104116
}

autosize/src/main/java/me/jessyan/autosize/AutoAdaptStrategy.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import android.app.Activity;
1919
import android.app.Application;
20-
import android.support.v4.app.Fragment;
2120
import android.util.DisplayMetrics;
2221

2322
/**
@@ -36,7 +35,7 @@ public interface AutoAdaptStrategy {
3635
/**
3736
* 开始执行屏幕适配逻辑
3837
*
39-
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 {@link Fragment})
38+
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 Fragment)
4039
* @param activity 需要拿到当前的 {@link Activity} 才能修改 {@link DisplayMetrics#density}
4140
*/
4241
void applyAdapt(Object target, Activity activity);

autosize/src/main/java/me/jessyan/autosize/AutoSize.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
/**
4040
* ================================================
4141
* AndroidAutoSize 用于屏幕适配的核心方法都在这里, 核心原理来自于 <a href="https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA">今日头条官方适配方案</a>
42-
* 此方案只要应用到 {@link Activity} 上, 这个 {@link Activity} 下的所有 {@link android.support.v4.app.Fragment}、{@link Dialog}、
42+
* 此方案只要应用到 {@link Activity} 上, 这个 {@link Activity} 下的所有 Fragment、{@link Dialog}、
4343
* 自定义 {@link View} 都会达到适配的效果, 如果某个页面不想使用适配请让该 {@link Activity} 实现 {@link CancelAdapt}
4444
* <p>
4545
* 任何方案都不可能完美, 在成本和收益中做出取舍, 选择出最适合自己的方案即可, 在没有更好的方案出来之前, 只有继续忍耐它的不完美, 或者自己作出改变
@@ -97,10 +97,10 @@ public static void autoConvertDensityOfGlobal(Activity activity) {
9797
}
9898

9999
/**
100-
* 使用 {@link Activity} 或 {@link android.support.v4.app.Fragment} 的自定义参数进行适配
100+
* 使用 {@link Activity} 或 Fragment 的自定义参数进行适配
101101
*
102102
* @param activity {@link Activity}
103-
* @param customAdapt {@link Activity} 或 {@link android.support.v4.app.Fragment} 需实现 {@link CustomAdapt}
103+
* @param customAdapt {@link Activity} 或 Fragment 需实现 {@link CustomAdapt}
104104
*/
105105
public static void autoConvertDensityOfCustomAdapt(Activity activity, CustomAdapt customAdapt) {
106106
Preconditions.checkNotNull(customAdapt, "customAdapt == null");
@@ -118,10 +118,10 @@ public static void autoConvertDensityOfCustomAdapt(Activity activity, CustomAdap
118118
}
119119

120120
/**
121-
* 使用外部三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 的自定义适配参数进行适配
121+
* 使用外部三方库的 {@link Activity} 或 Fragment 的自定义适配参数进行适配
122122
*
123123
* @param activity {@link Activity}
124-
* @param externalAdaptInfo 三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
124+
* @param externalAdaptInfo 三方库的 {@link Activity} 或 Fragment 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
125125
*/
126126
public static void autoConvertDensityOfExternalAdaptInfo(Activity activity, ExternalAdaptInfo externalAdaptInfo) {
127127
Preconditions.checkNotNull(externalAdaptInfo, "externalAdaptInfo == null");

autosize/src/main/java/me/jessyan/autosize/AutoSizeCompat.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ public static void autoConvertDensityOfGlobal(Resources resources) {
5959
}
6060

6161
/**
62-
* 使用 {@link Activity} 或 {@link android.support.v4.app.Fragment} 的自定义参数进行适配
62+
* 使用 {@link Activity} 或 Fragment 的自定义参数进行适配
6363
*
6464
* @param resources {@link Resources}
65-
* @param customAdapt {@link Activity} 或 {@link android.support.v4.app.Fragment} 需实现 {@link CustomAdapt}
65+
* @param customAdapt {@link Activity} 或 Fragment 需实现 {@link CustomAdapt}
6666
*/
6767
public static void autoConvertDensityOfCustomAdapt(Resources resources, CustomAdapt customAdapt) {
6868
Preconditions.checkNotNull(customAdapt, "customAdapt == null");
@@ -80,10 +80,10 @@ public static void autoConvertDensityOfCustomAdapt(Resources resources, CustomAd
8080
}
8181

8282
/**
83-
* 使用外部三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 的自定义适配参数进行适配
83+
* 使用外部三方库的 {@link Activity} 或 Fragment 的自定义适配参数进行适配
8484
*
8585
* @param resources {@link Resources}
86-
* @param externalAdaptInfo 三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
86+
* @param externalAdaptInfo 三方库的 {@link Activity} 或 Fragment 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
8787
*/
8888
public static void autoConvertDensityOfExternalAdaptInfo(Resources resources, ExternalAdaptInfo externalAdaptInfo) {
8989
Preconditions.checkNotNull(externalAdaptInfo, "externalAdaptInfo == null");

autosize/src/main/java/me/jessyan/autosize/AutoSizeConfig.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import android.content.pm.PackageManager;
2424
import android.content.res.Configuration;
2525
import android.content.res.Resources;
26-
import android.support.v4.app.Fragment;
2726
import android.util.DisplayMetrics;
2827

2928
import java.lang.reflect.Field;
@@ -48,6 +47,8 @@ public final class AutoSizeConfig {
4847
private static volatile AutoSizeConfig sInstance;
4948
private static final String KEY_DESIGN_WIDTH_IN_DP = "design_width_in_dp";
5049
private static final String KEY_DESIGN_HEIGHT_IN_DP = "design_height_in_dp";
50+
public static final boolean DEPENDENCY_ANDROIDX;
51+
public static final boolean DEPENDENCY_SUPPORT;
5152
private Application mApplication;
5253
/**
5354
* 用来管理外部三方库 {@link Activity} 的适配
@@ -129,7 +130,7 @@ public final class AutoSizeConfig {
129130
*/
130131
private boolean isStop;
131132
/**
132-
* 是否让框架支持自定义 {@link Fragment} 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
133+
* 是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
133134
*/
134135
private boolean isCustomFragment;
135136
/**
@@ -159,6 +160,22 @@ public final class AutoSizeConfig {
159160
*/
160161
private onAdaptListener mOnAdaptListener;
161162

163+
static {
164+
DEPENDENCY_ANDROIDX = findClassByClassName("androidx.fragment.app.FragmentActivity");
165+
DEPENDENCY_SUPPORT = findClassByClassName("android.support.v4.app.FragmentActivity");
166+
}
167+
168+
private static boolean findClassByClassName(String className) {
169+
boolean hasDependency;
170+
try {
171+
Class.forName(className);
172+
hasDependency = true;
173+
} catch (ClassNotFoundException e) {
174+
hasDependency = false;
175+
}
176+
return hasDependency;
177+
}
178+
162179
public static AutoSizeConfig getInstance() {
163180
if (sInstance == null) {
164181
synchronized (AutoSizeConfig.class) {
@@ -360,7 +377,7 @@ public AutoSizeConfig setLog(boolean log) {
360377
}
361378

362379
/**
363-
* 是否让框架支持自定义 {@link Fragment} 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
380+
* 是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
364381
*
365382
* @param customFragment {@code true} 为支持
366383
*/
@@ -370,7 +387,7 @@ public AutoSizeConfig setCustomFragment(boolean customFragment) {
370387
}
371388

372389
/**
373-
* 框架是否已经开启支持自定义 {@link Fragment} 的适配参数
390+
* 框架是否已经开启支持自定义 Fragment 的适配参数
374391
*
375392
* @return {@code true} 为支持
376393
*/
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2018 JessYan
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package me.jessyan.autosize;
17+
18+
import android.os.Bundle;
19+
import androidx.fragment.app.Fragment;
20+
import androidx.fragment.app.FragmentManager;
21+
22+
/**
23+
* ================================================
24+
* {@link FragmentLifecycleCallbacksImplToAndroidx} 可用来代替在 BaseFragment 中加入适配代码的传统方式
25+
* {@link FragmentLifecycleCallbacksImplToAndroidx} 这种方案类似于 AOP, 面向接口, 侵入性低, 方便统一管理, 扩展性强, 并且也支持适配三方库的 {@link Fragment}
26+
* <p>
27+
* Created by JessYan on 2018/8/25 13:52
28+
* <a href="mailto:[email protected]">Contact me</a>
29+
* <a href="https://github.com/JessYanCoding">Follow me</a>
30+
* ================================================
31+
*/
32+
public class FragmentLifecycleCallbacksImplToAndroidx extends FragmentManager.FragmentLifecycleCallbacks {
33+
/**
34+
* 屏幕适配逻辑策略类
35+
*/
36+
private AutoAdaptStrategy mAutoAdaptStrategy;
37+
38+
public FragmentLifecycleCallbacksImplToAndroidx(AutoAdaptStrategy autoAdaptStrategy) {
39+
mAutoAdaptStrategy = autoAdaptStrategy;
40+
}
41+
42+
@Override
43+
public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {
44+
if (mAutoAdaptStrategy != null) {
45+
mAutoAdaptStrategy.applyAdapt(f, f.getActivity());
46+
}
47+
}
48+
49+
/**
50+
* 设置屏幕适配逻辑策略类
51+
*
52+
* @param autoAdaptStrategy {@link AutoAdaptStrategy}
53+
*/
54+
public void setAutoAdaptStrategy(AutoAdaptStrategy autoAdaptStrategy) {
55+
mAutoAdaptStrategy = autoAdaptStrategy;
56+
}
57+
}

autosize/src/main/java/me/jessyan/autosize/external/ExternalAdaptManager.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package me.jessyan.autosize.external;
1717

1818
import android.app.Activity;
19-
import android.support.v4.app.Fragment;
2019

2120
import java.util.ArrayList;
2221
import java.util.HashMap;
@@ -49,7 +48,7 @@ public class ExternalAdaptManager {
4948
* 支持链式调用, 如:
5049
* {@link ExternalAdaptManager#addCancelAdaptOfActivity(Class)#addCancelAdaptOfActivity(Class)}
5150
*
52-
* @param targetClass {@link Activity} class, {@link Fragment} class
51+
* @param targetClass {@link Activity} class, Fragment class
5352
*/
5453
public synchronized ExternalAdaptManager addCancelAdaptOfActivity(Class<?> targetClass) {
5554
Preconditions.checkNotNull(targetClass, "targetClass == null");
@@ -78,7 +77,7 @@ public synchronized ExternalAdaptManager addCancelAdaptOfActivity(Class<?> targe
7877
* 支持链式调用, 如:
7978
* {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
8079
*
81-
* @param targetClass {@link Activity} class, {@link Fragment} class
80+
* @param targetClass {@link Activity} class, Fragment class
8281
* @param info {@link ExternalAdaptInfo} 适配参数
8382
*/
8483
public synchronized ExternalAdaptManager addExternalAdaptInfoOfActivity(Class<?> targetClass, ExternalAdaptInfo info) {
@@ -96,7 +95,7 @@ public synchronized ExternalAdaptManager addExternalAdaptInfoOfActivity(Class<?>
9695
/**
9796
* 这个 {@link Activity} 是否存在在取消适配的列表中, 如果在, 则该 {@link Activity} 适配失效
9897
*
99-
* @param targetClass {@link Activity} class, {@link Fragment} class
98+
* @param targetClass {@link Activity} class, Fragment class
10099
* @return {@code true} 为存在, {@code false} 为不存在
101100
*/
102101
public synchronized boolean isCancelAdapt(Class<?> targetClass) {
@@ -110,7 +109,7 @@ public synchronized boolean isCancelAdapt(Class<?> targetClass) {
110109
/**
111110
* 这个 {@link Activity} 是否提供有自定义的适配参数, 如果有则使用此适配参数进行适配
112111
*
113-
* @param targetClass {@link Activity} class, {@link Fragment} class
112+
* @param targetClass {@link Activity} class, Fragment class
114113
* @return 如果返回 {@code null} 则说明该 {@link Activity} 没有提供自定义的适配参数
115114
*/
116115
public synchronized ExternalAdaptInfo getExternalAdaptInfoOfActivity(Class<?> targetClass) {

autosize/src/main/java/me/jessyan/autosize/onAdaptListener.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
package me.jessyan.autosize;
1717

1818
import android.app.Activity;
19-
import android.support.v4.app.Fragment;
2019

2120
/**
2221
* ================================================
@@ -31,15 +30,15 @@ public interface onAdaptListener {
3130
/**
3231
* 在屏幕适配前调用
3332
*
34-
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 {@link Fragment})
33+
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 Fragment)
3534
* @param activity 当前 {@link Activity}
3635
*/
3736
void onAdaptBefore(Object target, Activity activity);
3837

3938
/**
4039
* 在屏幕适配后调用
4140
*
42-
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 {@link Fragment})
41+
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 Fragment)
4342
* @param activity 当前 {@link Activity}
4443
*/
4544
void onAdaptAfter(Object target, Activity activity);

autosize/src/main/java/me/jessyan/autosize/utils/AutoSizeLog.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package me.jessyan.autosize.utils;
1717

18-
import android.support.annotation.RestrictTo;
1918
import android.util.Log;
2019

2120
/**
@@ -25,7 +24,6 @@
2524
* <a href="https://github.com/JessYanCoding">Follow me</a>
2625
* ================================================
2726
*/
28-
@RestrictTo(RestrictTo.Scope.LIBRARY)
2927
public class AutoSizeLog {
3028
private static final String TAG = "AndroidAutoSize";
3129
private static boolean debug;

0 commit comments

Comments
 (0)