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结束
有两件事可以告诉你:
-
我知道从XML中添加视图does not调用给定的addView,但我已经覆盖所有其他人也都看起来相同,所以没有必要显示它们。
-
调试器对我说,那个addView被调用之前_innerLayout得到膨胀的布局
是2.原因?
你能帮我吗?
你可以看看如何在这里将自己的孩子膨胀成自定义视图(vogella教程) 。
你需要的是:
- 使用
<merge>
标签定义带有子项的布局 - 使用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 } }