日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Xml转换成view的原理

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

在開發過程中,我們通常都有在用View.inflate(context, resource, root)方法來創建視圖,這個方法非常方便,但是它有個缺點就是沒有加載xml 里面設置的布局參數。舉個例子創建一個叫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 控件并給它設置一個適配器

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 控件的高度應該為100dp。但是我們在適配器方法getview 中使用mInflater.inflate(R.layout.item, null)方法后(見【文件1-2】54 行),運行的效果如圖1-1(a)所示,它的高
度為包裹內容,這說明它沒有使用到xml 中設置的屬性高度。

ListViewDemo 運行效果

如果使用mInflater.inflate(R.layout.item, parent, false),運行效果如圖1-1(b)所示,它的高度為100dp,
這樣xml 里設置的高度就生效了,這才是inflate 方法的正確用法。
那我們來看看它為什么可以正確顯示xml 布局中的數據。我按住ctrl+左鍵進入mInflater.inflate
(R.layout.item, parent, false) 方法的源碼,方法中通過第一個參數布局資源id 獲取到一個XmlResourceParser
對象,接著調用inflate(parser, root, attachToRoot)方法(見【文件1-4】3~5 行)。在該方法中首先通過final
AttributeSet attrs = Xml.asAttributeSet(parser) 這段代碼拿到xml 中的屬性值; 再通過temp =
createViewFromTag(root, name, attrs) 這段代碼得到根據屬性值attrs 對象創建出來的view 。
createViewFromTag(root, name, attrs)方法中通過調用createView 方法使用反射的方式創建出控件對象;在
inflate(parser, root, attachToRoot)方法中還有一步重要的操作:temp.setLayoutParams(params),這里temp 的
是上面createViewFromTag 方法根據xml 創建出來的view,給它設置了xml 里設置的布局參數,這樣xml
里設置的高度就生效了。(這里源碼過多就不貼出來了)
源碼執行順序: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 方法的執行順序。其中createViewFromTag(root, name, attrs)
方法中通過view = createView(name, null, attrs)方法使用反射來創建xml 中的控件,這樣一個xml 轉換為
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();}} 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。