有没有办法在Android中管理皮肤?

时间:2012-06-28 14:41:47

标签: android image skin

我正在开发一个包含2个主题和图片的应用程序,我将其用作皮肤。我可以在代码中为整个活动设置主题。我的问题是,在图片方面,我不知道如何正确分离皮肤。例如,我有两个主题(黑色和白色),我有一组特定于这些主题的图片。如何分隔图片,以便我可以从代码中为皮肤设置主题和图像?

1 个答案:

答案 0 :(得分:2)

对不起。我误解了这个问题。我保留了下面的答案,以便评论有一个自然的流程。

在这种情况下,我们拥有的是Branding.java类。这个类接受一个品牌名称(主题,在你的情况下),并产生与该主题无关的各种值和字符串。例如,您可以将Splash图像命名为dark_theme_splash.png和light_theme_splash.png。加载该drawable时,您调用Branding.getSplash()并根据所选的当前主题返回一个drawable。

public static Drawable getSplash() {
    switch(MYApplication.Theme){
    case LIGHT:
        return MYApplication.res.getDrawable(R.drawable.light_theme_splash);
    }
    return MYApplication.res.getDrawable(R.drawable.dark_theme_splash);
}

在品牌推广中你会:

public class Branding {

    public static final int LIGHT = 0;
    public static final int DARK = 1;

然后在您的应用程序中,您将拥有一个int current_theme并将其设置为您想要的主题。

* 以下是回答未实际问过的问题的旧答案* 我管理的应用程序有八个不同的主题。有些截然不同。到目前为止,我找到的最佳解决方案分为两部分。

1。)你的build.xml。由于您正在构建不同的皮肤应用程序,我想他们的.apk将以不同的名称命名。在build.xml中,利用不同的目标。例如:

   <target name="release-themeone">
        <antcall target="-do-release" inheritAll="false">
         <param name="app.pkg" value="mapmyfitness" />
         <param name="app.pkg.name" value="com.themeone.android2" />
         <param name="launcher.icon" value="common_icon_launcher" />
         <param name=".app.name" value="DarkTheme+" /> />
       </antcall>
    </target>

2。)这允许您为不同的构建设置不同的参数。在我的情况下,我们有很多不同的drawables,在各种drawables文件夹中管理它们变得很麻烦。所以在drawable文件夹本身,我们放入了所有的公共资产。然后在drawables之外创建了复制可绘制文件夹结构的文件夹,但是包含在主题的名称中。例如,文件夹Themeone将包含Drawable,Drawable-hdpi等。这使我们能够以这样一种方式操纵构建系统,即每个特定目标只拉动它所需的drawable。

  <copy todir="bin/${app.pkg}/res/drawable" overwrite="true">
    <fileset dir="./brands/${brand.prefix}/drawable"/>  
  </copy>
  <copy todir="bin/${app.pkg}/res/drawable-hdpi" overwrite="true">
    <fileset dir="./brands/${brand.prefix}/drawable-hdpi"/> 
  </copy>
  <copy todir="bin/${app.pkg}/res/drawable-mdpi" overwrite="true">
    <fileset dir="./brands/${brand.prefix}/drawable-mdpi"/> 
  </copy>
  <copy todir="bin/${app.pkg}/res/drawable-xhdpi" overwrite="true">
    <fileset dir="./brands/${brand.prefix}/drawable-xhdpi"/>    
  </copy>

所有这些都包含在build.xml中的for循环中,该循环遍历我们拥有的各种构建目标。

希望有所帮助。