說說如何使用 Android 的碎片(Fragment)

開發(fā)環(huán)境:Android 2.x

1 創(chuàng)建平板模擬器

在項目中點擊 “shift + F9”,這時會彈出模擬器選擇框,點擊 Create New Virtual Device:

模擬器選擇框

選擇 Tablet澈吨,盡量選大屏的模擬器喲身冀,因為這樣看的清楚:


選擇平板

一路 next放椰,最后點擊運行我們剛創(chuàng)建的平板模擬器:

平板模擬器

2 基本用法

我們在一個活動當(dāng)中添加兩個碎片匈辱,并讓這兩個碎片平分這個活動空間。

首先新建一個左側(cè)碎片布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="按鈕"></Button>
</LinearLayout>

這個布局非常簡單球涛,只放置了一個按鈕劣针,并讓它水平居中顯示。接著新建右側(cè)碎片布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00a000"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="我是右邊的碎片"
        android:textSize="25sp"
        android:textColor="#ffffff"
        />

</LinearLayout>

這個布局把背景色設(shè)置為深綠色亿扁,并放置了一個 TextView 用于顯示一段文本捺典。

接著新建一個繼承自 Fragment 的類。注意从祝,這里會有兩個不同包下的 Fragment 類供選擇襟己,一個是系統(tǒng)內(nèi)置的 android.app.Fragment引谜,一個是 support-v4 庫中的 android.support.v4.app.Fragment。強烈建議使用 support-v4 庫中的 Fragment擎浴,因為它可以讓碎片在所有 Android 系統(tǒng)版本中保持功能一致喲员咽!因為 appcomcat-v7 庫會把 support-v4 庫一起引入進來,所以我們不必在 gradle 中引入這個庫贮预。

LeftFragment :

public class LeftFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.left_fragment, container, false);
    }
}

這里僅僅是重寫了 Fragment 的 onCreateView() 方法贝室,然后在這個方法中通過 LayoutInflater 的 inflate()方法將剛剛定義的 fragment_left 布局動態(tài)加載進來而已。接著我們用同樣的方法創(chuàng)建來 RightFragment 類:

public class RightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.right_fragment, container, false);
    }
}

修改主活動類的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <fragment
        android:id="@+id/left_fragment"
        android:name="net.deniro.android.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />


    <fragment
        android:id="@+id/right_fragment"
        android:name="net.deniro.android.fragmenttest.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />
</LinearLayout>

這里使用了 <fragment> 標(biāo)簽用于在布局中添加碎片萌狂,通過 android:name 屬性來顯式指明要添加的碎片類名档玻,注意一 定要是類的全名哦O(∩_∩)O~

碎片示例

2 動態(tài)添加碎片

碎片真正的強大之處在于怀泊,它可以在程序運行時動態(tài)地被添加到活動當(dāng)中茫藏。根據(jù)具體情況來動態(tài)地添加碎片,就可以實現(xiàn)程序界面的定制功能霹琼。

我們新建一個布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#ffff00"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="我是另一個右碎片"
        />
</LinearLayout>

這個碎片只是把背景色改為黃色务傲。然后再新建一個 Fragment:

public class AnotherRightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.another_right_fragment, container, false);
    }
}

在主界面中加入一個 FrameLayout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <fragment
        android:id="@+id/left_fragment"
        android:name="net.deniro.android.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        />


   <FrameLayout
       android:id="@+id/right_layout"
       android:layout_width="0dp"
       android:layout_height="match_parent"
        android:layout_weight="1"
       ></FrameLayout>
</LinearLayout>

我們打算只放一個碎片,因為 FrameLayout 布局中的所有控件都會默認(rèn)擺放在布局的左上角枣申,所以這里很適合使用 FrameLayout 布局售葡。

最后修改主活動中的代碼:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               replace(new AnotherRightFragment());
            }
        });
    }

    private void replace(Fragment fragment) {
        FragmentManager manager=getSupportFragmentManager();
        FragmentTransaction transaction=manager.beginTransaction();
        transaction.replace(R.id.right_layout,fragment);
        transaction.commit();

    }
}

我們給左側(cè)碎片中的按鈕注冊了一個點擊事件,事件內(nèi)部會調(diào)用 replace() 方法動態(tài)添加碎片忠藤。動態(tài)添加碎片分為 5 步:

  1. 創(chuàng)建待添加的碎片實例挟伙。
  2. 獲取 FragmentManager,在活動中可以直接調(diào)用 getSupportFragmentManager()方法獲取模孩。
  3. 開啟一個事務(wù)尖阔。
  4. 向容器內(nèi)添加或替換碎片,一般使用 replace() 方法實現(xiàn)榨咐,需要傳入容器的 id 和待添加或替換的碎片實例介却。
  5. 提交事務(wù)。
動態(tài)添加碎片

3 在碎片中模擬棧

上面块茁,我們實現(xiàn)了向活動中動態(tài)添加碎片的功能齿坷,但通過點擊按鈕添加了一個碎片之后,按下 Back 鍵程序就會直接退出数焊。如何才能夠模擬 “返回椨捞剩” 的效果,讓這個示例點擊兩次 Back 鍵才會退出程序呢佩耳?

FragmentTransaction 中有一個 addToBackStack() 方法遂蛀,可以將一個事務(wù)添加到棧中,我們修改 Activity 中的代碼:

private void replace(Fragment fragment) {
    FragmentManager manager=getSupportFragmentManager();
    FragmentTransaction transaction=manager.beginTransaction();
    transaction.replace(R.id.right_layout,fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

4 碎片和活動之間的通信

為了方便碎片和活動之間進行通信蚕愤,F(xiàn)ragmentManager 提供了一個類似于 findViewById() 的方法答恶,專用于從布局文件中獲取碎片的實例:

//從布局文件中獲取碎片實例
RightFragment rightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_layout);

** 注意:要使用 getSupportFragmentManager() 來獲取碎片管理器哦**

從碎片中也可以直接返回相關(guān)的活動:

//從碎片中調(diào)用活動
Activity activity = rightFragment.getActivity();

另外饺蚊,如果需要在碎片中獲取 Context 對象時,也可以直接調(diào)用 getActivity()悬嗓,因為 Activity 本身就是 Context 對象啦O(∩_∩)O哈哈~

從活動中也可以再調(diào)用碎片實例:

 //從活動中再調(diào)用碎片實例
      +  ((AppCompatActivity) activity).getSupportFragmentManager().findFragmentById(R.id.right_layout);

這里記得向下轉(zhuǎn)型為 AppCompatActivity 哦污呼。

有了上面的方法,我們就能讓碎片與碎片之間通信啦:

  1. 從 A 碎片中得到相關(guān)聯(lián)的活動包竹。
  2. 通過這個活動獲取 B 碎片的實例燕酷。

A 碎片 → 關(guān)聯(lián)活動 → B 碎片

是不是很清楚呀O(∩_∩)O~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市周瞎,隨后出現(xiàn)的幾起案子苗缩,更是在濱河造成了極大的恐慌,老刑警劉巖声诸,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酱讶,死亡現(xiàn)場離奇詭異,居然都是意外死亡彼乌,警方通過查閱死者的電腦和手機泻肯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慰照,“玉大人灶挟,你說我怎么就攤上這事《咀猓” “怎么了稚铣?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墅垮。 經(jīng)常有香客問我惕医,道長,這世上最難降的妖魔是什么噩斟? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任曹锨,我火速辦了婚禮,結(jié)果婚禮上剃允,老公的妹妹穿的比我還像新娘沛简。我一直安慰自己,他們只是感情好斥废,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布椒楣。 她就那樣靜靜地躺著,像睡著了一般牡肉。 火紅的嫁衣襯著肌膚如雪捧灰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音毛俏,去河邊找鬼炭庙。 笑死,一個胖子當(dāng)著我的面吹牛煌寇,可吹牛的內(nèi)容都是我干的焕蹄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼阀溶,長吁一口氣:“原來是場噩夢啊……” “哼腻脏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起银锻,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤永品,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后击纬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼎姐,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年掉弛,在試婚紗的時候發(fā)現(xiàn)自己被綠了症见。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂走。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡殃饿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芋肠,到底是詐尸還是另有隱情乎芳,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布帖池,位于F島的核電站奈惑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睡汹。R本人自食惡果不足惜肴甸,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望囚巴。 院中可真熱鬧原在,春花似錦、人聲如沸彤叉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秽浇。三九已至浮庐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柬焕,已是汗流浹背审残。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工梭域, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搅轿。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓碰辅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親介时。 傳聞我的和親對象是個殘疾皇子没宾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,071評論 25 707
  • 1. 引言 ??現(xiàn)如今移動設(shè)備的發(fā)展非常的迅速,手機和平板都非常的普及了沸柔。這兩者的差距除了屏幕的大小以外循衰,其他的差...
    憶念成風(fēng)閱讀 720評論 1 1
  • Fragment概述 Fragment是Activity中用戶界面的一個行為或者說是一部分。主要是支持大屏幕上動態(tài)...
    wangling90閱讀 11,536評論 5 75
  • 一大片向日葵花田褐澎,陽光燦烈而耀目会钝。 他撫著畫板,輕聲道:“要向著陽光啊工三∏ㄋ幔”她輕瞇著眼,看著他的微卷短發(fā)在光下泛著神...
    阿離夫閱讀 420評論 0 4
  • 簿荷俭正,在我們老家用客家話的來說的話是“碧遲”奸鬓。碧遲的味道非常濃郁,手輕輕拂過葉子都能聞到手中明顯的香味掸读。但這碧遲...
    張啊_d719閱讀 879評論 0 0