2

当您运行应用程序以查看视图的位置和大小时,是否有一种简单的方法可以用某种颜色的边框勾勒出视图?就像您可以使用插件“Web 开发人员”在 Firefox 中概述网页上的元素一样。

现在,我有一些“可绘制形状”的 xml 文件,用于在不同视图上使用的不同颜色。但是,仅仅为了打开和关闭轮廓而需要在布局 xml 文件中的视图中添加和删除所有这些可绘制的形状并不是最佳选择。

我认为可能可行的一种解决方案(但假设有更好的方法)是,如果可以在一个 xml 中添加所有“形状:s”并且仍然能够“链接”到布局 xml 中的每个单独文件?在这种情况下,我可以只有两个 xml 文件,一个在“形状”中有“笔划”,一个没有(只是空的“形状:s”),只需更改它们之间的名称,即可打开和关闭大纲。

现在每个形状文件看起来像这样(ex drawable/test_border_red.xml)

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <stroke 
    android:width="1dp" 
    android:color="#ff0000" 
    />
  <padding 
    android:left="1dp" 
    android:top="1dp" 
    android:right="1dp"
    android:bottom="1dp" 
    />   
  </shape>

然后添加...

android:background="@drawable/test_border_red"

到布局 xml 文件中的每个有趣的视图。

如果可以在一个 xml 文件中包含所有“形状”,那么代码应该是什么样子?

4

3 回答 3

5

无需代码:

在您用于测试的设备上,转到settings -> developer options并打开Show layout boundaries

问题解决了

于 2016-09-02T20:08:02.417 回答
2

使用活动的根视图尝试这种递归方法

private void outlineViews(View parent){
    if (!(parent instanceof ViewGroup)){
        return;
    }
    ViewGroup vg = (ViewGroup) parent;
    for (int i=0; i<vg.getChildCount(); i++){
        View view = vg.getChildAt(i);
        GradientDrawable gd = new GradientDrawable();
        gd.setStroke(3, Color.RED);
        view.setBackgroundDrawable(gd);
        outlineViews(view);
    }
}

您还可以从“设备”选项卡中选择“转储视图层次结构”,它将转储您当前的布局以及有关视图的所有信息

在此处输入图像描述

于 2014-11-01T16:09:00.050 回答
0

一种可能的解决方案是您可以有一些自定义布局,例如您可以扩展 LinearLayout,并覆盖 onDraw 方法,

在您的新自定义布局的 onDraw 方法中,您可以获取所有子视图的位置并递归地在它们上绘制笔触

于 2012-03-02T10:03:51.697 回答