我有一个相当复杂的Android UI布局(根据业务规则动态添加了很多内容)。
UI的一部分有一个包含另一个布局的LinearLayout,该布局包含一个EditText。有时,在基本布局中会有另一个包含编辑文本的LinearLayout -它看起来像这样
LinearLayout
|
+-EditText
|
+-LinearLayout
| |
| +-EditText
+-EditText
|
+-LinearLayout
| |
| +-LinearLayout
| | |
| | +-EditText
| +-EditText
诸若此类
目前,我在一个方法中有一堆循环,用于检查它是否为LinearLayout,然后检查下一个子对象是EditText还是LinearLayout。如果是另一个LinearLayout,它会创建另一个循环,检查是否有EditText,依此类推。弄得乱七八糟。
在LINQ (或类似的东西)中,有没有一种方法可以让我遍历整个LinearLayout,以便挑选出EditText小部件?
发布于 2019-03-28 04:04:38
我不知道您所要求的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);
}
}
}
https://stackoverflow.com/questions/55374502
复制相似问题