Android編程之LayoutInflater的inflate方法執行個體

來源:互聯網
上載者:User

標籤:

假設你不關心其內部實現,僅僅看怎樣使用的話,直接看這篇就可以。


接上篇,接下來,就用最最簡單的範例來說明一下:

用兩個布局檔案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方法執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.