什么是布局中的<view /> XML标记

pde*_*d59 10 xml android android-layout

从设计库中读取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" />
Run Code Online (Sandbox Code Playgroud)

我从来没有看到过只有一个<view/>标签的这种XML (V值较低,所以不是View类).

我的第一个猜测是它像<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" />
Run Code Online (Sandbox Code Playgroud)

??

非常感谢你

Roh*_*5k2 7

实际上两者都是一样的.在第一个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"
Run Code Online (Sandbox Code Playgroud)

在第二个中,它直接声明使用自定义类.

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

来自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" />
Run Code Online (Sandbox Code Playgroud)

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

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

    <com.android.notepad.MyEditText
      id="@+id/note"
      ... />
Run Code Online (Sandbox Code Playgroud)

请注意,MyEditText类现在是一个单独的类文件.当类嵌套在NoteEditor类中时,此技术将不起作用.

定义中的其他属性和参数是传递给自定义组件构造函数的属性和参数,然后传递给EditText构造函数,因此它们与用于EditText视图的参数相同.请注意,也可以添加自己的参数,我们将在下面再次讨论.

这就是它的全部内容.不可否认,这是一个简单的案例,但重点在于 - 创建自定义组件只会像您需要的那样复杂.

更复杂的组件可能会覆盖更多on ...方法并引入一些自己的辅助方法,从根本上定制其属性和行为.唯一的限制是你的想象力以及你需要组件做什么.