我正在尝试按名称获取布局资源的int资源ID,使用Android API的Resources.GetIdentifier(),但它返回0.我使用的是c#/ monodroid / Xamarin,但是常规java Android知识也适用我怀疑。这是我的代码:
int resId = Resources.GetIdentifier(typeName, "layout", _activity.PackageName);
typeName =“FrmMain”,在我的项目中,我有“Resources / Layout / FrmMain.axml”文件。有什么想法吗?
答案 0 :(得分:12)
这是旧的,但是对于每个人都遇到这个问题,我认为这是因为资源名称应该是小写的,所以:
int resId = Resources.GetIdentifier("FrmMain", "layout", _activity.PackageName);
不起作用,但是:
int resId = Resources.GetIdentifier("frmmain", "layout", _activity.PackageName);
应该有效
答案 1 :(得分:2)
我不知道为什么会失败,但不会像Resource.Layout.FrmMain
那样实现你所追求的目标?
修改强>
根据{{3}},您可以(并且应该)使用反射来实现您所追求的目标,因此我认为您会尝试这样的事情:
var resourceId = (int)typeof(Resource.Layout).GetField(typeName).GetValue(null);
这似乎对我的应用程序起作用,应该得到你想要的东西。
答案 2 :(得分:0)
我已经创建了一个ResourceHelper
类来处理这种情况。这是代码:
public static class ResourceHelper
{
public static int FindId(string resourceId)
{
var type = typeof(Resource.Id);
var field = type.GetField(resourceId);
return (int)field.GetRawConstantValue();
}
public static int FindLayout(string layoutName)
{
var type = typeof(Resource.Layout);
var field = type.GetField(layoutName);
return (int)field.GetRawConstantValue();
}
public static int FindMenu(string menuName)
{
var type = typeof(Resource.Menu);
var field = type.GetField(menuName);
return (int)field.GetRawConstantValue();
}
}
实际上我正在改进它,因为我需要从另一个程序集中使用它,并且它被限制在Droid应用程序的同一个程序集中工作。我正在考虑使用泛型方法(或扩展方法)来执行此操作。这是我的想法草案:
public static int FindResource<T>(string resourceName)
{
var type = typeof(T);
var field = type.GetField(resourceName);
return (int)field.GetRawConstantValue();
}
希望它可以帮到你。
答案 3 :(得分:0)
就我而言,由于Google自2018年11月以来的新政策,我不得不升级目标SDK时出现了此问题。
我必须根据服务器响应代码(例如api_res_001_suc)显示一些字符串,但是在升级版本上不起作用。
我记得总体版本大约为22,必须更改为27。
问题的原因似乎是默认的翻译内容。当我为每个字符串输入所有默认翻译时,它就可以工作。
我的代码是
getResources().getIdentifier(resName, "string", "packageName");