2

我正在通过扩展抽象类 ViewGroup 来制作自定义布局 Android 组件(根据 Parleys.com 上 Romain Guy 的此视频教程:http: //www.parleys.com/#st=5&id=2191&sl=1)。

我的组件应该包含子组件,但我想将其限制为只有 1 个 ViewGroup 类型的子组件(例如另一个 LinearLayout 或 RelativeLayout)。有点像 ScrollView。有没有办法添加这个限制?

编辑:正如 android 开发人员所说,最终解决方案是以编程方式检查 ViewGroup 子类的 onFinishInflate 约束,如下所示:

@Override
public void onFinishInflate()
{
    if (getChildCount() > 1)
        throw new IllegalArgumentException("Only 1 child allowed");

    if (getChildCount() == 0 || !(getChildAt(0) instanceof ViewGroup))
        throw new IllegalArgumentException("Child must be a ViewGroup");
}
4

2 回答 2

3

你当然可以 。

只需通过 using 获取孩子数,getChildCount()以检查是否只有一个孩子。

然后,通过使用获取 viewGroup 中唯一的孩子getChildAt(0)

在此之后,对结果使用反射并对它的类做任何额外的检查(例如,使用getSuperclass()

于 2012-08-11T20:43:13.223 回答
0

让我从自定义视图组开始为其他所有人添加这个问题的答案。

当视图被添加到任何类型的视图组时,可以使用的方法如下:

public void addView(View child)
public void addView(View child, int index)
public void addView(View child, int width, int height)
public void addView(View child, LayoutParams params)
public void addView(View child, int index, LayoutParams params)

无论是通过 xml 还是代码添加 ViewGroup 及其子项,都将调用其中一种方法。

现在,如果您想将自定义视图组限制为特定条件。只需在这些方法中添加该条件。

这是取自 ScrollView 类的示例代码。

@Override
public void addView(View child) {
    if (getChildCount() > 0) {
        throw new IllegalStateException("ScrollView can host only one direct child");
    }

    super.addView(child);
}

@Override
public void addView(View child, int index) {
    if (getChildCount() > 0) {
        throw new IllegalStateException("ScrollView can host only one direct child");
    }

    super.addView(child, index);
}

@Override
public void addView(View child, ViewGroup.LayoutParams params) {
    if (getChildCount() > 0) {
        throw new IllegalStateException("ScrollView can host only one direct child");
    }

    super.addView(child, params);
}

@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
    if (getChildCount() > 0) {
        throw new IllegalStateException("ScrollView can host only one direct child");
    }

    super.addView(child, index, params);
}

提示:在寻找特定实现时,您可以去寻找 android 组件如何实现事物并将其作为指南来实现。:)

于 2018-05-08T04:06:18.183 回答