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

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

我想用布局声明一个xml,然后创建类:

MyComplexView extends RelativeLayout{...}

但我不知道应该覆盖什么来指示应该膨胀哪个布局。

我该怎么做?谢谢

【问题讨论】:

    标签: java android views


    【解决方案1】:

    类似这样的:

    1. 从超类添加构造函数。 (只有上下文的用于以编程方式创建视图,其他用于在 XML 中添加视图时。

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

    3. 在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_height="wrap_content"
        android:layout_width="wrap_content" />
        

        【讨论】:

          【解决方案5】:

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

          根据您的上下文,您有多种选择。

          1. 如果要将布局放在一个目录中,只需在一个单独的文件中创建您的布局,然后在 ListAdapter 中使用它。为此,请查看ListView Tutorial

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-04
            相关资源
            最近更新 更多