Android主題換膚框架 無縫切換

Android-Skin-Loader

一個通過動態(tài)加載本地皮膚包進行換膚的皮膚框架

工程目錄介紹

Android-Skin-Loader
├── android-skin-loader-lib      // 皮膚加載庫
├── android-skin-loader-sample   // 皮膚庫應用實例
├── android-skin-loader-skin     // 皮膚包生成demo
└── skin-package                 // 皮膚包輸出目錄

用法

1. 在Application中進行初始化

public class SkinApplication extends Application {
    public void onCreate() {
        super.onCreate();
        // Must call init first 
        SkinManager.getInstance().init(this);
        SkinManager.getInstance().load();
    }
}

2. 在布局文件中標識需要換膚的View

...
xmlns:skin="http://schemas.android.com/android/skin"
...
  <TextView
     ...
     skin:enable="true" 
     ... />

3. 繼承BaseActivity或者BaseFragmentActivity作為BaseActivity進行開發(fā)

4. 從.skin文件中設(shè)置皮膚

String SKIN_NAME = "BlackFantacy.skin";
String SKIN_DIR = Environment.getExternalStorageDirectory() + File.separator + SKIN_NAME;
File skin = new File(SKIN_DIR);
SkinManager.getInstance().load(skin.getAbsolutePath(),
                new ILoaderListener() {
                    @Override
                    public void onStart() {
                    }

                    @Override
                    public void onSuccess() {
                    }

                    @Override
                    public void onFailed() {
                    }
                });

5. 重設(shè)默認皮膚

SkinManager.getInstance().restoreDefaultTheme();

6. 對代碼中創(chuàng)建的View的換膚支持

主要由IDynamicNewView接口實現(xiàn)該功能,在BaseActivityBaseFragmentActivityBaseFragment中已經(jīng)實現(xiàn)該接口.

public interface IDynamicNewView {
    void dynamicAddView(View view, List<DynamicAttr> pDAttrs);
}

用法:動態(tài)創(chuàng)建View后,調(diào)用dynamicAddView方法注冊該View至皮膚映射表即可(如下).詳見sample工程

    private void dynamicAddTitleView() {
        TextView textView = new TextView(getActivity());
        textView.setText("Small Article (動態(tài)new的View)");
        RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        param.addRule(RelativeLayout.CENTER_IN_PARENT);
        textView.setLayoutParams(param);
        textView.setTextColor(getActivity().getResources().getColor(R.color.color_title_bar_text));
        textView.setTextSize(20);
        titleBarLayout.addView(textView);
        
        List<DynamicAttr> mDynamicAttr = new ArrayList<DynamicAttr>();
        mDynamicAttr.add(new DynamicAttr(AttrFactory.TEXT_COLOR, R.color.color_title_bar_text));
        dynamicAddView(textView, mDynamicAttr);
    }

7. 皮膚包是什么?如何生成?

  • 皮膚包(后綴名為.skin)的本質(zhì)是一個apk文件,該apk文件不包含代碼,只包含資源文件
  • 在皮膚包工程中(示例工程為skin/BlackFantacy)添加需要換膚的同名的資源文件,直接編譯生成apk文件,再更改后綴名為.skinj即可(防止用戶點擊安裝)
  • 使用gradle的同學,buildandroid-skin-loader-skin工程后即可在skin-package目錄下取皮膚包(修改腳本中def skinName = "BlackFantacy.skin"換成自己想要的皮膚名)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容