<view/> XML标签在布局中是什么?

10

在阅读设计库中SnackBar的源代码时,我发现了这种XML布局

<view xmlns:android="http://schemas.android.com/apk/res/android"
      class="android.support.design.widget.Snackbar$SnackbarLayout"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_gravity="bottom"
      style="@style/Widget.Design.Snackbar" />

我从未见过只有一个<view/>标签(小写V,所以不是View类)的这种XML。

我的第一个猜测是它的工作原理类似于<fragment/>标签,根据class属性创建自定义视图,但为什么要使用这种符号表示法,而不直接编写:

<android.support.design.widget.Snackbar.SnackbarLayout 
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_gravity="bottom"
      style="@style/Widget.Design.Snackbar" />

非常感谢


1
这个对你理解有足够的帮助吗:http://developer.android.com/guide/topics/ui/custom-components.html#modifying - Chintan Soni
1个回答

8

实际上它们是相同的。在第一个xml中,它表示这将是一个类型为android.support.design.widget.Snackbar$SnackbarLayout的视图(在class属性中定义)。

  <view xmlns:android="http://schemas.android.com/apk/res/android"
  class="android.support.design.widget.Snackbar$SnackbarLayout"

第二种方式是直接使用自定义类进行声明。

只有当自定义视图未被定义为内部类时,才能使用第二种格式。

来自 Android 文档

我们现在已经拥有了自己的自定义组件,但如何使用它呢?在 NotePad 示例中,自定义组件直接从声明性布局中使用,请查看位于 res/layout 文件夹中的 note_editor.xml。

<view
  class="com.android.notepad.NoteEditor$MyEditText" 
  id="@+id/note"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@android:drawable/empty"
  android:padding="10dip"
  android:scrollbars="vertical"
  android:fadingEdge="vertical" />

自定义组件是在XML中创建为通用视图,并使用完整包指定类。请注意,我们定义的内部类使用NoteEditor $ MyEditText表示法进行引用,这是Java编程语言中引用内部类的标准方式。

如果您的自定义View组件未定义为内部类,则可以选择使用XML元素名称声明View组件,并排除class属性。例如:

    <com.android.notepad.MyEditText
      id="@+id/note"
      ... />

注意,MyEditText类现在是一个单独的类文件。当该类嵌套在NoteEditor类中时,此技术将不起作用。
定义中的其他属性和参数是传递到自定义组件构造函数中的参数,然后通过EditText构造函数传递,因此它们是您用于EditText视图的相同参数。请注意,还可以添加自己的参数,我们将在下面再次讨论这一点。
就是这样。诚然,这是一个简单的例子,但这正是关键-创建自定义组件只有您需要的那么复杂。
更复杂的组件可能会覆盖更多的方法,并引入一些自己的辅助方法,从而大大定制其属性和行为。唯一的限制是您的想象力以及您需要组件执行的操作。

那么这两种表示法在技术上严格来说没有任何区别吗? - pdegand59
哦,是的,有所不同。我正在更新我的答案。 - Rohit5k2
1
哦,感谢提供文档参考。有趣的部分是:使用内部类创建自定义视图。使用AS的XML编辑拖放界面,尝试添加您的新自定义视图。AS将使用第二种技术上不起作用的方法将其添加到XML中。^^ - pdegand59
是的,我希望将来能够解决这个问题,但我喜欢手动输入代码而不是拖放。这是个人选择。 :D - Rohit5k2

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