android,将XML布局视图添加到自定义类中的充气视图中

我还没有在互联网上找到一个答案一段时间,现在我问你,如果你能帮助我。

短:我应该如何重写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,按钮和从R.layout.layout_r的充气布局中得到3个孩子。 但我只想要一个孩子(layout_r)与Button和TextView在其中。

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

有两件事可以告诉你:

  1. 我知道从XML中添加视图does not调用给定的addView,但我已经覆盖所有其他人也都看起来相同,所以没有必要显示它们。

  2. 调试器对我说,那个addView被调用之前_innerLayout得到膨胀的布局

是2.原因?

你能帮我吗?

你可以看看如何在这里将自己的孩子膨胀成自定义视图(vogella教程) 。

你需要的是:

  1. 使用<merge>标签定义带有子项的布局
  2. 使用LayoutInflater.inflate(res,this,true)使自定义视图构造函数中的布局充满膨胀

只需在自定义视图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 } }