65.9K
CodeProject 正在变化。 阅读更多。
Home

在构建时切换 Xamarin.Android 资源

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2016年11月12日

CPOL

3分钟阅读

viewsIcon

12829

downloadIcon

116

使用资源切换来支持 Xamarin.Android 项目中的多个部署方案。

引言

当您拥有可用于多个客户的代码库时,通常需要根据特定客户提取不同的资产。 为了在 Xamarin.Android 解决方案中实现这一点,一种方法是使用多个类库,每个类库包含特定于特定客户的资源。
 
在本文中,您将看到如何使用多个类库项目来管理针对多个部署方案的不同资源集。 您将看到如何使用 Visual Studio 配置管理器来创建新的构建配置。 您将了解如何向 .csproj 文件中的 ProjectReference 元素添加条件属性。 最后,您将看到如何在视图中引用外部资源。

请注意,与我通常的文章相比,本文的内容略有不足。 我最初打算把它作为一篇博客文章。 但最终,我决定将其放在 CodeProject 上会更好。
 
按照以下步骤构建一个具有可切换资源集的解决方案。

步骤 1:启动 Visual Studio 并在 Visual Studio 中创建一个 Android 类库项目,与您的 Xamarin.Android 项目一起。 使用特定于部署的图像、布局、尺寸等填充 Resources 子目录。

为每个客户或部署方案重复步骤 1。 您最终会得到如图 1 所示的内容。
 
图 1. 示例解决方案。

您会看到每个客户端在其各自的类库中都有一组独特的资源。

步骤 2:为每个部署方案创建一个构建配置。 参见图 2。
 
您可以通过从构建配置下拉列表中选择“配置管理器”来打开配置管理器。
 
图 2. 使用配置管理器创建新的构建配置。
 
我基于 Release 配置创建了这些配置,但您可以很轻松地同时拥有一组用于调试和发布的配置。 

步骤 3:卸载并编辑 App 项目的 .csproj 文件,以包含条件项目引用,请参见清单 1。

 清单 1. 主项目条件项目引用。

<ItemGroup>
    <ProjectReference Include="..\ClientResources01\ClientResources01.csproj" 
             Condition=" '$(Configuration)' == 'ReleaseClient01' ">
      <Project>{6e7d6a5c-a233-40a2-9178-47e389e6c438}</Project>
      <Name>ClientResources01</Name>
    </ProjectReference>
    <ProjectReference Include="..\ClientResources02\ClientResources02.csproj" 
             Condition=" '$(Configuration)' == 'ReleaseClient02' ">
      <Project>{33BD954A-F926-4140-9DEF-0D4114FC2A08}</Project>
      <Name>ClientResources02</Name>
    </ProjectReference>
  </ItemGroup>
请注意每个 ProjectReference 中的 Condition 属性,以及它们如何对应于您在步骤 2 中创建的构建配置名称。

步骤 4:重新加载您的主项目,将其设置为启动项目,您就可以开始了。

注意: 在构建配置之间切换时,您需要执行清理或重建,否则将不会获取新资源。

在可下载的示例中,我放置了一个 ImageView,其源设置为名为 logo.png 的图像。 参见清单 2。 每个类库的 Resources/drawable 目录中都有一个 logo.png。

清单 2. Main.axml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/main">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/logo" />
</LinearLayout>

LinearLayout 的背景颜色使用名为 main 的资源颜色定义。 特定于部署的颜色放置在 ClientColors01.xmlClientColors02.xml 中。

注意:我选择为每个颜色资源文件赋予一个唯一的名称,仅仅是为了能够使用 Resharper 能够更快地单独找到每个文件。

客户端 1 在主视图中有一个黑色背景,定义如下

<color name="main">#000</color>

而客户端 2 有一个白色背景

<color name="main">#FFF</color>
类似地,客户端 1 的徽标设计用于深色背景,而客户端 2 的徽标设计用于浅色背景。 你明白了。 参见图 2。
 
图 2. 客户端 1 和客户端 2 配置运行中
 

结论

在本文中,您看到了如何使用多个类库项目来管理针对多个部署方案的不同资源集。 您看到了如何使用配置管理器来创建新的构建配置。 您了解了如何向 ProjectReference 元素添加条件属性到 .csproj 文件中。 最后,您看到了如何在视图中引用外部资源。
 
我希望这个项目对您有用。如果觉得有用,请评分和/或在下方留言。

历史

  • 2016 年 11 月 12 日
    • 首次发布

 

© . All rights reserved.