从设计库中读取SnackBar的源代码时,我发现了这个sort of XML layout:
<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/>
标记的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" />
...
非常感谢
答案 0 :(得分: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"
在第二个中,它直接声明使用自定义类。
仅当自定义视图未定义为内部类时,才能使用第二种格式
<强> From Android Documentation 强>
我们现在拥有自定义组件,但我们如何使用它?在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视图的参数相同。请注意,也可以添加自己的参数,我们将在下面再次讨论。
这就是它的全部内容。不可否认,这是一个简单的案例,但重点是 - 创建自定义组件只是你需要的那样复杂。
更复杂的组件可能会覆盖更多on ...方法并引入一些自己的辅助方法,从根本上定制其属性和行为。唯一的限制是你的想象力以及你需要组件做什么。