Android进阶2之APK方式换肤


- public class MainActivity extends Activity
- {
- private Button defaultbutton = null;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- final LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
- //默认皮肤
- defaultbutton = (Button)findViewById(R.id.defaultButton);
- defaultbutton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v)
- {
- layout.setBackgroundResource(R.drawable.netskin);
- }
- });
- //为其他皮肤添加点击按钮
- ArrayList<PackageInfo> skinList = getAllSkin();
- for (int i = 0; i < skinList.size(); i++)
- {
- try
- {
- final Context context = createPackageContext(skinList.get(i).packageName,
- Context.CONTEXT_IGNORE_SECURITY);
- Button btn = new Button(this);
- btn.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
- btn.setText(context.getText(R.string.app_name));
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v)
- {
- layout.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.netskin));
- }
- });
- layout.addView(btn);
- }
- catch (NameNotFoundException e)
- {
- e.printStackTrace();
- }
- }
- }
- /**
- * 获取所有已安装的皮肤主题
- *
- * @return
- */
- private ArrayList<PackageInfo> getAllSkin()
- {
- ArrayList<PackageInfo> skinList = new ArrayList<PackageInfo>();
- List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
- for (PackageInfo p : packs)
- {
- if (isSkinPackage(p.packageName))
- {
- skinList.add(p);
- }
- }
- return skinList;
- }
- /**
- * 判断是否是皮肤主题
- *
- * @param packageName
- * @return
- */
- private boolean isSkinPackage(String packageName)
- {
- // 自己制作的皮肤主题包名 例如:sunlight.skin0 sunlight.skin1等等
- String rex = "sunlight.skin\\w";
- Pattern pattern = Pattern.compile(rex);
- Matcher matcher = pattern.matcher(packageName);
- return matcher.find();
- }
- }
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/layout"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/defaultButton"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="默认皮肤" />
- </LinearLayout>
Android进阶2之APK方式换肤的更多相关文章
- Android APK方式换肤实现原理
现在很多APP都有换肤的功能,例如微博,QQ等应用.这些应用的换肤原理是什么? 在用微博的时候,不难发现,当你要换肤时,先下载并安装一个皮肤apk,然后选择这个皮肤,就可以了. 这种方式就是把皮肤打包 ...
- Android实现apk插件方式换肤
换肤思路: 1.什么时候换肤? xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好. 2.皮肤是什么? 皮肤就是apk,是一个资源包,包含了颜色.图片等. 3.什么样的控 ...
- Android中插件开发篇之----应用换肤原理解析
一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...
- Android QMUI实战:实现APP换肤功能,并自动适配手机深色模式
Android换肤功能已不是什么新鲜事了,市面上有很多第三方的换肤库和实现方案. 之所以选择腾讯的QMUI库来演示APP的换肤功能,主要原因: 1.换肤功能的实现过程较简单.容易理解: 2.能轻松适配 ...
- Android 换肤功能的实现(Apk插件方式)
一.概述 由于Android 没有提供一套统一的换肤机制,我猜可能是因为国外更注重功能和体验的原因 所以国内如果要做一个漂亮的换肤方案,需要自己去实现. 目前换肤的方法大概有三种方案: (1)把皮肤资 ...
- Android 打造自己的个性化应用(一):应用程序换肤主流方式的分析与概述
Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片. ...
- Android App插件式换肤实现方案
背景 目前很多app都具有换肤功能,用户可以根据需要切换不同的皮肤,为使我们的App支持换肤功能,给用户提供更好的体验,在这里对换肤原理进行研究总结,并选择一个合适的换肤解决方案. 换肤介绍 App换 ...
- Android动态换肤(二、apk免安装插件方式)
在上一篇文章Android动态换肤(一.应用内置多套皮肤)中,我们了解到,动态换肤无非就是调用view的setBackgroundResource(R.drawable.id)等方法设置控件的背景或者 ...
- Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...
随机推荐
- Winform使用DevExpress的WaitDialogForm画面 z
使用了DevExpress的WaitDialogForm 在应用程序加载开始时新建一个线程,并将loading画面show起来,在应用程序画面弹出前将该线程终止. 代码: private DevExp ...
- linux 安装jdk 配置tomcat
Linux(ubuntu)下安装JDK.Tomcat 一.安装jdk 1)首先以root用户登录进去,在根目录下建立/usr/java的目录,我们将下载的东西都放到该目录下去. 2)参考的https: ...
- hdu 2087-剪花布条(KMP)
题意: 求文本串最多可以分成几个模式串. 分析: KMP #include <map> #include <set> #include <list> #includ ...
- Corn Fields(POJ 3254状压dp)
题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...
- lightoj 1023
题意:让你输出前N个大写字母的前K个排列,按字典序,很水,直接dfs. #include<cstdio> #include<string> #include<cstrin ...
- [Tommas] 一种有效的测试策略(转)
在最近的一个大型项目中,我们在早期就定下了一个目标:不会在软件中使用大量QA人员专注于手工测试.通过手工测试发现bug极其耗时且成本高昂,这促使团队尝试尽可能的将质量内嵌到产品内部.但这并不意味着手工 ...
- 使用Redis的理由
Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型.Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Re ...
- bzoj 2555 SubString(SAM+LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2555 [题意] 给定一个字符串,可以随时插入字符串,提供查询s在其中作为连续子串的出现 ...
- bzoj 2049 [Sdoi2008]Cave 洞穴勘测(LCT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2049 [题意] 给定森林,可能有连边或断边的操作,回答若干个连通性的询问. [思路] ...
- <问题>Eclipse中Deploy应用到GAE的错误
1.在Eclipse中部署App到Google App Engine(GAE),有时候会遇到这样的错误: java.lang.RuntimeException: Cannot get the Syst ...