Android中ViewStub控件分析及使用

在分析Android6.0源碼時碰到如下一個佈局 [java] view plain copy 在CODE上查看代碼片派生到個人代碼片 <merge xmlns:android="http://schemas.android.com/apk/res/android">
<ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
<ViewStub android:id="@+id/empty" android:layout="@layout/no_transfers" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</merge>java

在佈局中用到了一個叫作ViewStub的view,不甚理解, 我一直認爲分析一個原生控件的最好辦法就是查看源碼以及demo演示,因此先看下ViewStub源碼中的說明 根據源碼能夠得到如下信息 1,ViewStub繼承自View 2,ViewStub默認是不可見(invisible)的,並且View的size爲zero,即大小爲0的view,用來在運行期間(runtime)加載佈局 3,當一個ViewStub被設置成可見visible或者調用inflate()方法時,ViewStub獲得填充,此時viewstub所引用的layout佈局會代替掉viewstub控件顯示出來,也就是說在調用setVisible(int)或者inflate()方法以前,UI中只有一個大小爲0的viewstub。這對於佈局的動態加載頗有幫助 以上三點主要是總結來講就是viewstub默認不可見,在對佈局進行加載時viewstub大小爲0不佔用任何的空間,當開發者在運行期間想讓其動態顯示時能夠調用inflate()方法或者setVisible(int)來動態的加載佈局,看到這裏不得不佩服源碼之強大,本身之不足。android

關於ViewStub的用法,源碼上已有介紹 [java] view plain copy 在CODE上查看代碼片派生到個人代碼片 <ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree" android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />佈局

其用法其實相似include,其中android:layout屬性用來引用所要動態加載的佈局,經過id能夠對ViewStub在代碼中進行引用 在代碼中經過id獲取到對ViewStub的引用,而後調用inflate方法,調用該方法後mySubTree佈局會代替ViewStub。ViewStub會被從它的parent中移除.經過inflateID:subTree能夠在代碼中引用到mySubTree [java] view plain copy 在CODE上查看代碼片派生到個人代碼片 ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();xml

相關文章
相關標籤/搜索