2016-02-12 38 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