Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android fragment(片段)構建靈活的UI

Android fragment(片段)構建靈活的UI

編輯:關於Android編程

在以支持多種屏幕尺寸為目標設計應用時,您可以在不同的布局配置中重復使用您的fragment

從而根據可用的屏幕空間優化用戶體驗。

例如,在手機設備上,由於采用單窗格用戶界面,因此可能更適合一次只顯示一個fragment。 相反,由於平板電腦屏幕尺寸較大,可以為用戶顯示更多信息,因此最好將片段設計為並排顯示。

這裡寫圖片描述

圖 以不同配置在不同屏幕尺寸的設備上為同一 Activity 顯示的兩個片段。在較大的屏幕上,兩個片段同屏並排顯示,但在手機設備上,同屏僅顯示一個片段,因此用戶必須通過切換屏幕進行浏覽。

FragmentManager 類

提供的方法讓您可以在運行時為 Activity 添加、移除和替換片段,從而營造出動態的用戶體驗。

在運行時為 Activity 添加片段

除了在布局文件中為 Activity 定義片段(利用 元素進行定義)之外,您還可以在 Activity 運行時為 Activity 添加片段。如果您計劃在 Activity 的生命周期內更改片段,就需要采用這種方法。

如需執行添加或移除片段等事務,您必須使用 FragmentManager 創建 FragmentTransaction

後者將提供添加、移除、替換片段以及執行其他片段事務所需的 API。

如果您的 Activity 允許移除和替換片段,應在 Activity 的 onCreate() 方法執行期間為 Activity 添加初始片段。

在處理片段(尤其是在運行時添加片段的情況下)時,請謹記以下重要准則:您的 Activity 布局必須包含一個可以插入片段的容器 View。

以下是布局的替代布局,一次只顯示一個片段。若要替換片段,Activity 的布局包含一個用來充當片段容器的空 FrameLayout。

布局目錄沒有 large 限定符,因此該布局只能在設備屏幕尺寸小於 large 時使用,因為這種尺寸的屏幕無法同時容納兩個片段。

res/layout/news_articles.xml:

<framelayout android:id="@+id/fragment_container" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"></framelayout>

在您的 Activity 內,使用 Support Library API 調用 getSupportFragmentManager() 以獲取 FragmentManager。然後,調用 beginTransaction() 創建一個 FragmentTransaction,並調用 add() 添加一個片段。

您可以使用同一 FragmentTransaction 為 Activity 執行多片段事務。做好更改准備時,您必須調用 commit()。

例如,可以采用以下方法為之前的布局添加片段:

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);

        // Check that the activity is using the layout version with
        // the fragment_container FrameLayout
        if (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 layout
            HeadlinesFragment firstFragment = new HeadlinesFragment();

            // In case this activity was started with special instructions from an
            // Intent, pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());

            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

由於該片段已在運行時被添加到 FrameLayout 容器(而不是利用 元素在 Activity 布局中進行定義),所以,可以從該 Activity 中移除該片段,並將其替換為其他片段。

替換片段

替換片段的步驟與添加片段類似,只不過調用的方法從 add() 改為 replace()。

請謹記

當您執行替換或移除片段等片段事務時,通常最好讓用戶能夠回退並“撤消”更改。 要讓用戶回退所執行的片段事務,您必須先調用 addToBackStack(),然後再提交 FragmentTransaction。

注:當您移除或替換一個片段並向返回棧添加事務時,系統會停止(而非銷毀)移除的片段。 如果用戶執行回退操作進行片段恢復,該片段將重新啟動。 如果您不向返回棧添加事務,則系統會在您移除或替換片段時將其銷毀。

片段替換示例:

// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// 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
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved