评论

收藏

[Hbase] Android 无缝换肤深入了解与使用,安卓卡顿

数据库 数据库 发布于:2021-12-27 21:25 | 阅读数:417 | 评论:0

String resName = context.getResources().getResourceEntryName(resId);
int trueResId = mResources.getIdentifier(resName, "color", skinPackageName);
int trueColor;
if (trueResId == 0) {
trueColor = originColor;
} else {
trueColor = mResources.getColor(trueResId);
}
return trueColor;
}
当要通过资源id获取图片的时候

  • 和上面获取颜色是差不多的
  • 只是在图片在drawable目录还是mipmap目录进行了判断
public Drawable getDrawable(int resId) {
Drawable originDrawable = ContextCompat.getDrawable(context, resId);
if (mResources == null || isDefaultSkin) {
return originDrawable;
}
String resName = context.getResources().getResourceEntryName(resId);
int trueResId = mResources.getIdentifier(resName, "drawable", skinPackageName);
Drawable trueDrawable;
if (trueResId == 0) {
trueResId = mResources.getIdentifier(resName, "mipmap", skinPackageName);
}
if (trueResId == 0) {
trueDrawable = originDrawable;
} else {
if (android.os.Build.VERSION.SDK_INT < 22) {
trueDrawable = mResources.getDrawable(trueResId);
} else {
trueDrawable = mResources.getDrawable(trueResId, null);
}
}
return trueDrawable;
}

对所有view进行拦截处理

  • 自己实现LayoutInflater.Factory2接口来替换系统默认的
那么如何替换呢?


  • 就这样通过在Activity方法中super.onCreate之前调用
  • 代码位置:[SkinBaseActivity.java]( )
@Override
protected void onCreate(Bundle savedInstanceState) {
mSkinInflaterFactory = new SkinInflaterFactory(this);//自定义的Factory
LayoutInflaterCompat.setFactory2(getLayoutInflater(), mSkinInflaterFactory);
super.onCreate(savedInstanceState);
}
我们使用的Activity一般是AppCompatActivity在里面的onCreate方法中也有对其的设置和初始化,但是setFactory方法只能被调用一次,导致默认的一些初始化操作没有被调用,这么操作?


  • 这是实现了LayoutInflater.Factory2接口的类,看onCreateView方法中。在进行其他操作前调用delegate.createView(parent, name, context, attrs)处理系统的那一套逻辑。
  • attrs.getAttributeBooleanValue获取当前view是否是可换肤的,第一个参数是xml名字空间,第二个参数是属性名,第三个参数是默认值。这里相当于是attrs.getAttributeBooleanValue("http://schemas.android.com/android/skin", "enable", false)
  • 代码位置:[SkinInflaterFactory.java]( )
public class SkinInflaterFactory implements LayoutInflater.Factory2 {
private AppCompatActivity mAppCompatActivity;

public SkinInflaterFactory(AppCompatActivity appCompatActivity) {
this.mAppCompatActivity = appCompatActivity;}
@Overridebr/>//如果属性是style,例如xml中设置:style="@style/test_style"
关注下面的标签,发现更多相似文章