Android实现app主题动态切换的两种方式

1 篇文章 0 订阅
1 篇文章 0 订阅

TestTheme

这是一个实现app主题动态切换的例子程序,示例了两种方式:
1、通过切换app的Theme属性;
2、通过安装主题apk包实现切换;

通过切换app的Theme属性实现主题动态切换的核心逻辑:

在Style中创建两套Theme(如appTheme和appThemeLight),在attr文件中创建需要的动态改变的属性(如backgroundStyle),
然后在前面以创建的Theme(appTheme和appThemeLight)中使用自定义的属性(backgroundStyle);
最后在代码中通过context.setTheme(int resId)动态设置主题为自己创建某个主题(appTheme或appThemeLight);
注意:context.setTheme(int resId)必须在Activity的setContentView()之前调用;

**XML布局文件中的调用方法**:
style="?backgroundStyle"

**代码中的调用方法**:
    某些情况下,有些组件的属性需要在代码中进行动态设置,这个时候只依靠上面的做法无法完成主题的切换;,
    此时需要在代码中动态读取当前的Theme对象,并通过该Theme对象与在attr中定义的属性(如drawableStyle),
    获取当前Theme下自定义属性(drawableStyle)所链接的ResourceId,并将该ResourceId设置给对应的组件;
    TypedArray array = getActivity().getTheme()
                .obtainStyledAttributes(new int[] {R.attr.drawableStyle});
    int drawableResId = array.getResourceId(0, 0);
    ivImage.setImageResource(drawableResId);

通过安装主题apk包实现切换核心代码逻辑是:

1、查找所有与规定的主题apk包名相同的apk:
PackageManager pm = getActivity().getPackageManager();
            List<PackageInfo> listPackages = pm.getInstalledPackages(PackageManager.PERMISSION_GRANTED);
            List<PackageInfo> listSkins = new ArrayList<PackageInfo>();
            for (PackageInfo packageInfo : listPackages) {
                if(packageInfo.packageName.startsWith(SKIN_PACKAGE_PREFIX)){
                    listSkins.add(packageInfo);
                }
            }
2、根据包名,获得包名所对应的apk的resource资源文件
public void onThemeChanged(String newThemePackageName){
        if(TextUtils.isEmpty(newThemePackageName)) return;
        try {
            Context con = this.getActivity().createPackageContext(newThemePackageName, CONTEXT_IGNORE_SECURITY);
            Resources res = con.getResources();
            changeStyle(res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

public void changeStyle(Resources res){
    mListView.setBackgroundColor(res.getColor(R.color.bg_listview));
}

由于该程序只是主程序,(主程序本身的resource可以理解为默认主题),并没有提供主题apk程序,特在此说明一下:

主题apk不需要实现任何功能,只需要对照主程序的resource完成主题apk的resource;
已color文件为例,在主程序的color文件中有bg_listview这个颜色(且主程序代码中以该颜色为listView的主题背景),
那么在主题apk的color文件中同样指定一个名为bg_listview的颜色,那么在主程序将主题切换为该主题apk时,会自动
读取该主题apk下的这个bg_listview作为listView的主题背景;

源码地址:github

程序截图:

image1
image2
image3
image4
image5
image6

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android切换语言,可以通过设置系统语言或者应用内部语言来实现。下面介绍两种常用的方法: 1. 设置系统语言: 在AndroidManifest.xml文件中,可以添加以下代码: ```xml <manifest ...> <application ... android:supportsRtl="true" android:allowBackup="true" android:theme="@style/AppTheme"> <activity ... android:configChanges="locale" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> ``` 然后在Application类中,重写attachBaseContext方法: ```java public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(LocaleHelper.onAttach(base, "en")); // 设置默认语言为英文 } } ``` 在需要切换语言的地方,可以调用以下代码: ```java LocaleHelper.setLocale(context, "zh"); // 设置语言为中文 recreate(); // 重启Activity生效 ``` 2. 设置应用内部语言: 使用SharedPreferences来保存用户选择的语言,然后在需要切换语言的地方,可以调用以下代码: ```java String language = "zh"; // 用户选择的语言,例如中文("zh")或英文("en") LocaleHelper.setLocale(context, language); recreate(); // 重启Activity生效 ``` 以上是两种常用的切换语言的方法,你可以根据具体需求选择适合的方式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值