Resources.GetIdentifier()为布局返回0(Android)

时间:2013-12-03 14:49:22

标签: android xamarin.android xamarin

我正在尝试按名称获取布局资源的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”文件。有什么想法吗?

4 个答案:

答案 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");