Giter Club home page Giter Club logo

changeskin's Introduction

ChangeSkin

基于插件式的Android换肤框架,支持app内和或者外部插件式提供资源的换肤方案,无需重启Activity。

致谢

支持

  • 插件的方式提供资源
  • 应用内直接提供资源
  • 一个插件包提供一套或者多套皮肤
  • 应用内直接提供一套或者多套皮肤

Demo运行

目前的demo,已经包含上述功能的测试。

下载night_plugin.apk里面包含资源文件,放到手机或者模拟器SdCard的根目录。

然后import project,运行app。

运行效果图:

无需重启Activity,无缝换肤,资源均来自插件apk中。

使用

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

dependencies {
     compile project(':changeskin')
}

或者直接添加依赖:

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

(1)初始化

1、Application中初始化

在你的Application中,去初始化SkinManager,例如:

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

别忘了注册。

####2、继承BaseSkinActivity 让所有的需要换肤的界面的Activity,继承自com.zhy.changeskin.base.BaseSkinActivity

####3、对于需要换肤的资源命名使用skin开头

比如你的某个控件的背景需要换肤:

<android.support.v4.widget.DrawerLayout 
    android:background="@drawable/skin_main_bg"
    ... 
    />

字体颜色:

 <TextView android:id="@+id/id_tv_title"
      android:textColor="@color/skin_item_text_color"
        />

其他的类似。

接下来,针对插件式或者应用内准备皮肤资源即可。

(2)插件式换肤

1、准备资源apk

只需要按规则定义下资源名称,然后几行代码就完成了换肤。

然后,单独准备一份插件apk,其实就是普通的项目,仅仅准备需要包含用到的资源即可。

例如:

搞成apk就不用说了吧。

2、调用API

准备完成资源后,调用:

SkinManager.getInstance().changeSkin(
	mSkinPkgPath, 
	"com.zhy.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();
	    }
});

即可完成换肤。第一个参数为插件apk的路径,第二个参数为插件apk的packageName.

记得设置读取存储卡权限。

当然你也可以调用

SkinManager.getInstance().removeAnySkin();

重置为初始状态。

###(3)应用内换肤

1、准备资源apk

这个就简单了,因为应用内换肤那么你肯定有多套资源,比如有一个背景图叫做:

skin_main_bg

那么你可以准备一套皮肤资源,命名为:

skin_main_bg_后缀

这二个后缀你自己决定,例如:

上图,我准备了两套应用内的皮肤。

2、调用换肤API

  SkinManager.getInstance().changeSkin("red");

参数传入你的后缀名即可。

详情参考demo.

声明

感谢:drakeet的提醒.

恩,看来得说明下,首先对于换肤,从Simple发布的Colorful项目开始关注,搜索了大量的资料,因为希望是可以支持插件式,一直寻找合适的资源替换方案,后来搜索到这篇博文Android换肤技术总结,里面提到了一些方案。很开心的是,发现了这个库:https://github.com/fengjundev/Android-Skin-Loader有极大的参考价值。该库通过为LayoutInfalter去设置自定义Factory,对加载的View进行分析和提取,方案还是不错的。

该库也就成为本库的一个资源替换原理的一个核心的突破点。

当然,后来对于LayoutInflater.Factory又做了一些的分析,感觉侵入性有点大,主要担心对于AppCompat一些support的影响。 于是选择,直接重写Activity的onCreateView等方法。(由于v7 23.0.1的变动,onCreateView只能作为private factory参与创建View了,时机太晚,该库方案也改为setFactory) 因为本库的预期准备支持app内和或者外部插件式提供资源的换肤方案,为了方便变采用了资源名称的约束,所以修改幅度较大,也就没准备针对Android-Skin-Loader库提交PR。

后面会编写博客叙述该库的原理等。

changeskin's People

Contributors

hongyangandroid avatar wonshaw 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

changeskin's Issues

Getting more done in GitHub with ZenHub

Hola! @KennethYo has created a ZenHub account for the hongyangAndroid organization. ZenHub is the leading team collaboration and project management solution built for GitHub.


How do I use ZenHub?

To get set up with ZenHub, all you have to do is download the browser extension and log in with your GitHub account. Once you do, you’ll get access to ZenHub’s complete feature-set immediately.

What can ZenHub do?

ZenHub adds a series of enhancements directly inside the GitHub UI:

  • Real-time, customizable task boards for GitHub issues;
  • Burndown charts, estimates, and velocity tracking based on GitHub Milestones;
  • Personal to-do lists and task prioritization;
  • “+1” button for GitHub issues and comments;
  • Drag-and-drop file sharing;
  • Time-saving shortcuts like a quick repo switcher.

Add ZenHub to GitHub

Still curious? See more ZenHub features or read user reviews. This issue was written by your friendly ZenHub bot, posted by request from @KennethYo.

ZenHub Board

No package identifier when getting value for resource number 0x00000000

This app show many warning : "No package identifier when getting value for resource number 0x00000000". Can you help me resolve it?

This is sample code :

_```
public static Drawable getThemeDrawable(Context context, String name, int defaultDrawable) {
try {
return SkinManager.getInstance().getResourceManager() == null || SkinManager.getInstance().getResourceManager().getDrawableByName(name) == null ? ContextCompat.getDrawable(context, defaultDrawable) : SkinManager.getInstance().getResourceManager().getDrawableByName(name);
} catch (Exception ex) {
}
return ContextCompat.getDrawable(context, defaultDrawable);
}

BaseSkinActivity#onCreateView中为什么用反射来创建 view?

 try
        {
            //public View createView
            // (View parent, final String name, @NonNull Context context, @NonNull AttributeSet attrs)
            if (sCreateViewMethod == null)
            {
                Method methodOnCreateView = delegate.getClass().getMethod("createView", sCreateViewSignature);
                sCreateViewMethod = methodOnCreateView;
            }
            Object object = sCreateViewMethod.invoke(delegate, parent, name, context, attrs);
            view = (View) object;
        } catch (NoSuchMethodException e)
        {
            e.printStackTrace();
        } catch (InvocationTargetException e)
        {
            e.printStackTrace();
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }

这里的代码为什么用发射创建而不是用 直接调用delegate.createView 呢?如下

 view = delegate.createView(parent, name, context, attrs);

View控件不能换肤

如果控件直接使用View,通常分割线等常用是方法定义,定义背景色,换肤时View控件没有作用。

某些场景下换皮肤不生效

比如在作者提供DEMO MainActivity的DrawerLayout下,把background中的图片背景换成skin_开头的颜色资源(3个(skin_test,skin_test_red,skin_test_green)) 切换时 背景不变主题,listview背景也是有同样的问题。
另外Jcenter是否没有审核过呢?直接引入貌似不行

项目是不是代码没传好?

我clone代码后无法编译,修改build.gradle的插件加载顺序修改了插件版本为最新版本后,drawable中有个文件名大写了,修改文件名后可以构建了。
( classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0')。
然后就是第三个item和插件式换肤无效果。

闪回主页面

程序刚运行时,快速跳转到其他activity,过没多久后会自动退回主activity,找不到原因?

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.