2016-02-12 29 views
9

当从设计图书馆看书小吃吧的源代码,我发现这个sort of XML layout什么是布局<view/> 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" /> 

我从来没有见过这种XML只用<view/>标签(与较低的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" /> 

非常感谢你

+1

这是否足以让您理解:http://developer.android.com/guide/topics/ui/custom-components.html#modifying –

回答

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视图的参数相同。请注意,也可以添加您自己的参数,我们将在下面再次介绍这一点。

这就是它的全部。无可否认,这是一个简单的例子,但这就是要点 - 创建自定义组件只是像你需要的那样复杂。

一个更复杂的组件可能会重写更多...方法,并引入一些自己的帮助方法,大幅度定制其属性和行为。唯一的限制是你的想象力和你需要的组件。

+0

因此,这两种表示法之间严格没有技术上的区别? – pdegand59

+0

哦,是的,有区别。更新我的答案。 – Rohit5k2

+1

哦谢谢你的文档参考。有趣的部分是:使用内部类创建自定义视图。使用AS的XML编辑拖放界面,尝试添加新的自定义视图。 AS将使用第二种方法将其添加到XML中,这在技术上不起作用。 ^^ – pdegand59