在 Android 中创建复合视图
Posted
技术标签:
【中文标题】在 Android 中创建复合视图【英文标题】:Create a composite view in Android 【发布时间】:2012-06-18 14:40:46 【问题描述】:我想创建一个自定义视图(我称之为MyComplexView
),例如RelativeLayout
与Imageview
、TextView
和Button
。
我想用布局声明一个xml,然后创建类:
MyComplexView extends RelativeLayout...
但我不知道应该覆盖什么来指示应该膨胀哪个布局。
我该怎么做?谢谢
【问题讨论】:
【参考方案1】:类似这样的:
从超类添加构造函数。 (只有上下文的用于以编程方式创建视图,其他用于在 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);
【讨论】:
我一直不明白为什么这在 android 中如此复杂。当然,这种可能性应该由 android 提供,但有人会认为您可以仅使用 XML 定义复杂的自定义视图。 所有视图都是用代码编写的,标准按钮也是用代码编写的。您只需将它与 XML 一起使用并对其进行部分自定义。如果您想制作更复杂的 UI,当然需要额外的努力和知识来完成。我在这里描述的是创建可重用组件的众多方法之一。【参考方案2】:我不能 100% 确定您的主要目标是什么,所以我尽量做到彻底:
如果你想在其他布局中包含一个复杂的布局,那么你可以简单地定义my_complext_layout.xml
,然后在你的其他布局中放:
<include layout="@layout/my_complext_layout" />
如果您需要运行自己的代码,那么您可以简单地将这个布局的根设为MyComplexView
,然后您可以在创建视图时运行代码。
如果您打算让您的代码在布局上运行,那么只需实现 OnGlobalLayoutListener
并将其添加到您的视图构造函数中的布局中。
【讨论】:
【参考方案3】:为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");
【讨论】:
【参考方案4】:请参阅开发者文档中的 Custom Components。特别是Compound Controls 部分。
一旦你创建了你的 java 文件,为了在 xml 中引用它,你必须使用一个完全限定的包名,即:
<com.yourpackage.YourCustomView
android:layout_
android:layout_ />
【讨论】:
【参考方案5】:创建自定义视图通常旨在创建尚不存在的小部件。您要做的是在多个地方重复相同的布局。
根据您的上下文,您有多种选择。
如果要将布局放在一个目录中,只需在一个单独的文件中创建您的布局,然后在 ListAdapter 中使用它。为此,请查看ListView Tutorial。
如果此布局是要嵌入多个活动的通用布局,请尝试改用片段。片段是活动的子部分,具有自己的视图。或者,您可以使用标签将布局嵌入到多个 xml 中。
如果你真的想要一个自定义类和单个小部件,那么你需要扩展 View 类。扩展布局意味着您不希望以不同的方式组织子小部件(例如,将它们组织成圆形)。扩展视图,您可以始终以相同的方式组织您想要的内容(按钮、图像、文本)。但我不会骗你,这意味着很多工作。
【讨论】:
以上是关于在 Android 中创建复合视图的主要内容,如果未能解决你的问题,请参考以下文章
您将如何在 Android 中创建弹出视图,例如 Facebook 评论?
为 android ListView 设置空视图不适用于在 Java 中创建的视图