6

我希望你能帮助我,我已经研究了我的案例,但没有找到一个好的答案。我想将变量的内容与所有现有资源的名称进行比较(如果可能,仅使用可绘制资源)。

简而言之:如何将变量的字符串内容与所有资源名称的列表进行比较,优先考虑可绘制资源?或者换句话说:如何获取所有资源名称的列表(包含字符串),只优先绘制可绘制资源?

案例:我想显示一个基于给定类型的符号。此类型是从 SQLite 数据库中检索的。有许多符号存储为可绘制资源,它们都被命名为可能的类型。对于数据库中的每个存储类型,我想在列表中显示拟合符号。应该通过变量“type”和包含所有(可绘制)资源名称的列表之间的比较(通过 contains 方法)找出相等性。

示例:数据库中有名为“A”、“B”和“C”的类型。在可绘制资源文件夹中是名称为“A”、“BX”和“S”的图形。比较应该导致这种情况,在列表中只有类型“A”与合适的可绘制符号“A”连接。类型“B”和“C”没有可能命名的可绘制资源,因此不应显示任何符号。

我希望你能理解我的问题,并提前感谢你的帮助。

4

2 回答 2

16

或者换句话说:如何获取所有资源名称的列表(包含字符串),只优先绘制可绘制资源?

这可能是你想要的:

Field[] fields = R.drawable.class.getFields();
String[] allDrawablesNames = new String[fields.length];
for (int  i =0; i < fields.length; i++) {           
    allDrawablesNames[i] = fields[i].getName();
}
于 2012-12-11T13:20:54.487 回答
1

抱歉,我知道您正在寻找 Java 解决方案,但我没有在 StackOverflow 中找到 C# 和 Xamarin 问题的任何解决方案,所以如果您不介意,我将把我的 Android 解决方案留在这里。

我在 GitHub 上找到了一个写得很好的类ReflectionUtils,就用了,把这个方法做成了调用。

    private List<string> GetAllStrings()
    {
        IEnumerable<FieldInfo> fields = ReflectionUtils.GetAllFields(typeof(Resource.String));
        List<string> list = new List<string>();
        using (var enumerator = fields.GetEnumerator())
        {
            try
            {
                while (enumerator.MoveNext())
                {
                    list.Add(enumerator.Current.Name);
                }
            } catch (Exception e)
            {
                // Handle exception.
            }
        }
        return list;
    }
于 2018-02-19T11:15:58.253 回答