在复杂的布局中查找EditText

时间:2019-03-27 10:03:39

标签: xamarin.android

我的Android UI布局非常复杂(根据业务规则动态添加了很多)。

UI的一部分具有LinearLayout,其中包含另一个布局,其中包含EditText。有时,基本布局中还会有另一个LinearLayout,其中包含编辑文本-看起来像这样

-F "\\|\\|\\|"

依此类推

当前,我在方法中有一堆循环,检查它是否是LinearLayout,然后检查下一个Child是EditText还是LinearLayout。如果是另一个LinearLayout,则它将创建另一个循环,检查是否存在EditText,依此类推。太乱了。

LINQ(或类似方式)中是否有一种方法可以遍历整个LinearLayout以便选择EditText小部件?

1 个答案:

答案 0 :(得分:0)

我不知道您所要求的LINQ方式,也不确定您如何在代码中循环,但是几年前我也有类似的需求,并创建了一个可迭代每个类的类视图,包括深层嵌套的视图。

输出字符串显示完整的层次结构,包括带有适当缩进的子代,孙代等。当然,您可以修改代码以查找特定的视图类型并对其进行操作,例如:

if (vChild is EditText) vChild.Enabled = false;

希望这会有所帮助!

public class IterateView {
    // Iterate a view and all children recursively and generate a visual hierarchy

    #region Example Usage
    // //OnCreate()...
    // SetContentView(Resource.Layout.MyLayout);
    // RelativeLayout view = FindViewById<RelativeLayout>(Resource.Id.MyRelativeLayoutView);
    // IterateView iv = new IterateView();
    // iv.Iterate(view);
    // string s = iv.OutputString;
    #endregion

    private readonly StringBuilder sb = new StringBuilder();
    private const string PADDING_STRING = "  ";
    private string sPadding = "";
    public string OutputString { get; private set; }

    public void Iterate(View view) {
        if (view is ViewGroup)
            IterateViewChildren(view);
        else
            sb.AppendLine(sPadding + view.GetType().Name);
        OutputString = sb.ToString();
    }

    private void IterateViewChildren(View view) {
        if (view is ViewGroup) {
            sb.AppendLine(sPadding + view.GetType().Name + " (ViewGroup)");
            sPadding += PADDING_STRING;
            ViewGroup vGroup = (ViewGroup)view;
            for (int i = 0; i < vGroup.ChildCount; i++) {
                if (!(vGroup.GetChildAt(i) is ViewGroup))
                    sb.AppendLine(sPadding + vGroup.GetChildAt(i).GetType().Name);
                View vChild = vGroup.GetChildAt(i);
                IterateViewChildren(vChild);
            }
            // Remove padding after iterating children to get us back to where we need to be
            sPadding = sPadding.Remove(sPadding.Length - PADDING_STRING.Length);
        }
    }
}