Android:当前显示的布局文件名

时间:2013-08-20 15:46:24

标签: android testing layout

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我假设你可以使用reflection并进行大量迭代。

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

但是:该名称将仅包含布局文件名称(在您的示例中为main),而不是其完整路径,即使您可能具有相同名称的重复布局,例如用于风景/肖像模式等

我从未尝试过类似的东西而且我不确定这是否成功,因为我不知道你的测试环境是否可以无误地访问你的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()为null)

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