構建靈活的介面

2021-07-04 20:47:21 字數 3474 閱讀 9194

在設計支援各種螢幕尺寸的應用時,你可以在不同的布局配置中重複使用 fragment ,以便根據相應的螢幕空間提供更出色的使用者體驗。

例如,一次只顯示乙個 fragment 可能就很適合手機這種單窗格介面,但在平板電腦上,你可能需要設定並列的 fragment,因為平板電腦的螢幕尺寸較寬闊,可向使用者顯示更多資訊。

圖 1: 兩個 fragment,顯示在不同尺寸螢幕上同一 activity 的不同配置中。在較寬闊的螢幕上,兩個 fragment 可並列顯示;在手機上,一次只能顯示乙個 fragment,因此必須在使用者導航時更換 fragment。

利用 fragmentmanager 類提供的方法,你可以在執行時新增、移除和替換 activity 中的 fragment,以便為使用者提供一種動態體驗。

你可以在 activity 執行時向其新增 fragment,而不用像上一課中介紹的那樣,使用 < fragment > 元素在布局檔案中為 activity 定義 fragment。如果你打算在 activity 執行週期內更改 fragment,就必須這樣做。

要執行新增或移除 fragment 等事務,你必須使用 fragmentmanager 建立乙個 fragmenttransaction,後者可提供用於執行新增、移除、替換以及其他 fragment 事務的 api。

如果 activity 中的 fragment 可以移除和替換,你應在呼叫 activity 的 oncreate() 方法期間為 activity 新增初始 fragment(s)。

在處理 fragment(特別是在執行時新增的 fragment )時,請謹記以下重要規則:必須在布局中為 fragment 提供 view 容器,以便儲存 fragment 的布局。

下面是上一課所示布局的替代布局,這種布局一次只會顯示乙個 fragment。要用乙個 fragment 替換另乙個 fragment, activity 的布局中需要包含乙個作為 fragment 容器的空 framelayout。

請注意,該檔名與上一課中布局檔案的名稱相同,但布局目錄沒有 large 這一限定符。因此,此布局會在裝置螢幕小於「large」的情況下使用,原因是尺寸較小的螢幕不適合同時顯示兩個 fragment。

res/layout/news_articles.xml:

xmlns:android=""

android:id="@+id/fragment_container"

android:layout_width="match_parent"

android:layout_height="match_parent" />

在 activity 內部,使用 support library api 呼叫 getsupportfragmentmanager() 以獲取 fragmentmanager,然後呼叫 begintransaction() 建立 fragmenttransaction,同時呼叫 add() 新增 fragment。

你可以使用同乙個 fragmenttransaction 對 activity 執行多 fragment 事務。當你準備好進行更改時,必須呼叫 commit()。

例如,下面介紹了如何為上述布局新增 fragment :

import android.os.bundle;

public

class

mainactivity

extends

fragmentactivity

// 建立乙個要放入 activity 布局中的新 fragment

headlinesfragment firstfragment = new headlinesfragment();

// 如果此 activity 是通過 intent 發出的特殊指令來啟動的,

// 請將該 intent 的 extras 以引數形式傳遞給該 fragment

firstfragment.setarguments(getintent().getextras());

// 將該 fragment 新增到「fragment_container」framelayout 中

getsupportfragmentmanager().begintransaction()

.add(r.id.fragment_container, firstfragment).commit();}}

}

由於該 fragment 已在執行時新增到 framelayout 容器中,而不是在 activity 布局中通過 < fragment > 元素進行定義,因此該 activity 可以移除和替換這個 fragment 。

替換 fragment 的步驟與新增 fragment 的步驟相似,但需要呼叫 replace() 方法,而非 add()。

請注意,當你執行替換或移除 fragment 等 fragment 事務時,最好能讓使用者向後導航和「撤消」所做更改。要通過 fragment 事務允許使用者向後導航,你必須呼叫 addtobackstack(),然後再執行 fragmenttransaction。

注意:當你移除或替換 fragment 並向返回堆疊新增事務時,已移除的 fragment 會停止(而不是銷毀)。如果使用者向後導航,還原該 fragment,它會重新啟動。如果你沒有向返回堆疊新增事務,那麼該 fragment 在移除或替換時就會被銷毀。

替換 fragment 的示例:

// 建立 fragment 並為其新增乙個引數,用來指定應顯示的文章

articlefragment newfragment = new articlefragment();

bundle args = new bundle();

args.putint(articlefragment.arg_position, position);

newfragment.setarguments(args);

fragmenttransaction transaction = getsupportfragmentmanager().begintransaction();

// 將 fragment_container view 中的內容替換為此 fragment ,

// 然後將該事務新增到返回堆疊,以便使用者可以向後導航

transaction.replace(r.id

.fragment_container, newfragment);

transaction.addtobackstack(null);

// 執行事務

transaction.commit();

addtobackstack() 方法可接受可選的字串引數,來為事務指定獨一無二的名稱。除非你打算使用 fragmentmanager.backstackentry api 執行高階 fragment 操作,否則無需使用此名稱。

建立靈活的使用者介面

這一節的主要內容 1 在執行時新增乙個fragment到activity 2 替換fragment 為了適應不同大小的螢幕,我們可以根據螢幕的大小動態地在不同的布局檔案中重用fragment。比如,對於在手機上,我們可能就只能顯示乙個fragment,而在平板電腦上我們就可以並列地在介面上顯示兩個f...

建立靈活的使用者介面

這一節的主要內容 1 在執行時新增乙個fragment到activity 2 替換fragment 為了適應不同大小的螢幕,我們可以根據螢幕的大小動態地在不同的布局檔案中重用fragment。比如,對於在手機上,我們可能就只能顯示乙個fragment,而在平板電腦上我們就可以並列地在介面上顯示兩個f...

靈活構建和拼接Laravel的SQL語句

在實際應用中,我們可能會遇到很多查詢條件互相制約的情況,例如,搜尋某某學校,某某班裡姓李的同學。我們例如學校的變數叫做 school,班級叫做 class,學生姓名叫做 name,那麼,我們的拼接語句這樣寫 php view plain copy print?str school str class...