我有一个相当复杂的Android UI布局(它根据业务规则动态添加了很多)。
UI的一部分有一个LinearLayout,它包含另一个包含EditText的布局。有时在基本布局中有另一个LinearLayout,其中包含编辑文本 - 它看起来像这样
LinearLayout
|
+-EditText
|
+-LinearLayout
| |
| +-EditText
+-EditText
|
+-LinearLayout
| |
| +-LinearLayout
| | |
| | +-EditText
| +-EditText
等等
目前,我在方法中有一堆循环来检查它是否是LinearLayout,然后检查下一个Child是EditText还是LinearLayout。如果它是另一个LinearLayout然后它创建另一个循环,检查是否有EditText等等。它变得凌乱。
在LINQ(或类似的东西)中是否有一种方法可以迭代整个LinearLayout以便选择EditText小部件?
我不知道你在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);
}
}
}