2016-12-04 25 views
2

我想加載用戶創建的XML文件,以在我的應用中使用它。我知道無法將XML文件用作資源,因爲佈局文件是在構建APK進程中編譯的。無論如何要在佈局文件夾外部使用/創建/加載佈局?用戶創建的加載佈局

+0

據我所知,沒有辦法做到這一點在一般情況下 – Vyacheslav

回答

3

您不能膨脹任意XML,因爲Android項目中的XML文件在構建時得到處理並轉換爲二進制格式。換句話說,您只能通過Java API以編程方式構建佈局。

你可以做的是分析用戶的文件與標準的XML解析器(如XmlPullParser和建立你自己。基本上你會被重新實現LayoutInflater,你可以找到網上的源代碼的意見。

需要注意的一點是,用戶的XML根本無法引用資源,例如他們無法完成像android:textColor="@color/some_color"這樣的操作。構建過程會將這些引用轉換爲資源值的指針,而如果您只是簡單地用普通的XML讀取它,它只是文本"@color/some_color"

也許不是允許用戶可以創建完整的Android佈局XML,您應該選擇一些您將支持的有限的子集,並定義一種更簡單的方式來描述這些自定義佈局。那麼你不必使用XML,你可以用你想要的東西來定義一個自定義的「語言」。這樣您可以將用戶限制在相對簡單的API中,如文本顏色;您只需將您自定義語言中定義的某個字段映射到textView.setTextColor()即可。

3

您可以從您的文件創建一個XmlPullParser並將其傳遞給佈局壓縮程序。

若要從您的文件中XMLPullParser你可以按照這個例子:https://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

而且具有XMLPullParser對象之後,就可以調用這個方法:https://developer.android.com/reference/android/view/LayoutInflater.html#inflate(org.xmlpull.v1.XmlPullParser,android.view.ViewGroup)

你需要一個ViewGroup將成爲視圖的父級。如果您需要該視圖爲活動,我建議您使用佈局創建一個空的活動,並將分析的佈局添加到空白布局。不要試圖在沒有父母的情況下膨脹佈局,你可以在不同的設備中獲得不同的結果。

+1

這是一個通知佈局實際上,所以沒有父母:/ – greywolf82

+1

@ greywolf82我看到,現在NotificationBuilder期待RemoteViews。我認爲你可以從一個空白的佈局文件(只使用視圖組)創建一個RemoteViews,並且在使用addView(View)方法從LayoutInflater中添加充氣視圖之後。您可以使用RemoteView作爲父項。 – jonathanrz

+2

在文檔中有:重要由於性能原因,查看通貨膨脹嚴重依賴於在構建時完成的XML文件的預處理。因此,在運行時,通過普通的XML文件使用LayoutInflater和XmlPullParser是不可能的。 – greywolf82