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