日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Xml转换成view的原理

發(fā)布時間:2025/4/16 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Xml转换成view的原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在開發(fā)過程中,我們通常都有在用View.inflate(context, resource, root)方法來創(chuàng)建視圖,這個方法非常方便,但是它有個缺點就是沒有加載xml 里面設(shè)置的布局參數(shù)。舉個例子創(chuàng)建一個叫ListViewDemo 的工程。它里面主界面布局里面就放置一個listview

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><ListView android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>

在activity 中就是獲取到listview 控件并給它設(shè)置一個適配器

MainActivity .java

package com.itheima.listviewdemo;import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.view.LayoutInflater;import android.view.Menu;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView listview = (ListView) findViewById(R.id.listview);listview.setAdapter(new MyAdapater(this));}private class MyAdapater extends BaseAdapter {private LayoutInflater mInflater;public MyAdapater(Context mcontext) {mInflater = (LayoutInflater) mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 10;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = mInflater.inflate(R.layout.item, parent, false);// View view = mInflater.inflate(R.layout.item, null);return view;}}}

listview 的item 布局為item.xml,它是一個寬度為match_parent,高度為100dp 的線性
布局,線性布局包含了一個寬度為match_parent、高度為match_parent 的TextView。
【文件1-3】item.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="100dp" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f00" android:text="黑馬程序員"/></LinearLayout>

從布局上來看,listview 的條目textview 控件的高度應(yīng)該為100dp。但是我們在適配器方法getview 中使用mInflater.inflate(R.layout.item, null)方法后(見【文件1-2】54 行),運行的效果如圖1-1(a)所示,它的高
度為包裹內(nèi)容,這說明它沒有使用到xml 中設(shè)置的屬性高度。

ListViewDemo 運行效果

如果使用mInflater.inflate(R.layout.item, parent, false),運行效果如圖1-1(b)所示,它的高度為100dp,
這樣xml 里設(shè)置的高度就生效了,這才是inflate 方法的正確用法。
那我們來看看它為什么可以正確顯示xml 布局中的數(shù)據(jù)。我按住ctrl+左鍵進入mInflater.inflate
(R.layout.item, parent, false) 方法的源碼,方法中通過第一個參數(shù)布局資源id 獲取到一個XmlResourceParser
對象,接著調(diào)用inflate(parser, root, attachToRoot)方法(見【文件1-4】3~5 行)。在該方法中首先通過final
AttributeSet attrs = Xml.asAttributeSet(parser) 這段代碼拿到xml 中的屬性值; 再通過temp =
createViewFromTag(root, name, attrs) 這段代碼得到根據(jù)屬性值attrs 對象創(chuàng)建出來的view 。
createViewFromTag(root, name, attrs)方法中通過調(diào)用createView 方法使用反射的方式創(chuàng)建出控件對象;在
inflate(parser, root, attachToRoot)方法中還有一步重要的操作:temp.setLayoutParams(params),這里temp 的
是上面createViewFromTag 方法根據(jù)xml 創(chuàng)建出來的view,給它設(shè)置了xml 里設(shè)置的布局參數(shù),這樣xml
里設(shè)置的高度就生效了。(這里源碼過多就不貼出來了)
源碼執(zhí)行順序:inflate(R.layout.item, parent,false)→XmlResourceParser →inflate(parser, root,
attachToRoot)→AttributeSet attrs = Xml.asAttributeSet(parser)→temp = createViewFromTag(root, name, attrs)→
→temp.setLayoutParams(params),這是inflate 方法的執(zhí)行順序。其中createViewFromTag(root, name, attrs)
方法中通過view = createView(name, null, attrs)方法使用反射來創(chuàng)建xml 中的控件,這樣一個xml 轉(zhuǎn)換為
view 的步驟原理就介紹完了。
【文件1-4】Inflate 源碼

public View inflate(int resource, ViewGroup root, boolean attachToRoot) {if (DEBUG) System.out.println("INFLATING from resource: " + resource);XmlResourceParser parser = getContext().getResources().getLayout(resource);try {return inflate(parser, root, attachToRoot);} finally {parser.close();}} 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Xml转换成view的原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。