From 0c381481c4dd3c0aff592d10cc33be87bda21bb9 Mon Sep 17 00:00:00 2001 From: derlio Date: Mon, 25 Jan 2016 16:24:54 +0800 Subject: [PATCH 1/5] Fix background is set to '@null' will crash the app --- .../main/java/com/zhy/changeskin/attr/SkinAttrSupport.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/changeskin/src/main/java/com/zhy/changeskin/attr/SkinAttrSupport.java b/changeskin/src/main/java/com/zhy/changeskin/attr/SkinAttrSupport.java index 8829b2a..91fa70f 100644 --- a/changeskin/src/main/java/com/zhy/changeskin/attr/SkinAttrSupport.java +++ b/changeskin/src/main/java/com/zhy/changeskin/attr/SkinAttrSupport.java @@ -29,6 +29,11 @@ public static List getSkinAttrs(AttributeSet attrs, Context context) if (attrValue.startsWith("@")) { int id = Integer.parseInt(attrValue.substring(1)); + + if (id == 0) { + continue; + } + String entryName = context.getResources().getResourceEntryName(id); L.e("entryName = " + entryName); From 94e0023ebec67a3662c09401370d6084b96c1918 Mon Sep 17 00:00:00 2001 From: derlio Date: Tue, 26 Jan 2016 14:15:53 +0800 Subject: [PATCH 2/5] Optimize addSkinView of SkinManager --- .../java/com/zhy/changeskin/SkinManager.java | 125 +++++++----------- .../zhy/changeskin/base/BaseSkinActivity.java | 25 +--- 2 files changed, 48 insertions(+), 102 deletions(-) diff --git a/changeskin/src/main/java/com/zhy/changeskin/SkinManager.java b/changeskin/src/main/java/com/zhy/changeskin/SkinManager.java index c923f8b..3edb791 100644 --- a/changeskin/src/main/java/com/zhy/changeskin/SkinManager.java +++ b/changeskin/src/main/java/com/zhy/changeskin/SkinManager.java @@ -14,6 +14,7 @@ import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -21,8 +22,7 @@ /** * Created by zhy on 15/9/22. */ -public class SkinManager -{ +public class SkinManager { private Context mContext; private Resources mResources; private ResourceManager mResourceManager; @@ -40,23 +40,19 @@ public class SkinManager private Map> mSkinViewMaps = new HashMap>(); private List mSkinChangedListeners = new ArrayList(); - private SkinManager() - { + private SkinManager() { } - private static class SingletonHolder - { + private static class SingletonHolder { static SkinManager sInstance = new SkinManager(); } - public static SkinManager getInstance() - { + public static SkinManager getInstance() { return SingletonHolder.sInstance; } - public void init(Context context) - { + public void init(Context context) { mContext = context.getApplicationContext(); mPrefUtils = new PrefUtils(mContext); @@ -67,22 +63,19 @@ public void init(Context context) return; File file = new File(skinPluginPath); if (!file.exists()) return; - try - { + try { loadPlugin(skinPluginPath, skinPluginPkg, mSuffix); mCurPluginPath = skinPluginPath; mCurPluginPkg = skinPluginPkg; - } catch (Exception e) - { + } catch (Exception e) { mPrefUtils.clear(); e.printStackTrace(); } } - private void loadPlugin(String skinPath, String skinPkgName, String suffix) throws Exception - { - //checkPluginParams(skinPath, skinPkgName); + private void loadPlugin(String skinPath, String skinPkgName, String suffix) throws Exception { + //checkPluginParams(skinPath, skinPkgName); AssetManager assetManager = AssetManager.class.newInstance(); Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class); addAssetPath.invoke(assetManager, skinPath); @@ -93,43 +86,33 @@ private void loadPlugin(String skinPath, String skinPkgName, String suffix) thro usePlugin = true; } - private boolean checkPluginParams(String skinPath, String skinPkgName) - { - if (TextUtils.isEmpty(skinPath) || TextUtils.isEmpty(skinPkgName)) - { + private boolean checkPluginParams(String skinPath, String skinPkgName) { + if (TextUtils.isEmpty(skinPath) || TextUtils.isEmpty(skinPkgName)) { return false; } return true; } - private void checkPluginParamsThrow(String skinPath, String skinPkgName) - { - if (!checkPluginParams(skinPath, skinPkgName)) - { + private void checkPluginParamsThrow(String skinPath, String skinPkgName) { + if (!checkPluginParams(skinPath, skinPkgName)) { throw new IllegalArgumentException("skinPluginPath or skinPkgName can not be empty ! "); } } - public void removeAnySkin() - { + public void removeAnySkin() { clearPluginInfo(); notifyChangedListeners(); } - - - public boolean needChangeSkin() - { + public boolean needChangeSkin() { return usePlugin || !TextUtils.isEmpty(mSuffix); } - public ResourceManager getResourceManager() - { - if (!usePlugin) - { + public ResourceManager getResourceManager() { + if (!usePlugin) { mResourceManager = new ResourceManager(mContext.getResources(), mContext.getPackageName(), mSuffix); } return mResourceManager; @@ -141,16 +124,14 @@ public ResourceManager getResourceManager() * * @param suffix */ - public void changeSkin(String suffix) - { + public void changeSkin(String suffix) { clearPluginInfo();//clear before mSuffix = suffix; mPrefUtils.putPluginSuffix(suffix); notifyChangedListeners(); } - private void clearPluginInfo() - { + private void clearPluginInfo() { mCurPluginPath = null; mCurPluginPkg = null; usePlugin = false; @@ -158,8 +139,7 @@ private void clearPluginInfo() mPrefUtils.clear(); } - private void updatePluginInfo(String skinPluginPath, String pkgName, String suffix) - { + private void updatePluginInfo(String skinPluginPath, String pkgName, String suffix) { mPrefUtils.putPluginPath(skinPluginPath); mPrefUtils.putPluginPkg(pkgName); mPrefUtils.putPluginSuffix(suffix); @@ -169,8 +149,7 @@ private void updatePluginInfo(String skinPluginPath, String pkgName, String suff } - public void changeSkin(final String skinPluginPath, final String pkgName, ISkinChangingCallback callback) - { + public void changeSkin(final String skinPluginPath, final String pkgName, ISkinChangingCallback callback) { changeSkin(skinPluginPath, pkgName, "", callback); } @@ -183,8 +162,7 @@ public void changeSkin(final String skinPluginPath, final String pkgName, ISkinC * @param suffix * @param callback */ - public void changeSkin(final String skinPluginPath, final String pkgName, final String suffix, ISkinChangingCallback callback) - { + public void changeSkin(final String skinPluginPath, final String pkgName, final String suffix, ISkinChangingCallback callback) { if (callback == null) callback = ISkinChangingCallback.DEFAULT_SKIN_CHANGING_CALLBACK; final ISkinChangingCallback skinChangingCallback = callback; @@ -192,21 +170,16 @@ public void changeSkin(final String skinPluginPath, final String pkgName, final skinChangingCallback.onStart(); checkPluginParamsThrow(skinPluginPath, pkgName); - if (skinPluginPath.equals(mCurPluginPath) && pkgName.equals(mCurPluginPkg)) - { + if (skinPluginPath.equals(mCurPluginPath) && pkgName.equals(mCurPluginPkg)) { return; } - new AsyncTask() - { + new AsyncTask() { @Override - protected Void doInBackground(Void... params) - { - try - { + protected Void doInBackground(Void... params) { + try { loadPlugin(skinPluginPath, pkgName, suffix); - } catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); skinChangingCallback.onError(e); } @@ -215,15 +188,12 @@ protected Void doInBackground(Void... params) } @Override - protected void onPostExecute(Void aVoid) - { - try - { + protected void onPostExecute(Void aVoid) { + try { updatePluginInfo(skinPluginPath, pkgName, suffix); notifyChangedListeners(); skinChangingCallback.onComplete(); - } catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); skinChangingCallback.onError(e); } @@ -233,45 +203,44 @@ protected void onPostExecute(Void aVoid) } - public void addSkinView(ISkinChangedListener listener, List skinViews) - { - mSkinViewMaps.put(listener, skinViews); + public void addSkinView(ISkinChangedListener listener, SkinView... skinViews) { + List skinViewsList = mSkinViewMaps.get(listener); + if (skinViewsList == null) { + skinViewsList = new ArrayList<>(); + mSkinViewMaps.put(listener, skinViewsList); + } + + skinViewsList.addAll(Arrays.asList(skinViews)); + } - public List getSkinViews(ISkinChangedListener listener) - { + public List getSkinViews(ISkinChangedListener listener) { return mSkinViewMaps.get(listener); } - public void apply(ISkinChangedListener listener) - { + public void apply(ISkinChangedListener listener) { List skinViews = getSkinViews(listener); if (skinViews == null) return; - for (SkinView skinView : skinViews) - { + for (SkinView skinView : skinViews) { skinView.apply(); } } - public void addChangedListener(ISkinChangedListener listener) - { + public void addChangedListener(ISkinChangedListener listener) { mSkinChangedListeners.add(listener); } - public void removeChangedListener(ISkinChangedListener listener) - { + public void removeChangedListener(ISkinChangedListener listener) { mSkinChangedListeners.remove(listener); mSkinViewMaps.remove(listener); } - public void notifyChangedListeners() - { - for (ISkinChangedListener listener : mSkinChangedListeners) - { + public void notifyChangedListeners() { + for (ISkinChangedListener listener : mSkinChangedListeners) { listener.onSkinChanged(); } } diff --git a/changeskin/src/main/java/com/zhy/changeskin/base/BaseSkinActivity.java b/changeskin/src/main/java/com/zhy/changeskin/base/BaseSkinActivity.java index beffbd2..8e47e1d 100644 --- a/changeskin/src/main/java/com/zhy/changeskin/base/BaseSkinActivity.java +++ b/changeskin/src/main/java/com/zhy/changeskin/base/BaseSkinActivity.java @@ -1,28 +1,13 @@ package com.zhy.changeskin.base; import android.content.Context; -import android.os.Build; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v4.app.FragmentActivity; import android.support.v4.util.ArrayMap; import android.support.v4.view.LayoutInflaterCompat; import android.support.v4.view.LayoutInflaterFactory; -import android.support.v4.view.ViewCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatDelegate; -import android.support.v7.internal.app.AppCompatViewInflater; -import android.support.v7.widget.AppCompatAutoCompleteTextView; -import android.support.v7.widget.AppCompatButton; -import android.support.v7.widget.AppCompatCheckBox; -import android.support.v7.widget.AppCompatCheckedTextView; -import android.support.v7.widget.AppCompatEditText; -import android.support.v7.widget.AppCompatMultiAutoCompleteTextView; -import android.support.v7.widget.AppCompatRadioButton; -import android.support.v7.widget.AppCompatRatingBar; -import android.support.v7.widget.AppCompatSpinner; -import android.support.v7.widget.AppCompatTextView; import android.util.AttributeSet; import android.view.InflateException; import android.view.LayoutInflater; @@ -33,12 +18,10 @@ import com.zhy.changeskin.attr.SkinAttrSupport; import com.zhy.changeskin.attr.SkinView; import com.zhy.changeskin.callback.ISkinChangedListener; -import com.zhy.changeskin.utils.L; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -123,13 +106,7 @@ private void injectSkin(View view, List skinAttrList) //do some skin inject if (skinAttrList.size() != 0) { - List skinViews = SkinManager.getInstance().getSkinViews(this); - if (skinViews == null) - { - skinViews = new ArrayList(); - } - SkinManager.getInstance().addSkinView(this, skinViews); - skinViews.add(new SkinView(view, skinAttrList)); + SkinManager.getInstance().addSkinView(this, new SkinView(view, skinAttrList)); if (SkinManager.getInstance().needChangeSkin()) { From 9fc1daf130aee7d231f594196196a99dfa1f6d0f Mon Sep 17 00:00:00 2001 From: derlio Date: Tue, 26 Jan 2016 16:45:44 +0800 Subject: [PATCH 3/5] Fix getColorStateList will failed if it's real color state list --- .../src/main/java/com/zhy/changeskin/ResourceManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/changeskin/src/main/java/com/zhy/changeskin/ResourceManager.java b/changeskin/src/main/java/com/zhy/changeskin/ResourceManager.java index a9cca8b..1dd23b7 100644 --- a/changeskin/src/main/java/com/zhy/changeskin/ResourceManager.java +++ b/changeskin/src/main/java/com/zhy/changeskin/ResourceManager.java @@ -69,12 +69,12 @@ public ColorStateList getColorStateList(String name) { { name = appendSuffix(name); L.e("name = " + name); - return mResources.getColorStateList(mResources.getIdentifier(name, DEFTYPE_COLOR, mPluginPackageName)); + return mResources.getColorStateList(mResources.getIdentifier(name, DEFTYPE_DRAWABLE, mPluginPackageName)); } catch (Resources.NotFoundException e) { e.printStackTrace(); - return null; + return mResources.getColorStateList(mResources.getIdentifier(name, DEFTYPE_COLOR, mPluginPackageName)); } } From 9228f346dc30ae143c3340d8a42568aea410bd9d Mon Sep 17 00:00:00 2001 From: Nathen Date: Wed, 27 Jan 2016 17:04:26 +0800 Subject: [PATCH 4/5] Edit gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6b51475..02435e9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .gradle /local.properties -/.idea/workspace.xml -/.idea/libraries +.idea *Bak *BAK .DS_Store @@ -9,3 +8,4 @@ /captures /imooc_changeskin /imooc_changeskin/* +*.iml From 75da6edfd8f22fddcb3c16c877521e14d192c5ec Mon Sep 17 00:00:00 2001 From: Nathen Date: Wed, 27 Jan 2016 17:05:23 +0800 Subject: [PATCH 5/5] Fix some config file --- .idea/gradle.xml | 19 -------- .idea/misc.xml | 62 ------------------------ .idea/modules.xml | 10 ---- .idea/vcs.xml | 7 --- SkinChangeNow.iml | 19 -------- app/app.iml | 99 --------------------------------------- changeskin/changeskin.iml | 96 ------------------------------------- 7 files changed, 312 deletions(-) delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 SkinChangeNow.iml delete mode 100644 app/app.iml delete mode 100644 changeskin/changeskin.iml diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 6fa0197..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index dae7a60..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7 - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index f3c1a86..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index f521a50..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SkinChangeNow.iml b/SkinChangeNow.iml deleted file mode 100644 index 78ccb9b..0000000 --- a/SkinChangeNow.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index a4980cb..0000000 --- a/app/app.iml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/changeskin/changeskin.iml b/changeskin/changeskin.iml deleted file mode 100644 index 21729e3..0000000 --- a/changeskin/changeskin.iml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file