Giter Club home page Giter Club logo

androidchangeskin's Introduction

AndroidChangeSkin

一种完全无侵入的换肤方式,支持插件式和应用内,无需重启Activity.

与之前发布的ChangeSkin思路完全不同https://github.com/hongyangAndroid/ChangeSkin,主要因为ChangeSkin依赖V4,V7的版本,以及干涉系统构造View的过程,于是希望找到一个几乎没有侵入的方式来实现,于是产生了AndroidChangeSkin,两个项目各有特点,目前两个项目代码都保留,欢迎试用与反馈。

特点

  • 插件式换肤
  • 应用内换肤
  • 支持插件或者应用内多套皮肤
  • 支持动态生成addView
  • 无需重启Activity

效果图:

引入

下载changeskin,作为module依赖至主项目,例如:

dependencies {
     compile project(':changeskin')
}

或者直接添加依赖:

dependencies {
    compile 'com.zhy:changeskin:4.0.2'
}

运行

Android Studio,import Project形式导入,将skin_plugin.apk,放置到模拟器或者真机的sdcard根目录,然后运行项目。

使用

  • Application

Application中去调用SkinManager.getInstance().init(this);,未来版本可能会去除该步骤。

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        SkinManager.getInstance().init(this);
    }
}
  • Activity

在需要换肤的Activity的onCreate和onDestory中,分别:

@Override
protected void onCreate(Bundle savedInstanceState)
{ 
    SkinManager.getInstance().register(this);
    //...
}

@Override
protected void onDestroy()
{
    super.onDestroy();
    SkinManager.getInstance().unregister(this);
}
  • 布局文件

布局文件中添加支持,主要依赖于tag属性:

例如:

 <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:tag="skin:item_text_color:textColor"
        android:text="@string/hello_world"
        android:textColor="@color/item_text_color"/>

tag属性分为3部分组成:

  • skin
  • 资源的名称,即插件包中资源的名称,需要与当前app内使用的资源名称一致。
  • 支持的属性,目前支持src,background,textColor,支持扩展。

3部分,必须以:分隔拼接。

对于一个View多个属性需要换肤的,android:tag="skin:item_text_color:textColor|skin:icon:src" 同样使用|进行分隔。

简言之:如果你哪个View需要换肤,就添加tag属性,tag值按照上述方式设置即可。

  • 换肤的API

插件式:

SkinManager.getInstance().changeSkin(
	mSkinPkgPath, 
	"com.imooc.skin_plugin", 
	new ISkinChangingCallback()
    {
        @Override
        public void onStart()
        {
        }

        @Override
        public void onError(Exception e)
        {
            Toast.makeText(MainActivity.this, "换肤失败", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onComplete()
        {
            Toast.makeText(MainActivity.this, "换肤成功", Toast.LENGTH_SHORT).show();
        }
    });

应用内:

SkinManager.getInstance().changeSkin(suffix);

应用内多套皮肤以后缀就行区别,比如:main_bg,皮肤资源可以为:main_bg_red,main_bg_green等。

换肤时,直接传入后缀,例如上面描述的red,green。

androidchangeskin's People

Contributors

hongyangandroid avatar wyhuster avatar yansha87 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

androidchangeskin's Issues

backgroud 为color时 报 NotFoundException: Resource ID #0x0

页面设置:
android:tag="skin:skin_colorPrimary:background"
android:background="@color/skin_colorPrimary"
报错:
No package identifier when getting value for resource number 0x00000000
...........................
at com.zhy.changeskin.attr.SkinAttrType$1.apply(SkinAttrType.java:23)
指向:
Drawable drawable = getResourceManager().getDrawableByName(resName);
没有找到资源

convertView在换肤后创建,该view不会应用皮肤

这个换肤方案真赞!thanks a lot!!!
然后我发现个问题.
在demo中多加几个数据超过一屏,进入界面后不要滑动直接换肤.
此时converView未加入界面,所以不会换肤.就会出现convertView没有换肤的现象.
需要在新建converView后injectSkin.

SkinManager.getInstance().injectSkin(convertView);

removeAnySkin方法不能即时生效

如题,换肤过程SkinManager.getInstance().changeSkin()方法无问题,但是换肤之后调用removeAnySkin方法还原,却没有立即奏效,需要关闭Activity重启才能恢复默认的。 有没有哪位大兄弟知道怎么回事的?

color值不能为#FFF

Color值不能为#FFF,在/SkinAttrType.java#BACKGROUND#apply()中,if (color == -1) return;而当color值为#FFF的时候,转换成十进制就是-1。。。调了好久才发现是这个的问题。

app下载下来使用Android studio运行都无法运行。。。

Error:Unsupported method: BaseConfig.getApplicationIdSuffix().
The version of Gradle you connect to does not support that method.
To resolve the problem you can change/upgrade the target version of Gradle you connect to.
Alternatively, you can ignore this exception and read other information from the model.

如果activity中有多个fragment

如果activity中有多个fragment,当部分fragment没有添加到activity中时,切换皮肤,然后在去加入该fragment,这时这个fragment皮肤并没有改变,这种问题怎么解决啊?

动态设置颜色和图片时,换肤失效!

1:使用apk插件换肤时,如果在代码里动态设置颜色或者底图时,就会失败,求指教应该怎么处理!
if(true){
textview.setTextColor();
textview.setBackgroundResource(
);
}else{
textview.setTextColor();
textview.setBackgroundResource(
);
}
这种逻辑,换肤失败,求大神指教!

2:如果TextView textview = new TextView();
textview 如何在代码中设置tag, TextColor 和 Background 都需要改变!
textview.setTag();怎么写2个属性?

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/zhy/changeskin/SkinManager;

在 Application 中 初始化 出现上面这个错误

public class App extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        SkinManager.getInstance().init(this);
    }
}

log

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/zhy/changeskin/SkinManager;
                                                                 at com.dd.resttime.App.onCreate(App.java:16)
                                                                 at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:263)
                                                                 at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1034)
                                                                 at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4605)
                                                                 at android.app.ActivityThread.access$1500(ActivityThread.java:148)
                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1353)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                 at android.os.Looper.loop(Looper.java:135)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5312)
                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                 at java.lang.reflect.Method.invoke(Method.java:372)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
                                                              Caused by: java.lang.ClassNotFoundException: Didn't find class "com.zhy.changeskin.SkinManager" on path: DexPathList[[zip file "/data/app/com.xx.xxxx-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

这是什么问题呢?

ListView添加FooterView换肤出现的问题

当我使用鸿洋大神的换肤库时候我的内心是激动的,因为实在是非常方便,但是我在使用的过程中发现了一个问题,当我向listview中添加FooterView的时候如果listview显示的列表长度大于一屏并且footerview在屏幕外,这个时候换肤的话footerview的样式并不会变,如果我把footerview滑到屏幕可见的范围时换肤是可以的。我尝试添加下面的代码解决这个问题:
View view = getLayoutInflater().inflate(R.layout.item, mListView, false);
SkinManager.getInstance().injectSkin(view);
mListView.addFooterView(view);
但问题依旧存在,我正在试着分析问题出现的原因,也希望鸿洋大神能及时修复这个issue


mResource.getColor有时得到-1的值

mResource.getColor有时得到-1的值,也没抛资源找不到的异常,这是为什么呢?明明有这个资源的。
java mResources.getColor(mResources.getIdentifier(name, DEFTYPE_COLOR, mPluginPackageName));

ViewPager+Fragment 换肤设置失效

ViewPager+Fragment,如果有4个Fragment,activity加载完后后面的2个Fragment还没有初始化,里面设置的tag会失效,设置过的Fragment中的tag,如果该Fragment被销毁了在重新创建时里面的tag也会失效。

在继承BaseSkinActivity下,使用ProgressDialog,闪退异常。 Error inflating class ImageView

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xuewei/com.xuewei.activity.MainActivity}: android.view.InflateException: Binary XML file line #25: Binary XML file line #34: Error inflating class ImageView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.view.InflateException: Binary XML file line #25: Binary XML file line #34: Error inflating class ImageView
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
at com.android.internal.app.AlertController.installContent(AlertController.java:233)
at android.app.AlertDialog.onCreate(AlertDialog.java:423)
at android.app.ProgressDialog.onCreate(ProgressDialog.java:198)
at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
at android.app.Dialog.show(Dialog.java:295)
at android.app.ProgressDialog.show(ProgressDialog.java:116)
at android.app.ProgressDialog.show(ProgressDialog.java:104)
at com.xuewei.utils.MessageUtils.showProgressDialog(MessageUtils.java:47)
at com.xuewei.activity.MainActivity.initData(MainActivity.java:102)
at com.xuewei.activity.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
... 9 more
Caused by: android.view.InflateException: Binary XML file line #34: Error inflating class ImageView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:971)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:831)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
... 25 more
Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0
at android.content.res.Resources.getResourceEntryName(Resources.java:2292)
at com.zhy.changeskin.attr.SkinAttrSupport.getSkinAttrs(SkinAttrSupport.java:32)
at com.zhy.changeskin.base.BaseSkinActivity.onCreateView(BaseSkinActivity.java:63)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:746)
... 34 more
android.view.InflateException: Binary XML file line #25: Binary XML file line #34: Error inflating class ImageView
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
at com.android.internal.app.AlertController.installContent(AlertController.java:233)
at android.app.AlertDialog.onCreate(AlertDialog.java:423)
at android.app.ProgressDialog.onCreate(ProgressDialog.java:198)
at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
at android.app.Dialog.show(Dialog.java:295)
at android.app.ProgressDialog.show(ProgressDialog.java:116)
at android.app.ProgressDialog.show(ProgressDialog.java:104)
at com.xuewei.utils.MessageUtils.showProgressDialog(MessageUtils.java:47)
at com.xuewei.activity.MainActivity.initData(MainActivity.java:102)
at com.xuewei.activity.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.view.InflateException: Binary XML file line #34: Error inflating class ImageView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:971)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:831)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
... 25 more
Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0
at android.content.res.Resources.getResourceEntryName(Resources.java:2292)
at com.zhy.changeskin.attr.SkinAttrSupport.getSkinAttrs(SkinAttrSupport.java:32)
at com.zhy.changeskin.base.BaseSkinActivity.onCreateView(BaseSkinActivity.java:63)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:746)
... 34 more
android.view.InflateException: Binary XML file line #34: Error inflating class ImageView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:971)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:831)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
at com.android.internal.app.AlertController.installContent(AlertController.java:233)
at android.app.AlertDialog.onCreate(AlertDialog.java:423)
at android.app.ProgressDialog.onCreate(ProgressDialog.java:198)
at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
at android.app.Dialog.show(Dialog.java:295)
at android.app.ProgressDialog.show(ProgressDialog.java:116)
at android.app.ProgressDialog.show(ProgressDialog.java:104)
at com.xuewei.utils.MessageUtils.showProgressDialog(MessageUtils.java:47)
at com.xuewei.activity.MainActivity.initData(MainActivity.java:102)
at com.xuewei.activity.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0
at android.content.res.Resources.getResourceEntryName(Resources.java:2292)
at com.zhy.changeskin.attr.SkinAttrSupport.getSkinAttrs(SkinAttrSupport.java:32)
at com.zhy.changeskin.base.BaseSkinActivity.onCreateView(BaseSkinActivity.java:63)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:746)
... 34 more
android.content.res.Resources$NotFoundException: Unable to find resource ID #0x0
at android.content.res.Resources.getResourceEntryName(Resources.java:2292)
at com.zhy.changeskin.attr.SkinAttrSupport.getSkinAttrs(SkinAttrSupport.java:32)
at com.zhy.changeskin.base.BaseSkinActivity.onCreateView(BaseSkinActivity.java:63)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:746)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:838)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:971)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:831)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
at com.android.internal.app.AlertController.installContent(AlertController.java:233)
at android.app.AlertDialog.onCreate(AlertDialog.java:423)
at android.app.ProgressDialog.onCreate(ProgressDialog.java:198)
at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
at android.app.Dialog.show(Dialog.java:295)
at android.app.ProgressDialog.show(ProgressDialog.java:116)
at android.app.ProgressDialog.show(ProgressDialog.java:104)
at com.xuewei.utils.MessageUtils.showProgressDialog(MessageUtils.java:47)
at com.xuewei.activity.MainActivity.initData(MainActivity.java:102)
at com.xuewei.activity.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

关于 header的夜间模式切换的问题

我的搜索栏是放到 header 中的,第一次没问题,可以正常切换。
之后当 header 隐藏的时候,SearchBar 的夜间模式就不能切换了。
但是把SearchBar拉出来,不隐藏的时候是可以切换的。

  插件换肤问题

你好,洋神。请教一下,插件换肤的,皮肤包里都有什么呢。能给原码看看吗。谢谢大神

.9图片如何打包

.9图片打包之后,能找到资源但是无法正常拉伸,哪位大神知道如何处理

几个小的改进的建议,希望能采纳 。

1 actionbar如何换肤
我看其中的代码,是从activity里面content中开始遍历,而不是rootview开始

 public static List<SkinView> getSkinViews(Activity activity)
    {
        List<SkinView> skinViews = new ArrayList<SkinView>();
        ViewGroup content = (ViewGroup) activity.findViewById(android.R.id.content);
        addSkinViews(content, skinViews);
        return skinViews;
    }

2 每次换肤都开始扫描整体所有activity,如果打开的activity过多,或者activity中有较多的元素需要更换,这里能不能自身去维护skinViews,因为后续还有便利和字符串裁剪工作要做,这里能不能换成先将处于resume的activity优先换掉。然后发消息给剩下的activity的,让其在onresume中再换掉,这里的性能会不会好点?

List<SkinView> skinViews = SkinAttrSupport.getSkinViews(activity);

3 如果我没理解错,原理是通过加载宿主的资源文件,然后通过regster的方式里面调用apply去刷新regster的activity的布局,如果打开的activity过多,或者activity中有较多的元素,这个操作是不是会让activity较慢显示在用户的视野,能不能将regster的时机推迟到onResume中?

缺少业务场景下按钮不同状态切换样式

例如:一个Button按钮在可点可不可点状态下展示不同样式,但是如果使用皮肤中样式,就无法保证样式能正确显示。建议增加可以获取皮肤包资源如果,使用不同业务场景下代码切换按钮样式。

请教几个问题

1、使用这个切换皮肤,如果是 通过 加载 一个数组中的 资源,该怎么办? 设置tag肯定不行吧?
2、修改toolbar上面字体的颜色,是通过 Style设置的,怎么修改?或者怎么设置?
3、修改menu 中item的 图标和字体颜色时,MenuItem menuAdd=menu.findItem(R.id.action_add);
SkinManager.getInstance().injectSkin((View) menuAdd); 类型转换异常,应该怎么使用?

list场景下有内存泄露,会一直new SkinView,导致多次滑动之后占用的内存会一直增加

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, parent, false);
}
SkinManager.getInstance().injectSkin(convertView);
TextView tv = (TextView) convertView.findViewById(R.id.id_tv_title);
tv.setText(getItem(position));
return convertView;
}

public static SkinView getSkinView(View view) {
Object tag = view.getTag(R.id.skin_tag_id);
if (tag == null)
{
tag = view.getTag();
}
if (tag == null) return null;
if (!(tag instanceof String)) return null;
String tagStr = (String) tag;

    List<SkinAttr> skinAttrs = parseTag(tagStr);
    if (!skinAttrs.isEmpty())
    {
        changeViewTag(view);
        **return new SkinView(view, skinAttrs);**
    }
    return null;
}

SkinManager.getInstance().injectSkin每次都会new一个SkinView出来,SkinView的总数量等于getView被调用的总次数,而不是getItemCount的值

SkinManager中的mActivities对象会导致Activity的内存泄露么?

SkinManger作为单例对象,生命周期长,在如下两种情况下,会不会导致Activity回收不掉的问题?
1、Activity被销毁后,生命周期函数onDestory没被调用 (如使用clearTop方法的Intent)
2、如果内存紧张的情况下

可以优化成用SoftReference吧?

Demo Crash in Nexus6p NullPointException

在nexus6p上点击 插件换肤1 ,直接发生crash 。日志如下

 java.lang.NullPointerException: Attempt to read from field 'java.lang.String android.content.pm.PackageInfo.packageName' on a null object reference
                                                                           at com.zhy.changeskin.SkinManager.validPluginParams(SkinManager.java:112)
                                                                           at com.zhy.changeskin.SkinManager.checkPluginParamsThrow(SkinManager.java:119)
                                                                           at com.zhy.changeskin.SkinManager.changeSkin(SkinManager.java:208)
                                                                           at com.zhy.changeskin.SkinManager.changeSkin(SkinManager.java:186)
                                                                           at com.zhy.skinchangenow.MenuLeftFragment$2.onClick(MenuLeftFragment.java:53)
                                                                           at android.view.View.performClick(View.java:5204)
                                                                           at android.view.View$PerformClick.run(View.java:21153)
                                                                           at android.os.Handler.handleCallback(Handler.java:739)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:148)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

debug 下,是因为6.0 系统上,获取PackageInfo的方法不兼容照成的。SkinManager 112行。

鸿洋老师

您获取activity里的view 是通过activity.findViewById(android.R.id.content),但是我感觉这种方式有一点点局限,就是获取不到ActionBar所对应的view,所以可不可以改成activity.getWindow().getDecorView()?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.