0

如何获取当前使用的 Layout(s) 文件名的名称?例如,它可能是 res/layout/main.xml 或类似的东西。此外,需要此信息的代码不是包含此布局的应用程序的一部分,它是一种测试代码。

4

2 回答 2

0

我假设,您可以进行反思和大量迭代。

首先,您需要 R.layout 类中的所有静态数据 - 然后获取它们的值并将它们与 进行比较,View.getId()并在最后一步中检索字段名称。

但是:该名称将仅包含布局文件名称(在您的示例中main)而不是它的完整路径,即使您可能有相同名称的重复布局,例如横向/纵向模式等

我从来没有尝试过这样的事情,我不确定这是否可行,因为我不知道你的测试环境是否可以无错误地访问你的 R 文件,但这是你可以去的方式

编辑:只需添加一些应该完成工作的示例代码,在应用程序内工作 - 正如我所说我不确定你的框架和你访问 r 的方式

R.layout layout = new R.layout();
Map<Integer, String> id2name = new HashMap<Integer, String>();
for (Field f : layout.getClass().getDeclaredFields()) {
    try {
        id2name.put(f.getInt(layout), f.getName());
        Log.i("Layout", f.getInt(layout) + "," +  f.getName());
    }
    catch (IllegalArgumentException e) {
        //oops
        Log.e("Layout", "", e);
    }
    catch (IllegalAccessException e) {
        //oops
        Log.e("Layout", "", e);
    }
}
for (Entry<Integer, String> e:id2name.entrySet()) {
    if (findViewById(e.getKey()) != null) {
        Log.i("Layout:", "found: " + e.getValue() + ";" + e.getKey());
    }else {
        Log.i("Layout:", "not found: " + e.getValue()+ ";" + e.getKey());
    }
}

请注意,除非完成布局,否则将找不到视图(如果您提前调用,则 findViewById() 为空)

当然,您可以反过来并通过检查布局是否是 ViewGroup 的实例并遍历其子视图并将每个 id 与地图中的 id 进行比较来搜索视图树

于 2013-08-20T17:24:17.320 回答
0

你没有。在内部,Android 不会通过文件名来引用它们,而是通过 id- 整数来引用它们。您可以在生成的 R 文件中看到它使用的整数。并且该信息不会被存储,它会膨胀正确的文件然后忘记它。

于 2013-08-20T15:53:53.867 回答