在Android中创建一个复合视图

3
我希望创建一个自定义视图(我将其称为MyComplexView),例如一个包含ImageViewTextViewButtonRelativeLayout。 我想要声明一个具有布局的xml,然后创建该类:
MyComplexView extends RelativeLayout{...}

但我不知道应该覆盖哪个方法来指示应该被膨胀的布局。 我该如何做到这一点?谢谢。
5个回答

5

类似以下方式:

  1. 添加来自超级类的构造函数。 (只有带有上下文的构造函数用于在程序中创建视图,其他构造函数用于将视图添加到XML中。

  2. 创建一个名为init()的方法,并从每个构造函数中调用它。

  3. 在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);

我从来没有理解为什么在安卓中这是如此复杂的。当然,安卓应该提供这种可能性,但人们会认为你可以仅通过XML定义复杂的自定义视图。 - Geki
所有视图都是用代码编写的,标准按钮也是用代码编写的。您只需在XML中使用它并进行部分自定义即可。如果您想要创建更复杂的UI,则需要额外的努力和知识来完成。我在这里描述的是创建可重用组件的众多方法之一。 - DArkO

1

我不确定您的主要目标是什么,所以我会尽可能详细地解释:

如果您想在其他布局中包含复杂的布局,则可以简单地定义my_complext_layout.xml,并在其他布局中放置:

<include layout="@layout/my_complext_layout" />

如果您需要运行自己的代码,那么您可以将此布局的根视图设置为MyComplexView,并在视图创建时运行代码。
如果您打算让您的代码操作布局,则只需实现一个OnGlobalLayoutListener并将其添加到您的布局中,在您的视图构造函数中。

1

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");

}


1

请参阅开发人员文档中的自定义组件,特别是复合控件部分。

一旦您创建了Java文件,为了在XML中引用它,您必须使用完全限定的包名,例如:

<com.yourpackage.YourCustomView
android:layout_height="wrap_content"
android:layout_width="wrap_content" />

1

创建自定义视图通常旨在创建尚不存在的小部件。您要做的是在多个位置重复相同的布局。

根据您的上下文,有几种选项可供选择。

  1. 如果要将布局放置在列表中,请在单独的文件中创建布局,并在ListAdapter中使用它。请参阅ListView教程

  2. 如果此布局是要嵌入多个活动的通用布局,请尝试使用Fragment。片段是活动的子部分,具有自己的视图。或者,您可以使用标签将布局嵌入到多个xml中。

  3. 如果您真的想要一个自定义类和单个小部件,则需要扩展View类。扩展布局意味着您希望以不同的方式组织子小部件(例如,将它们组织成圆形)。扩展视图,您可以始终以相同的方式组织所需的内容(按钮、图像、文本)。但我不会对您撒谎,这将意味着很多工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接