android activity怎麼呼叫非activity類_Android開發Fragment2
技術標籤:android activity怎麼呼叫非activity類
構建靈活的介面
在設計支援各種螢幕尺寸的應用時,您可以在不同的佈局配置中重複使用 Fragment,以根據可用的螢幕空間優化使用者體驗。
例如,在手機上,一次只顯示一個 Fragment 對於單窗格介面可能比較合適。相反,在平板電腦上,由於螢幕尺寸較大,因此您可能想要設定並排顯示的 Fragment,以向用戶顯示更多資訊。
圖 1.同一 Activity 的兩個 Fragment,採用不同的配置顯示在不同螢幕尺寸的裝置上。在較大的螢幕上,兩個 Fragment 同屏並排顯示,但在手機上,一次僅顯示一個 Fragment,因此使用者必須通過切換螢幕瀏覽這兩個 Fragment。
利用FragmentManager
類提供的方法,您可以在執行時為 Activity 新增、移除和替換 Fragment,從而營造出動態的使用者體驗。
如需詳細瞭解如何實現 Fragment,請參閱以下資源。
Fragment
支援平板電腦和手機
示例應用
在執行時為 Activity 新增 Fragment
您可以在 Activity 執行時為其新增 Fragment,而不用像上一課中介紹的那樣,使用元素在佈局檔案中為 Activity 定義 Fragment。如果您打算在 Activity 的生命週期內更改 Fragment,就需要採用這種方法。
要執行新增或移除 Fragment 等事務,您必須使用FragmentManager
FragmentTransaction
,後者將提供新增、移除、替換 Fragment 以及執行其他 Fragment 事務所需的 API。
如果您的 Activity 允許移除和替換 Fragment,應在 Activity 的onCreate()
方法執行期間為其新增初始 Fragment。
在處理 Fragment 時(尤其是在執行時新增 Fragment 時),需遵循的一個重要原則是,您的 Activity 佈局必須包含一個可以插入 Fragment 的容器View
。
下面是上一課所示佈局的替代佈局,該佈局一次只顯示一個 Fragment。為了能夠將一個 Fragment 替換為另一個 Fragment,Activity 的佈局包含一個充當 Fragment 容器的空FrameLayout
請注意,雖然檔名與上一課中的佈局檔案相同,但佈局目錄沒有large
限定符,因此該佈局會在裝置螢幕尺寸小於“large”時使用,因為這種尺寸的螢幕無法同時容納兩個 Fragment。
res/layout/news_articles.xml:
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" />
在您的 Activity 內,使用支援庫 API 呼叫getSupportFragmentManager()
以獲取FragmentManager
。然後,呼叫beginTransaction()
以建立FragmentTransaction
,並呼叫add()
以新增 Fragment。
您可以使用同一FragmentTransaction
為 Activity 執行多項 Fragment 事務。當您準備好進行更改時,必須呼叫commit()
。
例如,下面展示瞭如何為先前的佈局新增 Fragment:
KOTLIN
import android.os.Bundleimport android.support.v4.app.FragmentActivityclass MainActivity : FragmentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)
setContentView(R.layout.news_articles)// Check that the activity is using the layout version with// the fragment_container FrameLayoutif (findViewById(R.id.fragment_container) != null) {// However, if we're being restored from a previous state,// then we don't need to do anything and should return or else// we could end up with overlapping fragments.if (savedInstanceState != null) {return;}// Create a new Fragment to be placed in the activity layoutval firstFragment = HeadlinesFragment()// In case this activity was started with special instructions from an// Intent, pass the Intent's extras to the fragment as arguments
firstFragment.arguments = intent.extras// Add the fragment to the 'fragment_container' FrameLayout
supportFragmentManager.beginTransaction().add(R.id.fragment_container, firstFragment).commit()}}}
由於該 Fragment 是在執行時被新增到FrameLayout
容器的,而不是利用元素在 Activity 佈局中進行定義的,因此可以從 Activity 中移除該 Fragment,並將其替換為其他 Fragment。
替換 Fragment
替換 Fragment 的過程與新增 Fragment 類似,但需要呼叫replace()
方法,而非add()
。
請注意,當您執行替換或移除 Fragment 等 Fragment 事務時,通常最好讓使用者能夠回退並“撤消”更改。要讓使用者回退所執行的 Fragment 事務,您必須先呼叫addToBackStack()
,然後再提交FragmentTransaction
。
注意:當您移除或替換 Fragment 並向返回堆疊新增相應事務時,系統會停止(而非銷燬)移除的 Fragment。如果使用者執行回退操作進行 Fragment 恢復,該 Fragment 將重新啟動。如果您不向返回堆疊新增相應事務,則系統會在您移除或替換 Fragment 時將其銷燬。
替換 Fragment 的示例:
KOTLIN
// Create fragment and give it an argument specifying the article it should showval newFragment = ArticleFragment()Bundle args = Bundle()
args.putInt(ArticleFragment.ARG_POSITION, position)
newFragment.arguments = argsval transaction = supportFragmentManager.beginTransaction().apply {// Replace whatever is in the fragment_container view with this fragment,// and add the transaction to the back stack so the user can navigate back
replace(R.id.fragment_container, newFragment)
addToBackStack(null)}// Commit the transaction
transaction.commit();
addToBackStack()
方法採用一個可選的字串引數,該引數會為事務指定一個唯一的名稱。除非您打算使用FragmentManager.BackStackEntry
API 執行高階 Fragment 操作,否則不需要該名稱。