首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在复杂布局中查找EditText

在复杂布局中查找EditText
EN

Stack Overflow用户
提问于 2019-03-27 18:03:39
回答 1查看 38关注 0票数 0

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

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

代码语言:javascript
复制
LinearLayout
|
+-EditText
|
+-LinearLayout
| |
| +-EditText
+-EditText
|
+-LinearLayout
| |
| +-LinearLayout
| | |
| | +-EditText
| +-EditText

诸若此类

目前,我在一个方法中有一堆循环,用于检查它是否为LinearLayout,然后检查下一个子对象是EditText还是LinearLayout。如果是另一个LinearLayout,它会创建另一个循环,检查是否有EditText,依此类推。弄得乱七八糟。

在LINQ (或类似的东西)中,有没有一种方法可以让我遍历整个LinearLayout,以便挑选出EditText小部件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 04:04:38

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

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

代码语言:javascript
复制
if (vChild is EditText) vChild.Enabled = false;

希望这能有所帮助!

代码语言:javascript
复制
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);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55374502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档