我的Android UI布局非常复杂(根据业务规则动态添加了很多)。
UI的一部分具有LinearLayout,其中包含另一个布局,其中包含EditText。有时,基本布局中还会有另一个LinearLayout,其中包含编辑文本-看起来像这样
-F "\\|\\|\\|"
依此类推
当前,我在方法中有一堆循环,检查它是否是LinearLayout,然后检查下一个Child是EditText还是LinearLayout。如果是另一个LinearLayout,则它将创建另一个循环,检查是否存在EditText,依此类推。太乱了。
LINQ(或类似方式)中是否有一种方法可以遍历整个LinearLayout以便选择EditText小部件?
答案 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);
}
}
}