很多時候我們需要把一個xml布局文件轉成view對象,通過以下代碼實現(xiàn):
inflater.inflate(int resource, ViewGroup root, boolean attachToRoot);
其中inflater對象可以通過以下幾種方式獲取:
LayoutInflater inflater=LayoutInflater.from(Context context);LayoutInflater inflater=getLayoutInflater();LayoutInflater inflater=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
inflate方法有幾個重載 比如我們可以寫成 inflater.inflate(int resource, null);當我們傳入null時,跟布局layout_xxx屬性無效,比如我要實現(xiàn)圖下這種效果,通過添加item間的分隔來測試
我們在item的xml中代碼為
看跟布局FramLayout中的 layout_margin="5dp" ,item間的分隔符是通過這個實現(xiàn)的,但是當我們解析xml文件的代碼寫成inflater.inflate(int resource, null);發(fā)現(xiàn)沒有分隔效果,如下圖
但是把layout_margin="5dp" 屬性寫在TextView中就有效果了,
通過查閱源碼發(fā)現(xiàn),當root也就是ViewGroup parent 這個參數(shù)不為空并且attachToRoot為false時 跟布局屬性才被設置進去,
當然你可以選擇把layout相關屬性寫在對應的子view中,但是如果子view太多就不便于代碼的書寫,這時候在跟布局中就比較好控制,
其實還有一種加載xml為view對象的寫法 View.inflate(Context context,int resource, ViewGroup root),原理都是一樣的,這種我們第三個參數(shù)一般為null,否則會報一個異常,這種跟上面差不多,當ViewGroup為null時,resource中的跟布局layout屬性就無效了,所以還是推薦上面的加載xml布局的寫法
新聞熱點
疑難解答