在 Android 中创建复合视图

Posted

技术标签:

【中文标题】在 Android 中创建复合视图【英文标题】:Create a composite view in Android 【发布时间】:2012-06-18 14:40:46 【问题描述】:

我想创建一个自定义视图(我称之为MyComplexView),例如RelativeLayoutImageviewTextViewButton

我想用布局声明一个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 中创建自定义视图

如何在android中创建圆角surfaceview

您将如何在 Android 中创建弹出视图,例如 Facebook 评论?

为 android ListView 设置空视图不适用于在 Java 中创建的视图

如何在 Xamarin Android 的 AlertDialog 中创建带有自定义适配器的列表视图

在 Android Studio 中创建一个包含多个对象的列表视图