【问题标题】:android, adding XML Layout Views to an inflated view in a custom classandroid,将 XML 布局视图添加到自定义类中的膨胀视图
【发布时间】:2013-04-18 14:33:32
【问题描述】:

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

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

长: 我想为我的 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.原因吗?

你能帮帮我吗?

【问题讨论】:

    标签: android xml layout


    【解决方案1】:

    你可以看看如何将孩子充气到自定义视图here (vogella tutorial)

    你需要的是:

    1. 使用&lt;merge&gt; 标签定义带有子元素的布局
    2. 使用LayoutInflater.inflate(res, this, true) 在自定义视图构造函数中扩展此布局

    【讨论】:

      【解决方案2】:

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

      Kotlin 示例:

      override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) {
          if (childCount == 0) {
              super.addView(child, index, params)
          } else {
              // Do my own addition
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多