在复杂的布局中查找EditText

问题描述 投票:0回答:1

我有一个相当复杂的Android UI布局(它根据业务规则动态添加了很多)。

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

LinearLayout
|
+-EditText
|
+-LinearLayout
| |
| +-EditText
+-EditText
|
+-LinearLayout
| |
| +-LinearLayout
| | |
| | +-EditText
| +-EditText

等等

目前,我在方法中有一堆循环来检查它是否是LinearLayout,然后检查下一个Child是EditText还是LinearLayout。如果它是另一个LinearLayout然后它创建另一个循环,检查是否有EditText等等。它变得凌乱。

在LINQ(或类似的东西)中是否有一种方法可以迭代整个LinearLayout以便选择EditText小部件?

xamarin.android
1个回答
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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.