精华内容
参与话题
问答
  • Android换肤

    2016-05-16 11:19:19
    Android换肤
    换肤有多种方案,但用到的最终方法都是一样的,就是用新的Resource读取apk里的资源
        /**
         * 生成皮肤包的AssetManager
         *
         * @param apkPath
         * @return
         */
        private static AssetManager createAssetManager(String apkPath) {
              try {
                 AssetManager assetManager = AssetManager.class .newInstance();
                  try {
                     AssetManager. class.getDeclaredMethod("addAssetPath" ,
                              String. class).invoke(assetManager, apkPath);
                 } catch (Throwable th) {
                     th.printStackTrace();
                 }
                  return assetManager;
             } catch (Throwable th) {
                 th.printStackTrace();
             }
              return null ;
        }
        
         /**
         * 获取Bundle中的资源
         * @param context
         * @param apkPath
         * @return
         */
        public static Resources getBundleResource(Context context, String apkPath){
            AssetManager assetManager = createAssetManager(apkPath);
            return new Resources(assetManager, context.getResources().getDisplayMetrics(), context.getResources().getConfiguration());
        }
    在如何使用新的Resource时,就有多种方案,比如反射context里的resource,直接把设置为新的,但这种要注意到apk的更新,另外一种,是自己弄个资源管理器,每次都从资源管理器里读取资源,不使用R
    如调用string类型的名为name的字符串,defPackage为apk路径
    /**
     * Return a resource identifier for the given resource name.  A fully
     * qualified resource name is of the form "package:type/entry".  The first
     * two components (package and type) are optional if defType and
     * defPackage, respectively, are specified here.
     * 
     * <p>Note: use of this function is discouraged.  It is much more
     * efficient to retrieve resources by identifier than by name.
     * 
     * @param name The name of the desired resource.
     * @param defType Optional default resource type to find, if "type/" is
     *                not included in the name.  Can be null to require an
     *                explicit type.
     * @param defPackage Optional default package to find, if "package:" is
     *                   not included in the name.  Can be null to require an
     *                   explicit package.
     * 
     * @return int The associated resource identifier.  Returns 0 if no such
     *         resource was found.  (0 is not a valid resource ID.)
     */
    public int getIdentifier(String nameString defTypeString defPackage) {
        if (name == null) {
            throw new NullPointerException("name is null");
        }
        try {
            return Integer.parseInt(name);
       catch (Exception e) {
            // Ignore
        }
        return mAssets.getResourceIdentifier(namedefTypedefPackage);
    }
    展开全文
  • Android 换肤

    2018-03-27 10:03:52
    换肤框架 Android-skin-support 在Application中初始化 public class BaseApplication extends Application { @Override public void onCreate() { super.onCreate(); SkinCompatManager.withoutActivity(this...

    换肤框架 Android-skin-support

    1. 在Application中初始化
    public class BaseApplication extends Application {
    
      @Override public void onCreate() {
        super.onCreate();
        SkinCompatManager.withoutActivity(this)
            .addStrategy(new CustomSDCardLoader())                  // 基础控件换肤初始化--自定义加载策略
            .addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]
            .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
            .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
            .setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤,默认打开[可选]
            .setSkinWindowBackgroundEnable(false)                   // 关闭windowBackground换肤,默认打开[可选]
            .loadSkin();
        //AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
      }
    }
    
    1. 恢复系统默认皮肤
         SkinCompatManager.getInstance().restoreDefaultTheme();
    
    1. 应用内换肤
      步骤: 添加res-night资源文件夹(切记一定要是资源文件夹, 其中的night可替换为任意单词), 使用如下代码可切换主题。
         // 后缀加载策略, 在相对应的资源名称后添加_night
         SkinCompatManager.getInstance().loadSkin("night", null, SkinCompatManager.SKIN_LOADER_STRATEGY_BUILD_IN);
    
    1. 插件式换肤
      步骤: 新建一个没有Activity的module, 此module中只包含资源文件, 其命名与原资源文件名相同, 运行后将编译出的.apk文件后缀名更改为.skin,为了防止点击安装, 将night.skin文件复制到assets/skins/路径下,使用如下代码进行过换肤。
         // 此处找的路径为assets/skins/night.skin
         SkinCompatManager.getInstance().loadSkin("night.skin", null, SkinCompatManager.SKIN_LOADER_STRATEGY_ASSETS);
    
    1. 自定义加载策略换肤
      步骤: 新建一个没有Activity的module, 此module中只包含资源文件, 其命名与原资源文件名相同, 运行后将编译出的.apk文件后缀名更改为.skin,为了防止点击安装, 将night.skin文件复制到/data/data/应用包名/cache/skins/路径下,使用如下代码进行过换肤。
         // 该文件在路径/data/data/应用包名/cache/skins/night.skin中, 自定义的加载策略必须在Application中配置
         SkinCompatManager.getInstance().loadSkin("night.skin", null, CustomSDCardLoader.SKIN_LOADER_STRATEGY_SDCARD);
    
    /**
     * 自定义加载策略, 必须在Application中配置
     * SkinCompatManager.withoutActivity(this)
            .addStrategy(new CustomSDCardLoader())                 // 基础控件换肤初始化
            .addInflater(new SkinMaterialViewInflater())            // material design 控件换肤初始化[可选]
            .addInflater(new SkinConstraintViewInflater())          // ConstraintLayout 控件换肤初始化[可选]
            .addInflater(new SkinCardViewInflater())                // CardView v7 控件换肤初始化[可选]
            .setSkinStatusBarColorEnable(false)                     // 关闭状态栏换肤,默认打开[可选]
            .setSkinWindowBackgroundEnable(false)                   // 关闭windowBackground换肤,默认打开[可选]
            .loadSkin();
     */
    public class CustomSDCardLoader extends SkinSDCardLoader{
      public static final int SKIN_LOADER_STRATEGY_SDCARD = Integer.MAX_VALUE;
    
      @Override
      protected String getSkinPath(Context context, String skinName) {
        return new File(SkinFileUtils.getSkinDir(context), skinName).getAbsolutePath();
      }
    
      @Override
      public int getType() {
        return SKIN_LOADER_STRATEGY_SDCARD;
      }
    }
    
    
    展开全文
  • android 换肤

    2017-06-01 18:19:46
    https://github.com/burgessjp/ThemeSkinning
    展开全文
  • android换肤

    千次阅读 2013-05-14 10:08:10
    国内有很多的软件都支持皮肤定制,这也是与国外软件重大不同之一,国外用户注重社交、邮件等功能,国内用户则重视音乐、小说、皮肤等功能,本节课程就来讲解Android应用程序如何实现换肤功能。 软件换肤从功能上...

    方式一、


    国内有很多的软件都支持皮肤定制,这也是与国外软件重大不同之一,国外用户注重社交、邮件等功能,国内用户则重视音乐、小说、皮肤等功能,本节课程就来讲解Android应用程序如何实现换肤功能。
    软件换肤从功能上可以划分三种:
      1) 软件内置多个皮肤,不可由用户增加或修改;
        最低的自由度,软件实现相对于后两种最容易。
      2) 官方提供皮肤供下载,用户可以使用下载的皮肤;
        用户可选择下载自己喜欢的皮肤,有些玩家会破解皮肤的定制方法,自己做皮肤使用,或者传到网上给大家用。
      3) 官方提供皮肤制作工具或方法,用户可自制皮肤。
        这种方式使用户有参与感,自由度较高。用户可根据自己的喜好定制软件的皮肤。有些软件官网提供皮肤定制的工具或者方法,我建议最好有可视化带向导的工具。用户只要自己找一些图片、修改文字的字体替换就可以了。用户可以上传自制的皮肤,提供其他用户下载,还可以赚得一些虚拟货币或者奖品什么的。这种一般都是打包为.zip格式的。扩展名可由各公司自定义,有制作工具的话直接导出来最方便。
    首先我们要弄清楚换肤的定义,软件皮肤包括图标、字体、布局、交互风格等,换肤就是换掉皮肤包括的部分或所有资源。
      前面提到的三种皮肤,从软件实现上来看,它们的本质区别是皮肤是否内置到应用程序中。对于内置的实现比较简单,只要在开发应用的过程中设计几套皮肤供用户选择。这里用到的知识不超过Android基础,不详细讲解。
    本节课程重点讲解如何实现皮肤与应用程序分离。
       皮肤一般含有多个文件,例如图片、配置等文件,分散的文件不利于传输和使用,最好打包。打包的格式一般选择zip格式。这里分两种情况,一种是apk,例如AdwLauncher,它的桌面皮肤格式是一个apk;另一种是自定义扩展名,例如墨迹天气皮肤扩展名是mja,搜狗输入法的皮肤扩展名是sga,它们的文件格式实际上都是zip。
      下面我们分别讲解。
      一.apk格式
       现在的问题变成了一个应用如何读取另一个apk中的资源。
       在android系统中,apk之间可以相互读取数据的条件是:有同样的签名,并且AndroidManifest.xml文件中配置的android:sharedUserId属性值相同,那么两个apk运行在同一个进程中,可以互相访问任意数据。
    方法如下:

       1) 应用程序和皮肤程序的AndroidManifest.xml中配置
                   例如: android:sharedUserId="com.kris.skin" ,值可以是做任意的,
       2) 文件与应用apk中对同一功能的皮肤文件名要一致
         例如:应用程序的背景图片路径:\SkinDemo\res\drawable-hdpi\bg.png
    那么皮肤apk中的背景图片文件路径也应该是:
    CustomSkin\res\drawable-hdpi\bg.png
       3)访问资源的方法
    1. Context context = createPackageContext("com.yuchen.customskin", Context.CONTEXT_IGNORE_SECURITY); 
    复制代码
    获取到org.yuchen.customskin对应的Context,通过返回的context对象就可以访问到org.yuchen.customskin中的任何资源。
       例如:应用apk要获得皮肤apk中的bg.png,
    1. Drawable drawable = context.getResources().getDrawable(R.drawable.bg);
    复制代码
    这样就得到了图片的引用,其他xml资源文件的获取方式也是类似的。
      二.自定义扩展名的zip格式的皮肤
        技术点在于如何去读取zip文件中的资源以及皮肤文件存放策略。
        方案:如果软件每次启动都去读取SD卡上的皮肤文件,速度会比较慢。较好的做法是提供一个皮肤设置的界面,用户选择了哪一个皮肤,就把那个皮肤文件解压缩到”/data/data/[package name]/skin”路径下,这样不需要跨存储器读取,速度较快,而且不需要每次都去zip压缩包中读取,不依赖SD卡中的文件,即使皮肤压缩包文件被删除了也没有关系。
    实现方法:
        1. 在软件的帮助或者官网的帮助中提示用户将皮肤文件拷贝到SD卡指定路径下。
        2. 在软件中提供皮肤设置界面。可以在菜单或者在设置中。可参考墨迹、搜狗输入法、QQ等支持换肤的软件。
        3. 加载指定路径下的皮肤文件,读取其中的缩略图,在皮肤设置界面中显示,将用户选中的皮肤文件解压缩到”/data/data/[package name]/skin”路径下。
        4. 软件中优先读取”/data/data/[package name]/skin/”路径下的资源。如果没有则使用apk中的资源。

    下面是我做的实例的截图与source ,我只测试了一下通过apk 来换肤的功能 ,到少其它的方法就留给大家去实验吧,不过记得实验了也上传图来大家一起分享哟。


    图来了:
    换肤前的截图:
    before.png 
    换肤后的截图:
    after.png 

    工程源码来了,re_skin是主程序 ,re_skin1是皮质程序,也就是提供资源的:
     source.zip (402.01 KB, 下载次数: 1586) 


    方式二、

    12.png 

    界面上有说明,得先导入 皮肤文件,再换肤哦。。。

    下面是皮肤文件,也就是一个包括资源文件的zip包,在这里去解压 zip包用到了这个帖子中的方法:
    《[Android实例] 利用antzip包来进行解压与压缩》
    http://www.eoeandroid.com/thread-102534-1-1.html

    在运行项目前,记得先要下面的skin包上传到自己的sdcard目录下哦。当然这个名字啊,路径啊,你也可以自己在代码里面去改,甚至于zip包里面的资源也可以自己的修改,这就留给大家去发挥了。为了读取的快速及安全性,也可以把解压的目录放到程序有私有目录下面去哈,在这里为了方便就没去做这一步了,皮肤包来了:
     skin.zip (44.29 KB, 下载次数: 856) 

    下面是代码来啰 !!
     Re_Skin2.zip (2.29 MB, 下载次数: 1884) 



    方式三、

    通过Style来完成

    作者:kris更新于 04月07日访问(3014评论(66

    changetheme.png
    在long long ago ,写过两篇文章来实现换肤,在论坛里面不敢说人人皆知,但是人气还是到位了的.如果你还不知道,那赶快再去看看吧:
    [Android实例] 【Kris专题】android 换肤 http://www.eoeandroid.com/thread-102060-1-1.html
    [Android实例] 【kris专题】android 换肤(续) http://www.eoeandroid.com/thread-102536-1-1.html
    另外一些在本文中会使用到的些知识:
    【Kris专题】android Style 小结 http://www.eoeandroid.com/thread-99671-1-1.html
    [Android实例] 【Kris专题】android:shape的使用 http://www.eoeandroid.com/thread-105450-1-1.html

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    然后今天我将给大家带来更神奇也更方便的一种方法来完成换肤.至于大家在项目中使用哪种方法就看大家的实际的项目需求了.
    
    这种换肤的主要思路是通过 Style来完成,如果大家对 Style的应用还不是很清楚,或者说是甚至没听说过,那你就危险了,至少足以证明你在Android界里面有多菜了.如果应用不是很熟悉,或者说他的原理不是很清楚的,自己可以多查阅一些资料,在这里就不作更仔细的介绍了.
    
    我们还是通过Demo 来一步步守成整个换肤的过程吧..
    
    1.当然是建议一个Android projects. 项目名什么的就随便你自己取了.我推荐大家在写自己的一些 demo的时候,指导编译 sdk可以设置到最高,别老是在2.x 徘徊了,有意思吗?
    2.项目建议好之后,就准备好各种我们图片资源文件吧(你可以ps一些背景图,也可以通过style中的shape来制作一些资源.或者说在color.xml中定义好一些颜色值,当然最方便的还是下载我的demo啦,里面啥都有了,呵呵 )
    3.在res/values目录下建议一个attrs.xml.里面用来定义一些style 的属性.如下:
    ```java
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <attr name="button" format="reference"/>
        <attr name="background" format="reference"/>
        <attr name="textColor" format="reference"/>
    </resources>
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
        代码解释:
            在上面的代码中,我们定义了三个属性(button,backgroud,textColor),这三个属性呢会在Style中用到,并且指出它的格式是引用形的.
            比如说 button,它的值到时候我们会在style里面去设置,并且指向具体的某个资源文件.
    
        4.然后到我们的res/values/style.xml了.(非常关键哦)
        ```java
        <resources xmlns:android="http://schemas.android.com/apk/res/android">
            <style name="AppTheme_Default" parent="@android:style/Theme.Holo.Light.DarkActionBar">
                <item name="button">@drawable/btn_grey</item>
                <item name="background">@drawable/backgroud2</item>
                <item name="textColor">@color/red</item>
            </style>
    
            <style name="AppTheme_Another" parent="AppTheme_Default">
                <item name="button">@drawable/btn_blue</item>
                <item name="background">@drawable/backgroud1</item>
                <item name="android:actionBarStyle">@style/ActionBarStyle</item>
            </style>
    
            <style name="ActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
                <item name="android:background">#33b5e5</item>
            </style>
        </resources>
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    代码解释:
        在这里我们定义了三个style (AppTheme_Default,AppTheme_Another,ActionBarStyle),其中AppTheme_Default,AppTheme_Another表示我们的两套主题.ActionBarStyle为我们actionBar的样式.
        AppTheme_Default为默认的主题,它是继承至@android:style/Theme.Holo.Light.DarkActionBar.当然你也可以继承Android中任意的已经有的主题 或者是style , 你也可以选择不继承任何已经有的样式 .
        AppTheme_Another为我们第二套主题 ,它是继承至AppTheme_Default的.在这里我们可以覆写部分AppTheme_Default里面的值,也可以覆写全部AppTheme_Default里面的值,这个看你具体的主题,也可以扩展其它一些新的值.
        比如说在AppTheme_Another中,没有覆写textColor的值 ,也就是在这两种主题中,我的文字的颜色值都是使用AppTheme_Default主题 中的值,都为红色.但是又新增了一个android:actionBarStyle的样式来改变actionBar 的样式.
    
    5.接下来呢,我们再实现一个基础类,BaseActivity来代替所有的activity完成主题的切换(当然要求程序里面所有的activity 都得继承至 BaseActivity).
    ```java
    public class BaseActivity extends Activity {
        public int mTheme = R.style.AppTheme_Default;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            if (savedInstanceState == null) {
                mTheme = PreferenceHelper.getTheme(this);
            } else {
                mTheme = savedInstanceState.getInt("theme");
            }
            setTheme(mTheme);
            super.onCreate(savedInstanceState);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if (mTheme != PreferenceHelper.getTheme(this)) {
                reload();
            }
        }
    
        protected void reload() {
            Intent intent = getIntent();
            overridePendingTransition(0, 0);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            finish();
            overridePendingTransition(0, 0);
            startActivity(intent);
        }
    }
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
        代码解释:
            onCreate中,我们从preference中去获取到主题,并且设置给 activity.
            在onresume中再去检查主题 是否已经改变? 如果已经改变了,就重新加载activity ,否则没有动作.
            reload就是finish当前 activity ,再启动当前activity啦.
    
        6.万事俱备了,现在的问题是我们在atrrs中定义的button , background怎么使用呢?
            a).java代码:
    
    ```java
                int[] attrs = new int[]{R.attr.button};
                TypedArray typedArray = context.obtainStyledAttributes(attrs);
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
        具体的使用大家自行去测试了
    
        b).直接在layout文件里面使用.比如我们 demo中的两个布局文件 .在这里我们例出一个来讲解.
        second.xml
        ```java
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="?attr/background" >
    
            <TextView android:id="@+id/textview"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="?attr/textColor"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:text="@string/msg_second" />
    
            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:background="?attr/button"
                android:text="@string/btn_text" />
        </RelativeLayout>
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
            代码解释:
                android:background="?attr/background"在这里使用了我们在attrs.xml中的background属性.
                android:textColor="?attr/textColor" 使用了我们在attrs.xml中定义的textColor
                android:background="?attr/button" 在这里使用了我们在attrs.xml中定义的button属性
    
            我们再来走一个这个调用的流程.
            在生成布局文件中RelativeLayout的时候,系统找到attrs.xml中定义的backround,然后再去当前设置的theme(我们假设是AppTheme_Default)中找到background指向的资源@drawable/backgroud2然后加载到内存赋值给RelativeLayout的android:background.如果当前主题 是AppTheme_Another,就会导入@drawable/backgroud1给RelativeLayout的android:background
    
            好的.基本就讲到这里了.大家可以多看看  demo .多自己摸过下.
            具体的  Demo下载地址: [http://www.eoeandroid.com/thread-264902-1-1.html](http://www.eoeandroid.com/thread-264902-1-1.html)
    或者我的博客: [http://www.krislq.com/2013/04/android_class_change_skin/](http://www.krislq.com/2013/04/android_class_change_skin/)
    

    声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息

    原文作者: kris

    原文地址: http://my.eoe.cn/kris/archive/2245.html



    展开全文
  • android 换肤

    2011-10-29 01:11:55
    转载地址:... ... 国内有很多的软件都支持皮肤定制,这也是与国外软件重大不同之一,国外用户注重社交、邮件等功能,国内用户则重视音乐、小说、皮肤等功能,本节课程就来讲解And
  • 主要介绍了 Android 换肤技术总结的相关资料,需要的朋友可以参考下
  • Android换肤系列

    2015-11-08 00:03:32
    Android 换肤 1.Android换肤系列 Resources 2.Android换肤系列 Activity资源加载 3.Android换肤系列 皮肤资源加载与替换
  • Android换肤总结

    2020-03-19 14:43:46
    据我所知目前Android换肤有两种类型,静态换肤和动态换肤;静态换肤就是将所有的皮肤方案放到项目中,而动态换肤则就是从网络加载皮肤包动态切换; 通常静态换肤是通过Theme实现,通过在项目中定义多套主题,使用...
  • Android换肤调研

    2019-09-22 15:50:40
    Android换肤技术已经是很久之前就已经被成熟使用的技术了,公司业务上需要用到换肤.为了不重复造轮子,并且快速实现需求,并且求稳,发现主要有两个框架比较流行,Android-Skin-Loader和Android-skin-support Android-...
  • Android换肤技术总结

    2017-12-25 18:09:48
    Android换肤技术总结
  • Android-skin-support: 一款用心去做的Android 换肤框架, 极低的学习成本, 极好的用户体验.
  • Android换肤demo

    2019-05-16 15:12:26
    这个demo实现了Android开发非常简洁快速换肤的功能,导入module即可实现
  • Android-skin-support: 一款用心去做的Android 换肤框架, 极低的学习成本, 极好的用户体验. 只需要两行代码, 就可以实现换肤, 你值得拥有!!! 第一行: 在Application的onCreate中初始化 SkinCompatManager.init(this)...
  • Android 换肤原理分析

    2020-06-20 08:54:14
    Android 换肤的理论知识和文章已经很多了,这里记录一下自己对这块的理解。本文效果如下: 工程:一键换肤的快乐 一、换肤的由来 首先,为什么要换肤呢?那肯定是一套UI不满足需求,无法面对多变的需求,从而需要有...
  • Android换肤Demo

    2015-09-10 09:42:40
    Android换肤可以通过切换Layout布局文件来切换皮肤。 Demo下载地址http://download.csdn.net/detail/ericfantastic/9093927 换肤Demo截图:     Demo实现很简单,准备一个布局文件,其他skin1-3布局...
  • 前言Android换肤技术已经是很久之前就已经被成熟使用的技术了,然而我最近才在学习和接触热修复的时候才看到。在看了一些换肤的方法之后,并且对市面上比较认可的Android-Skin-Loader换肤框架的源码进行了分析总结。...
  • 2.3 Android 换肤原理

    2018-08-31 03:29:38
    Android 换肤原理 制作皮肤包,皮肤包相当于一个apk,不过只包含了资源文件 获取到皮肤包的Resource对象 标记需要换肤的View 切换时刷新页面 换肤用的Api 1.通过的Resource获取皮肤包中资源(一般是图片,颜色)的id...
  • 我们在上一篇Android换肤思路深入剖析2中通过分析super.onCreate方法的源码得出了一些信息,并且通过这些信息得到了一些疯狂的猜想。接下来我们通过分析哪些得出的信息,进一步来分析、验证一下那个猜想是否可行,...
  • 主要介绍了android换肤功能中如何动态获取控件中背景图片的资源id? 感兴趣的小伙伴们可以参考一下

空空如也

1 2 3 4 5 ... 20
收藏数 1,587
精华内容 634
关键字:

android换肤