LayoutInflater原理分析

LayoutInflater主要是用於加載佈局的,包括Activity中調用setContentView()內部也是通過LayoutInflater方法實現的。獲取LayoutInflater常用的基本方法:

LayoutInflater layoutInflater = LayoutInflater.from(context);
LayoutInflater layoutInflater = getLayoutInflater()
LayoutInflater layoutInflater = (LayoutInflater) context
		.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

接下來就可以使用layoutInflater.inflate佈局了

View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot)

1.如果root爲空,那麼attachToRoot將無效
2.如果root不爲空,attachToRoot爲true,那麼view將自動作爲子view添加到root佈局內。
3.如果root不爲空,attachToRoot爲false,那麼view將應用佈局文件中最外層的所有layout屬性,說白了就是使最外層的layout_width,layout_height等layout屬性生效。
總結一句話:
root爲空,最外層的所有layout屬性無效,
root不爲空,最外層的所有layout屬性生效,

下面以一個Button進行說明,最外層設置layout_width,layout_height兩個屬性。

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:text="test"
    android:layout_width="match_parent"
    android:layout_height="200dp">
</Button>
  • root爲空,attachToRoot 爲true或者false效果,最外層layout屬性無效
//View view = getLayoutInflater().inflate(R.layout.button_layout,null,false);
View view = getLayoutInflater().inflate(R.layout.button_layout,null,true);
mTopLayout.addView(view);

在這裏插入圖片描述

  • root不爲空,attachToRoot 爲true效果
//因爲這裏attachToRoot 爲true,所以不能再重複addview了
View view = getLayoutInflater().inflate(R.layout.button_layout,mTopLayout,true);

在這裏插入圖片描述

  • root不爲空,attachToRoot 爲false效果
View view = getLayoutInflater().inflate(R.layout.button_layout,mTopLayout,false);
mTopLayout.addView(view);

在這裏插入圖片描述

結論:View必須存在一個佈局中,layout屬性纔會生效,否則無效。

看到這裏,也許有些朋友心中會有一個巨大的疑惑。不對呀!平時在Activity中指定佈局文件的時候,最外層的那個佈局是可以指定大小的呀,layout_width和layout_height都是有作用的。確實,這主要是因爲,在setContentView()方法中,Android會自動在佈局文件的最外層再嵌套一個FrameLayout,所以layout_width和layout_height屬性纔會有效果。那麼我們來證實一下吧

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_owner_draw);

        mTopLayout = findViewById(R.id.layout_top);
        ViewParent parent = mTopLayout.getParent();
        Log.i(TAG, "onCreate: "+parent);

    }

在這裏插入圖片描述
其實任何一個Activity中顯示的界面其實主要都由兩部分組成,標題欄和內容佈局。標題欄就是在很多界面頂部顯示的那部分內容。而內容佈局就是一個FrameLayout,這個佈局的id叫作content,我們調用setContentView()方法時所傳入的佈局其實就是放到這個FrameLayout中的,這也是爲什麼這個方法名叫作setContentView(),而不是叫setView()。
在這裏插入圖片描述

Android LayoutInflater原理分析,帶你一步步深入瞭解View(一)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章