我在這裏看到有兩個單獨的問題; (1)什麼是<fragment>
元素? (2)我是否(意思是你)通過使用FrameLayout
以儘可能最好的方式做我在上一個問題中試圖做的事情?
我會盡力回答兩者。
<fragment>
XML標籤是實現片段的另一種方式。作爲進修人員,Fragment
就像是一項活動的一部分。這是一個獨立的課程,但是,回到fragment documentation,因爲Fragment
旨在模塊化,所有片段必須安置在一個單獨的FragmentActivity
內。把它看作是一個容器FragmentActivity
。通過將Fragment
加載到FragmentActivity
中,FragmentActivity
提供了Fragment
類自己無法訪問的其他有價值的功能。它還爲您提供動態換取片段的機會,從而提供更靈活的用戶體驗。
如何將Fragment
載入其包含的FragmentActivity
取決於您試圖創建的內容。一種方法是使用<fragment>
標籤。通過這種方法,不像在先前的問題中那樣在活動java代碼中聲明Fragment
,然後使用FragmentTransaction
加載它,則Fragment
類將通過包含FragmentActivity
的XML佈局加載。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment
android:name="com.example.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
您可以在android docs中找到的示例中看到這裏聲明的片段。當setContentView()
被調用onCreate
時,片段被FragmentActivty
加載。
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
}
}
顯示片段的另一種方式與您在前面的示例中所做的一樣。使用FragmentManager
,您可以創建Fragment
類的新實例,並在java代碼中以編程方式加載它。
那麼哪種技術在什麼時候有意義呢?作爲android docs演示的例子,當您使用固定片段時,XML片段方法很有意義,即您不會動態交換片段。這是因爲您不能像編寫Java代碼一樣編輯您在動態創建的XML佈局。另外,從我所知道的情況來看,使用XML方法將片段更像是佈局元素,以適應不同的控制。在android示例中,他們使用XML方法在平板電腦上並排顯示2個fragmens。通過更像佈局元素來控制片段,例如有能力調整layout_weight
您可以達到更好的結果。
但是,如果你在設計一個高度動態的UX,說有ViewPager
或其他一些特徵,其中片段將被定期輪換,更有意義使用單獨Fragment
類和替換那些Fragments
,因爲他們成爲必要。
根據你以前的問題和需要動態地交換片段,我認爲你爲該實現做出了正確的選擇。
'FrameLayout'與片段無關,它只有一個孩子的viewgroup。你看到的例子可能使用了一個'FrameLayout'作爲一個片段的容器,後面可能會被另一個替換掉。 – tbruyelle