【发布时间】:2012-06-18 14:40:46
【问题描述】:
我想创建一个自定义视图(我称之为MyComplexView),例如RelativeLayout 与Imageview、TextView 和Button。
我想用布局声明一个xml,然后创建类:
MyComplexView extends RelativeLayout{...}
但我不知道应该覆盖什么来指示应该膨胀哪个布局。
我该怎么做?谢谢
【问题讨论】:
我想创建一个自定义视图(我称之为MyComplexView),例如RelativeLayout 与Imageview、TextView 和Button。
我想用布局声明一个xml,然后创建类:
MyComplexView extends RelativeLayout{...}
但我不知道应该覆盖什么来指示应该膨胀哪个布局。
我该怎么做?谢谢
【问题讨论】:
类似这样的:
从超类添加构造函数。 (只有上下文的用于以编程方式创建视图,其他用于在 XML 中添加视图时。
例如创建一个名为init() 的方法并从每个构造函数中调用它。
在init方法里面做:
LayoutInflater.from(context).inflate(R.layout.my_view_layout, this, true);
现在 inflate 附加参数实际上意味着:
true -> 将布局附加到您的案例相对布局中的根(专业提示:因此,如果您的布局根也是相对布局,则在 xml 中您可以只合并标签并在代码中对齐它们,以便层次结构更简单) 或您喜欢的任何布局。
this -> 将膨胀视图附加到您正在扩展的相对布局的布局。
它将自动附加到根 -> 扩展RelativeLayout。
然后你可以像这样使用 findViewById:
this.findViewById(R.id.myView);
【讨论】:
我不能 100% 确定您的主要目标是什么,所以我尽量做到彻底:
如果你想在其他布局中包含一个复杂的布局,那么你可以简单地定义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");
}
【讨论】:
请参阅开发者文档中的 Custom Components。特别是Compound Controls 部分。
一旦你创建了你的 java 文件,为了在 xml 中引用它,你必须使用一个完全限定的包名,即:
<com.yourpackage.YourCustomView
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
【讨论】:
创建自定义视图通常旨在创建尚不存在的小部件。您要做的是在多个地方重复相同的布局。
根据您的上下文,您有多种选择。
如果要将布局放在一个目录中,只需在一个单独的文件中创建您的布局,然后在 ListAdapter 中使用它。为此,请查看ListView Tutorial。
如果此布局是要嵌入多个活动的通用布局,请尝试改用片段。片段是活动的子部分,具有自己的视图。或者,您可以使用标签将布局嵌入到多个 xml 中。
如果你真的想要一个自定义类和单个小部件,那么你需要扩展 View 类。扩展布局意味着您不希望以不同的方式组织子小部件(例如,将它们组织成圆形)。扩展视图,您可以始终以相同的方式组织您想要的内容(按钮、图像、文本)。但我不会骗你,这意味着很多工作。
【讨论】: