Xamarin.Forms Android项目添加BuildDate资源及PCL访问问题求助
解决Xamarin.Forms Android项目中构建日期资源的添加与访问问题
嘿,我来帮你搞定这个构建日期资源的问题~你遇到的报错和访问难题,其实是因为Android资源目录的规则和PCL跨平台访问的限制,咱们一步步来解决:
一、先搞定BuildDate.txt的资源添加(解决目录报错)
你碰到的invalid resource directory name错误,是因为Android的Resources目录有严格的结构要求——它的直接子目录必须是系统规定的类型(比如drawable、values、raw这些),不能直接把自定义文本文件扔在Resources根目录。正确操作是:
- 在
MyProject.Droid/Resources下面新建一个raw子文件夹(没有的话就建一个) - 把你的
BuildDate.txt移到这个raw文件夹里 - 然后把文件的生成操作设置为
AndroidResource,这时候就不会报错啦
为啥用
raw目录?因为raw是Android专门用来存原生资源文件的地方,支持任意格式,会完整打包进APK,还能保留原始文件名,完美适配咱们的需求。
二、自动更新BuildDate.txt的构建日期(可选但实用)
既然你已经能更新文件内容,这里给你补个自动更新的方法,省得每次手动改:
打开Android项目的.csproj文件,添加这段MSBuild任务,每次构建时会自动把当前日期写入文件:
<Target Name="WriteBuildDate" BeforeTargets="Build"> <WriteLinesToFile File="Resources\raw\BuildDate.txt" Lines="$([System.DateTime]::Now.ToString('yyyy/MM/dd HH:mm:ss'))" Overwrite="true" /> </Target>
三、在PCL ViewModel里访问这个资源
PCL不能直接访问Android平台的资源,所以得用Xamarin的依赖服务来跨平台获取内容,步骤很简单:
1. 在PCL项目里定义一个接口
先写个接口,规定好获取构建日期的方法:
public interface IBuildDateService { string GetBuildDate(); }
2. 在Android项目里实现这个接口
在MyProject.Droid项目里写个实现类,读取raw目录下的文件:
[assembly: Dependency(typeof(BuildDateService))] namespace MyProject.Droid { public class BuildDateService : IBuildDateService { public string GetBuildDate() { using (var stream = Android.App.Application.Context.Resources.OpenRawResource(Resource.Raw.BuildDate)) using (var reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } } }
注意:
Resource.Raw.BuildDate是系统自动生成的资源ID,只要你文件放对位置、生成操作设对,就能自动拿到这个ID,不用手动写。
3. 在PCL的ViewModel里调用
现在就可以在你的ViewModel里轻松获取构建日期了:
public class YourViewModel { public string BuildDate { get; set; } public YourViewModel() { BuildDate = DependencyService.Get<IBuildDateService>().GetBuildDate(); } }
四、小问题排查
- 如果找不到
Resource.Raw.BuildDate:检查文件是不是在raw目录,生成操作是不是AndroidResource,然后清理项目再重新构建试试。 - 如果读取出来是空的:确认BuildDate.txt确实有内容,或者检查自动更新的MSBuild任务有没有正确执行。
内容的提问来源于stack exchange,提问作者ting12
相关产品推荐
相关产品推荐

