標籤:
假設你不關心其內部實現,僅僅看怎樣使用的話,直接看這篇就可以。
接上篇,接下來,就用最最簡單的範例來說明一下:
用兩個布局檔案main 和 test:
當中,main.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="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="hello world" /></LinearLayout>
test.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="200dp" android:background="#ffffff00" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="test" /></LinearLayout>
在test中設定了其高度為200dp,而且設定了背景顏色。
接下來看一下LayoutInflater().inflate方法實現:
第一種方式:inflate(view, null)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = (LinearLayout) getLayoutInflater().inflate(R.layout.main, null); view = getLayoutInflater().inflate(R.layout.test, null); setContentView(view); }
執行的效果例如以下:
這個就非常easy理解了。由於我沒有指定ViewGroup root參數,所以。相當於直接載入了test視圖檔案。並返回。
而它的高度充滿了全屏而不是200dp。由於執行inflate的時候,沒有root參數,則無法為test視圖設定layoutparam參數。那麼為什麼會充滿螢幕而不是沒有顯示呢?是由於我們將其設定視圖到activity時,會取得當前window的layoutparam賦值給它,也就是充滿全屏。
有興趣的話,你能夠改一下test的layout_width設定一個數值,最後執行效果是一樣的。
另外一種方式:inflate(view, root, false)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = (LinearLayout) getLayoutInflater().inflate(R.layout.main, null); view = getLayoutInflater().inflate(R.layout.test, (ViewGroup) view, false); setContentView(view); }
這裡調用inflate的時候。強轉了view為viewgroup,由於其本身就是linearlayout,所以這裡能夠強轉。
執行的效果例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHl6X2ZseQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" height="300" width="180">
單看效果而言,跟上面的一樣。
但從代碼本身而言,實現的內容就不一樣了。
因為有了viewgroup,這裡得到的視圖事實上已經有了layoutparam。你能夠自行列印Log看看。
但為什麼最後的結果卻是和上面的一樣呢。原因還是因為設定視圖到activity時,會取得當前window的layoutparam賦值給它,也就是充滿全屏。
第三種方式:inflate(view, root, true)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = (LinearLayout) getLayoutInflater().inflate(R.layout.main, null); view = getLayoutInflater().inflate(R.layout.test, (ViewGroup) view, true); setContentView(view); }執行的效果例如以下:
這個效果就非常明顯了,因為main是線性布局,所以,test視圖被加入到了textview(hello world)以下,而且保留了其自己的layoutparam參數。
範例非常easy,就不附上代碼project。
假設對inflate方法怎樣實現的,感興趣的話,能夠參考上一篇文章:
Android編程之LayoutInflater的inflate方法具體解釋
補充:新的API會在inflater.inflate(R.layout.xxx, null);提示錯誤:
請詳見看後面的轉載的文章解釋:
Layout inflation is the term used within the context of Android to indicate when an XML layout resource is parsed and converted into a hierarchy of View objects.
Android編程之LayoutInflater的inflate方法執行個體