0

我已经有一段时间没有在互联网上找到答案了,现在我问你是否可以帮助我。

简短:我应该如何覆盖 addView() (或其他东西)以将 XML 中定义的视图添加到我的“自定义视图膨胀 XML 布局”

Long:我想为我的 android 应用程序创建一个自定义视图,所以我从 RelativeLayout 创建了一个干净的子类。在此,我让 Inflater 加载一个 xml 布局以获得漂亮的样式。

但是现在,我想在自定义视图中添加一些东西,但不想以编程方式添加它(这很简单),而是使用 xml。我无法跨越脑海中的鸿沟来找到解决方案......

代码:自定义类:

public class Slider extends RelativeLayout {

    private RelativeLayout _innerLayout;

    public Slider(Context context) {
        super(context);
        init();
    }

    public Slider(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    protected void init() {
        LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        _innerLayout = (RelativeLayout) layoutInflater.inflate(R.layout.layout_r, this);

    }

    @Override
    public void addView(View child) {
        //if (_innerLayout != null) _innerLayout.addView(child);
        super.addView(child);
    }

... all other addView's are overridden in the same way

使用子类的 XML 文件:

<packagename....Slider
    android:id="@+id/slider1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/Red" >
        <TextView
            android:id="@+id/heading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="HEADING" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="bbb" />

...

TextView 和 Button 被添加到子类中……当然……但是在那之后,我在 Slider、TextView、Button 和我的 R.layout.layout_r 中的膨胀布局中有 3 个孩子。但我只想要 1 个带有 Button 和 TextView 的孩子(layout_r)。

正如您在 addView 中看到的,我试图简单地将传递的“View child”添加到 _innerLayout。那行不通。Android 框架不断调用 addView 并以 StackOverFlowError 结束

还有两件事要告诉你:

  1. 我知道从 XML 添加视图不会调用给定的 addView,但我也覆盖了所有其他视图,并且所有视图看起来都一样,因此无需显示它们。

  2. 调试器告诉我,在 _innerLayout 获得膨胀的布局之前调用 addView

2.是什么原因?

你能帮我吗?

4

2 回答 2

1

您可以在此处查看如何将孩子充气到自定义视图(vogella 教程)

你需要的是:

  1. <merge>使用标签定义带有子元素的布局
  2. 使用LayoutInflater.inflate(res, this, true)在自定义视图构造函数中膨胀此布局
于 2014-02-22T09:05:46.917 回答
0

只需addView()在您的自定义视图中覆盖您的方法Slider并检查孩子的数量。如果getChildCount() == 0,那么这是第一次添加并且是视图初始化。

科特林示例:

override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) {
    if (childCount == 0) {
        super.addView(child, index, params)
    } else {
        // Do my own addition
    }
}
于 2017-08-25T11:11:30.150 回答