MyComplexView
),例如一个包含ImageView
、TextView
和Button
的RelativeLayout
。 我想要声明一个具有布局的xml,然后创建该类:MyComplexView extends RelativeLayout{...}
但我不知道应该覆盖哪个方法来指示应该被膨胀的布局。 我该如何做到这一点?谢谢。
类似以下方式:
添加来自超级类的构造函数。 (只有带有上下文的构造函数用于在程序中创建视图,其他构造函数用于将视图添加到XML中。
创建一个名为init()
的方法,并从每个构造函数中调用它。
在init方法内部执行以下操作:
LayoutInflater.from(context).inflate(R.layout.my_view_layout, this, true);
现在在解压缩时,附加参数实际上意味着:
true -> 将布局附加到您的情况下的根RelativeLayout(专业提示:因此,在xml中,如果您的布局根还是RelativeLayout并且可以通过代码对其进行排序以使层次结构更简单,您可以仅使用merge标记并将它们对齐)或任何其他你喜欢的布局。
this -> 要将充气的视图附加到的布局,在您的情况下,是您正在扩展的RelativeLayout。
它将自动附加到根 -> 扩展RelativeLayout。
然后,您可以使用findViewById,例如:
this.findViewById(R.id.myView);
我不确定您的主要目标是什么,所以我会尽可能详细地解释:
如果您想在其他布局中包含复杂的布局,则可以简单地定义my_complext_layout.xml
,并在其他布局中放置:
<include layout="@layout/my_complext_layout" />
MyComplexView
,并在视图创建时运行代码。OnGlobalLayoutListener
并将其添加到您的布局中,在您的视图构造函数中。为MyComplexView
实现一个构造函数:
public MyComplexView(Context context, AttributeSet attrs){
LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.header_view, this, true);
mHeaderView = (TextView)findViewById(R.id.header);
if(mHeaderView != null)
mHeaderView.setText("Test");
}
创建自定义视图通常旨在创建尚不存在的小部件。您要做的是在多个位置重复相同的布局。
根据您的上下文,有几种选项可供选择。
如果要将布局放置在列表中,请在单独的文件中创建布局,并在ListAdapter中使用它。请参阅ListView教程。
如果此布局是要嵌入多个活动的通用布局,请尝试使用Fragment。片段是活动的子部分,具有自己的视图。或者,您可以使用标签将布局嵌入到多个xml中。
如果您真的想要一个自定义类和单个小部件,则需要扩展View类。扩展布局意味着您希望以不同的方式组织子小部件(例如,将它们组织成圆形)。扩展视图,您可以始终以相同的方式组织所需的内容(按钮、图像、文本)。但我不会对您撒谎,这将意味着很多工作。