Android进阶2之APK方式换肤

时间:2022-10-26 22:14:40

Android进阶2之APK方式换肤Android进阶2之APK方式换肤

  1. public class MainActivity extends Activity
  2. {
  3. private Button defaultbutton = null;
  4. @Override
  5. public void onCreate(Bundle savedInstanceState)
  6. {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. final LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
  10. //默认皮肤
  11. defaultbutton = (Button)findViewById(R.id.defaultButton);
  12. defaultbutton.setOnClickListener(new OnClickListener() {
  13. @Override
  14. public void onClick(View v)
  15. {
  16. layout.setBackgroundResource(R.drawable.netskin);
  17. }
  18. });
  19. //为其他皮肤添加点击按钮
  20. ArrayList<PackageInfo> skinList = getAllSkin();
  21. for (int i = 0; i < skinList.size(); i++)
  22. {
  23. try
  24. {
  25. final Context context = createPackageContext(skinList.get(i).packageName,
  26. Context.CONTEXT_IGNORE_SECURITY);
  27. Button btn = new Button(this);
  28. btn.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  29. btn.setText(context.getText(R.string.app_name));
  30. btn.setOnClickListener(new OnClickListener() {
  31. @Override
  32. public void onClick(View v)
  33. {
  34. layout.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.netskin));
  35. }
  36. });
  37. layout.addView(btn);
  38. }
  39. catch (NameNotFoundException e)
  40. {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. /**
  46. * 获取所有已安装的皮肤主题
  47. *
  48. * @return
  49. */
  50. private ArrayList<PackageInfo> getAllSkin()
  51. {
  52. ArrayList<PackageInfo> skinList = new ArrayList<PackageInfo>();
  53. List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
  54. for (PackageInfo p : packs)
  55. {
  56. if (isSkinPackage(p.packageName))
  57. {
  58. skinList.add(p);
  59. }
  60. }
  61. return skinList;
  62. }
  63. /**
  64. * 判断是否是皮肤主题
  65. *
  66. * @param packageName
  67. * @return
  68. */
  69. private boolean isSkinPackage(String packageName)
  70. {
  71. // 自己制作的皮肤主题包名 例如:sunlight.skin0 sunlight.skin1等等
  72. String rex = "sunlight.skin\\w";
  73. Pattern pattern = Pattern.compile(rex);
  74. Matcher matcher = pattern.matcher(packageName);
  75. return matcher.find();
  76. }
  77. }

main.xml

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:id="@+id/layout"
    4. android:layout_width="fill_parent"
    5. android:layout_height="fill_parent"
    6. android:orientation="vertical" >
    7. <Button
    8. android:id="@+id/defaultButton"
    9. android:layout_width="fill_parent"
    10. android:layout_height="wrap_content"
    11. android:text="默认皮肤" />
    12. </LinearLayout>

Android进阶2之APK方式换肤的更多相关文章

  1. Android APK方式换肤实现原理

    现在很多APP都有换肤的功能,例如微博,QQ等应用.这些应用的换肤原理是什么? 在用微博的时候,不难发现,当你要换肤时,先下载并安装一个皮肤apk,然后选择这个皮肤,就可以了. 这种方式就是把皮肤打包 ...

  2. Android实现apk插件方式换肤

    换肤思路: 1.什么时候换肤? xml加载前换肤,如果xml加载后换肤,用户将会看见换肤之前的色彩,用户体验不好. 2.皮肤是什么? 皮肤就是apk,是一个资源包,包含了颜色.图片等. 3.什么样的控 ...

  3. Android中插件开发篇之----应用换肤原理解析

    一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...

  4. Android QMUI实战:实现APP换肤功能,并自动适配手机深色模式

    Android换肤功能已不是什么新鲜事了,市面上有很多第三方的换肤库和实现方案. 之所以选择腾讯的QMUI库来演示APP的换肤功能,主要原因: 1.换肤功能的实现过程较简单.容易理解: 2.能轻松适配 ...

  5. Android 换肤功能的实现(Apk插件方式)

    一.概述 由于Android 没有提供一套统一的换肤机制,我猜可能是因为国外更注重功能和体验的原因 所以国内如果要做一个漂亮的换肤方案,需要自己去实现. 目前换肤的方法大概有三种方案: (1)把皮肤资 ...

  6. Android 打造自己的个性化应用&lpar;一&rpar;:应用程序换肤主流方式的分析与概述

    Android平台api没有特意为换肤提供一套简便的机制,这可能是外国的软件更注重功能和易用,不流行换肤.系统不提供直接支持,只能自行研究. 换肤,可以认为是动态替换资源(文字.颜色.字体大小.图片. ...

  7. Android App插件式换肤实现方案

    背景 目前很多app都具有换肤功能,用户可以根据需要切换不同的皮肤,为使我们的App支持换肤功能,给用户提供更好的体验,在这里对换肤原理进行研究总结,并选择一个合适的换肤解决方案. 换肤介绍 App换 ...

  8. Android动态换肤(二、apk免安装插件方式)

    在上一篇文章Android动态换肤(一.应用内置多套皮肤)中,我们了解到,动态换肤无非就是调用view的setBackgroundResource(R.drawable.id)等方法设置控件的背景或者 ...

  9. Android逆向之旅---动态方式破解apk进阶篇&lpar;IDA调试so源码&rpar;

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

随机推荐

  1. Go项目的目录结构

    项目目录结构如何组织,一般语言都是没有规定.但Go语言这方面做了规定,这样可以保持一致性,做到统一.规则化比较明确. 1.一般的,一个Go项目在GOPATH下,会有如下三个目录: |--bin |-- ...

  2. 利用oneproxy部署mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...

  3. 使用行为树&lpar;Behavior Tree&rpar;实现游戏AI

    ——————————————————————— 谈到游戏AI,很明显智能体拥有的知识条目越多,便显得更智能,但维护庞大数量的知识条目是个噩梦:使用有限状态机(FSM),分层有限状态机(HFSM),决策 ...

  4. Divide and conquer&colon;Sumsets&lpar;POJ 2549&rpar;

    数集 题目大意:给定一些数的集合,要你求出集合中满足a+b+c=d的最大的d(每个数只能用一次) 这题有两种解法, 第一种就是对分,把a+b的和先求出来,然后再枚举d-c,枚举的时候输入按照降序搜索就 ...

  5. DBHelper 类(网上收集)

    这个是我网上找的,觉得不错的一个DBHelper类,下面是作者话: // 微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什 ...

  6. 淘淘商城&lowbar;day07&lowbar;课堂笔记

    今日大纲 讲解订单系统 基于订单系统完成下单功能的开发 使用Solr完成商品的搜索功能 订单系统 说明:订单系统只是做讲解,不做开发. 导入taotao-order 表结构 订单表: 订单商品表: 疑 ...

  7. js遍历(获取)ul中的li

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  8. nginx&colon;&lbrack;emerg&rsqb;unknown directive &quot&semi;ssl&quot&semi;

    nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/nginx.conf:102 到解压的nginx目录 ...

  9. orangepi one AP模式配置

    前两天买了一块orangepi one开发板,目的是做个局域网共享目录,具体共享协议用samba:这块板子有两个网卡,一个有线一个无线:有线主要用来ssh登陆调试,修改配置. 首先下载armbian的 ...

  10. python的os模块fnmatch模块介绍

    一.先介绍一下os模块 import os print(os.getcwd()) # E:\python\test\python_models # 获取当前的目录 print(os.listdir(& ...