Skip to content

Commit

Permalink
重大更新: 同时兼容 Androidx 和 Support, 框架会根据您项目的依赖情况自动选择对应的 Library
Browse files Browse the repository at this point in the history
  • Loading branch information
JessYanCoding committed Jan 21, 2020
1 parent e2683c0 commit fc595c8
Show file tree
Hide file tree
Showing 11 changed files with 115 additions and 32 deletions.
1 change: 1 addition & 0 deletions autosize/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ android {

dependencies {
compileOnly rootProject.appcompat_v7
compileOnly rootProject.androidx_appcompat
}

apply from: 'bintray.gradle'
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;

import static me.jessyan.autosize.AutoSizeConfig.DEPENDENCY_ANDROIDX;
import static me.jessyan.autosize.AutoSizeConfig.DEPENDENCY_SUPPORT;

/**
* ================================================
Expand All @@ -37,20 +38,27 @@ public class ActivityLifecycleCallbacksImpl implements Application.ActivityLifec
*/
private AutoAdaptStrategy mAutoAdaptStrategy;
/**
* 让 {@link Fragment} 支持自定义适配参数
* 让 Fragment 支持自定义适配参数
*/
private FragmentLifecycleCallbacksImpl mFragmentLifecycleCallbacks;
private FragmentLifecycleCallbacksImplToAndroidx mFragmentLifecycleCallbacksToAndroidx;

public ActivityLifecycleCallbacksImpl(AutoAdaptStrategy autoAdaptStrategy) {
mFragmentLifecycleCallbacks = new FragmentLifecycleCallbacksImpl(autoAdaptStrategy);
if (DEPENDENCY_ANDROIDX) {
mFragmentLifecycleCallbacksToAndroidx = new FragmentLifecycleCallbacksImplToAndroidx(autoAdaptStrategy);
} else if (DEPENDENCY_SUPPORT){
mFragmentLifecycleCallbacks = new FragmentLifecycleCallbacksImpl(autoAdaptStrategy);
}
mAutoAdaptStrategy = autoAdaptStrategy;
}

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (AutoSizeConfig.getInstance().isCustomFragment()) {
if (activity instanceof FragmentActivity) {
((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacks, true);
if (mFragmentLifecycleCallbacksToAndroidx != null && activity instanceof androidx.fragment.app.FragmentActivity) {
((androidx.fragment.app.FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacksToAndroidx, true);
} else if (mFragmentLifecycleCallbacks != null && activity instanceof android.support.v4.app.FragmentActivity) {
((android.support.v4.app.FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragmentLifecycleCallbacks, true);
}
}

Expand Down Expand Up @@ -99,6 +107,10 @@ public void onActivityDestroyed(Activity activity) {
*/
public void setAutoAdaptStrategy(AutoAdaptStrategy autoAdaptStrategy) {
mAutoAdaptStrategy = autoAdaptStrategy;
mFragmentLifecycleCallbacks.setAutoAdaptStrategy(autoAdaptStrategy);
if (mFragmentLifecycleCallbacksToAndroidx != null) {
mFragmentLifecycleCallbacksToAndroidx.setAutoAdaptStrategy(autoAdaptStrategy);
} else if (mFragmentLifecycleCallbacks != null) {
mFragmentLifecycleCallbacks.setAutoAdaptStrategy(autoAdaptStrategy);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import android.app.Activity;
import android.app.Application;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;

/**
Expand All @@ -36,7 +35,7 @@ public interface AutoAdaptStrategy {
/**
* 开始执行屏幕适配逻辑
*
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 {@link Fragment})
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 Fragment)
* @param activity 需要拿到当前的 {@link Activity} 才能修改 {@link DisplayMetrics#density}
*/
void applyAdapt(Object target, Activity activity);
Expand Down
10 changes: 5 additions & 5 deletions autosize/src/main/java/me/jessyan/autosize/AutoSize.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
/**
* ================================================
* AndroidAutoSize 用于屏幕适配的核心方法都在这里, 核心原理来自于 <a href="https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA">今日头条官方适配方案</a>
* 此方案只要应用到 {@link Activity} 上, 这个 {@link Activity} 下的所有 {@link android.support.v4.app.Fragment}、{@link Dialog}、
* 此方案只要应用到 {@link Activity} 上, 这个 {@link Activity} 下的所有 Fragment、{@link Dialog}、
* 自定义 {@link View} 都会达到适配的效果, 如果某个页面不想使用适配请让该 {@link Activity} 实现 {@link CancelAdapt}
* <p>
* 任何方案都不可能完美, 在成本和收益中做出取舍, 选择出最适合自己的方案即可, 在没有更好的方案出来之前, 只有继续忍耐它的不完美, 或者自己作出改变
Expand Down Expand Up @@ -97,10 +97,10 @@ public static void autoConvertDensityOfGlobal(Activity activity) {
}

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

/**
* 使用外部三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 的自定义适配参数进行适配
* 使用外部三方库的 {@link Activity} 或 Fragment 的自定义适配参数进行适配
*
* @param activity {@link Activity}
* @param externalAdaptInfo 三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
* @param externalAdaptInfo 三方库的 {@link Activity} 或 Fragment 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
*/
public static void autoConvertDensityOfExternalAdaptInfo(Activity activity, ExternalAdaptInfo externalAdaptInfo) {
Preconditions.checkNotNull(externalAdaptInfo, "externalAdaptInfo == null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ public static void autoConvertDensityOfGlobal(Resources resources) {
}

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

/**
* 使用外部三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 的自定义适配参数进行适配
* 使用外部三方库的 {@link Activity} 或 Fragment 的自定义适配参数进行适配
*
* @param resources {@link Resources}
* @param externalAdaptInfo 三方库的 {@link Activity} 或 {@link android.support.v4.app.Fragment} 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
* @param externalAdaptInfo 三方库的 {@link Activity} 或 Fragment 提供的适配参数, 需要配合 {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
*/
public static void autoConvertDensityOfExternalAdaptInfo(Resources resources, ExternalAdaptInfo externalAdaptInfo) {
Preconditions.checkNotNull(externalAdaptInfo, "externalAdaptInfo == null");
Expand Down
25 changes: 21 additions & 4 deletions autosize/src/main/java/me/jessyan/autosize/AutoSizeConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;

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

static {
DEPENDENCY_ANDROIDX = findClassByClassName("androidx.fragment.app.FragmentActivity");
DEPENDENCY_SUPPORT = findClassByClassName("android.support.v4.app.FragmentActivity");
}

private static boolean findClassByClassName(String className) {
boolean hasDependency;
try {
Class.forName(className);
hasDependency = true;
} catch (ClassNotFoundException e) {
hasDependency = false;
}
return hasDependency;
}

public static AutoSizeConfig getInstance() {
if (sInstance == null) {
synchronized (AutoSizeConfig.class) {
Expand Down Expand Up @@ -360,7 +377,7 @@ public AutoSizeConfig setLog(boolean log) {
}

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

/**
* 框架是否已经开启支持自定义 {@link Fragment} 的适配参数
* 框架是否已经开启支持自定义 Fragment 的适配参数
*
* @return {@code true} 为支持
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* Copyright 2018 JessYan
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.jessyan.autosize;

import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

/**
* ================================================
* {@link FragmentLifecycleCallbacksImplToAndroidx} 可用来代替在 BaseFragment 中加入适配代码的传统方式
* {@link FragmentLifecycleCallbacksImplToAndroidx} 这种方案类似于 AOP, 面向接口, 侵入性低, 方便统一管理, 扩展性强, 并且也支持适配三方库的 {@link Fragment}
* <p>
* Created by JessYan on 2018/8/25 13:52
* <a href="mailto:jess.yan.effort@gmail.com">Contact me</a>
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
public class FragmentLifecycleCallbacksImplToAndroidx extends FragmentManager.FragmentLifecycleCallbacks {
/**
* 屏幕适配逻辑策略类
*/
private AutoAdaptStrategy mAutoAdaptStrategy;

public FragmentLifecycleCallbacksImplToAndroidx(AutoAdaptStrategy autoAdaptStrategy) {
mAutoAdaptStrategy = autoAdaptStrategy;
}

@Override
public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {
if (mAutoAdaptStrategy != null) {
mAutoAdaptStrategy.applyAdapt(f, f.getActivity());
}
}

/**
* 设置屏幕适配逻辑策略类
*
* @param autoAdaptStrategy {@link AutoAdaptStrategy}
*/
public void setAutoAdaptStrategy(AutoAdaptStrategy autoAdaptStrategy) {
mAutoAdaptStrategy = autoAdaptStrategy;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package me.jessyan.autosize.external;

import android.app.Activity;
import android.support.v4.app.Fragment;

import java.util.ArrayList;
import java.util.HashMap;
Expand Down Expand Up @@ -49,7 +48,7 @@ public class ExternalAdaptManager {
* 支持链式调用, 如:
* {@link ExternalAdaptManager#addCancelAdaptOfActivity(Class)#addCancelAdaptOfActivity(Class)}
*
* @param targetClass {@link Activity} class, {@link Fragment} class
* @param targetClass {@link Activity} class, Fragment class
*/
public synchronized ExternalAdaptManager addCancelAdaptOfActivity(Class<?> targetClass) {
Preconditions.checkNotNull(targetClass, "targetClass == null");
Expand Down Expand Up @@ -78,7 +77,7 @@ public synchronized ExternalAdaptManager addCancelAdaptOfActivity(Class<?> targe
* 支持链式调用, 如:
* {@link ExternalAdaptManager#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)#addExternalAdaptInfoOfActivity(Class, ExternalAdaptInfo)}
*
* @param targetClass {@link Activity} class, {@link Fragment} class
* @param targetClass {@link Activity} class, Fragment class
* @param info {@link ExternalAdaptInfo} 适配参数
*/
public synchronized ExternalAdaptManager addExternalAdaptInfoOfActivity(Class<?> targetClass, ExternalAdaptInfo info) {
Expand All @@ -96,7 +95,7 @@ public synchronized ExternalAdaptManager addExternalAdaptInfoOfActivity(Class<?>
/**
* 这个 {@link Activity} 是否存在在取消适配的列表中, 如果在, 则该 {@link Activity} 适配失效
*
* @param targetClass {@link Activity} class, {@link Fragment} class
* @param targetClass {@link Activity} class, Fragment class
* @return {@code true} 为存在, {@code false} 为不存在
*/
public synchronized boolean isCancelAdapt(Class<?> targetClass) {
Expand All @@ -110,7 +109,7 @@ public synchronized boolean isCancelAdapt(Class<?> targetClass) {
/**
* 这个 {@link Activity} 是否提供有自定义的适配参数, 如果有则使用此适配参数进行适配
*
* @param targetClass {@link Activity} class, {@link Fragment} class
* @param targetClass {@link Activity} class, Fragment class
* @return 如果返回 {@code null} 则说明该 {@link Activity} 没有提供自定义的适配参数
*/
public synchronized ExternalAdaptInfo getExternalAdaptInfoOfActivity(Class<?> targetClass) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package me.jessyan.autosize;

import android.app.Activity;
import android.support.v4.app.Fragment;

/**
* ================================================
Expand All @@ -31,15 +30,15 @@ public interface onAdaptListener {
/**
* 在屏幕适配前调用
*
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 {@link Fragment})
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 Fragment)
* @param activity 当前 {@link Activity}
*/
void onAdaptBefore(Object target, Activity activity);

/**
* 在屏幕适配后调用
*
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 {@link Fragment})
* @param target 需要屏幕适配的对象 (可能是 {@link Activity} 或者 Fragment)
* @param activity 当前 {@link Activity}
*/
void onAdaptAfter(Object target, Activity activity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/
package me.jessyan.autosize.utils;

import android.support.annotation.RestrictTo;
import android.util.Log;

/**
Expand All @@ -25,7 +24,6 @@
* <a href="https://github.com/JessYanCoding">Follow me</a>
* ================================================
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
public class AutoSizeLog {
private static final String TAG = "AndroidAutoSize";
private static boolean debug;
Expand Down
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,5 @@ ext {
versionCode = 34
versionName = "1.1.2"
appcompat_v7 = "com.android.support:appcompat-v7:28.0.0"
androidx_appcompat = "androidx.appcompat:appcompat:1.1.0"
}

0 comments on commit fc595c8

Please sign in to comment.