一個輪子解決 fragment 和 statusBar 那些事

今天給大家介紹一個開源庫,看完后哆档,很多 fragment 以及狀態(tài)欄相關(guān)的煩惱將離你而去砌左。

我不喜歡啰嗦,讓我們直入主題吧师崎。

搞定 fragment 那些事

fragment 有哪些煩惱默终?

動畫不正常,尤其是有 fragment 嵌套的時候?

can not perform this action after onSaveInstanceState 異常齐蔽?

不正常的重影两疚?

煩人的生命周期?

不知道用哪個 fragmentManager?

AndroidNavigation 來拯救世界

下載體驗 apk

建議分別在 Android 4.4含滴、5.0 和 6.0 下體驗

一行代碼實現(xiàn) Fragment 嵌套诱渤,一次性構(gòu)建好嵌套層級

AndroidNaviation 提供了幾款常用的容器來幫助我們快速實現(xiàn) fragment 嵌套,分別是 DrawerFragment, TabBarFragment, NavigationFragment

看名字不難理解谈况,DrawerFragment 為我們提供了抽屜的能力勺美,是一個很拉風(fēng)的抽屜哦,當(dāng)打開時鸦做,狀態(tài)欄會自動隱藏励烦。

image

相信我,你們的設(shè)計師會喜歡的泼诱。

TabBarFragment 為我們提供了 BottomNavigationBar 選項卡的能力坛掠,譬如微信、支付寶主頁面底部都會有一個

image

NavigationFragment 則以棧的形式管理它的子 fragment, 并且提供了轉(zhuǎn)場動畫治筒。嵌套在 NavigationFragment 里面的子 fragment 會受到祝福屉栓,擁有自動創(chuàng)建 Toolbar 的能力,并在恰當(dāng)?shù)臅r機(jī)自動添加返回按鈕耸袜。

image

如果一個應(yīng)用的主頁面友多,既有 drawer 也有 tabs,每個 tab 的頁面還要能切換到其它頁面堤框,看起來很復(fù)雜的嵌套吧域滥。但 AndroidNavigation 可以一次性就把這些 UI 層級構(gòu)建好

// MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null) {
        // 首頁
        HomeFragment homeFragment = new HomeFragment();
        NavigationFragment homeNavigatoinFragment = new NavigationFragment();
        homeNavigationFraggment.setRootFragment(homeFragment);
        homeNavigatoinFragment.setTabBarItem(new TabBarItem(R.drawable.icon_home, "首頁"));
        
        // 通訊錄
        ContactsFragment contactsFragment = new ContactsFragment();
        NavigationFragment contactsNavigationFragment = new NavigationFragment();
        contactsNavigationFragment.setRootFragment(contactsFragment);
        contactsNavigationFragment.setTabBarItem(new TabBarItem(R.drawable.icon_contacts, "通訊錄"));
        
        // 添加 tab 到 TabBarFragment 
        TabBarFragment tabBarFragment = new TabBarFragment();
        tabBarFragment.setFragments(homeNavigatoinFragment, contactsNavigationFragment);
        
        // drawer
        DrawerFragment drawerFragemnt = new DrawerFragment();
        MenuFragment menuFragment = new MenuFragment();
        drawerFragment.setMenuFragment(menuFragment);
        drawerFragment.setContentFragment(tabBarFragment);
        drawerFragment.setMaxDrawerWidth(300); // 設(shè)置 menu 的最大寬度
        
        // 把 DrawerFragment 設(shè)置為 Activity 的根
        setRootFragment(drawerFragemnt);
    }
}

就這樣,我們把上面提到的 UI 層級構(gòu)建好了蜈抓,一共有四層 fragment 嵌套哦启绰,恐怖不恐怖,興奮不興奮沟使?

這些容器還不能滿足你的需求委可?自定義容器!

我們的 ViewPagerFragment 就是個自定義容器

image

核心代碼

// ViewPagerFragemnt.java

int location;

@Override
public boolean isParentFragment() {
    return true;
}

@Override
protected int preferredStatusBarColor() {
    int[] colors = new int[] {Color.RED, Color.GREEN, Color.BLUE};
    return colors[location];
}

private void initView(View view) {
    AppBarLayout appBarLayout = view.findViewById(R.id.appbar_layout);
    // important
    if(isStatusBarTranslucent()) {
        appendStatusBarPadding(appBarLayout, -2);
    }
}

并不復(fù)雜

一行代碼實現(xiàn) Fragment 跳轉(zhuǎn)腊嗡,不再需要寫一大堆操作 fragment 的代碼了着倾,不用擔(dān)心用錯 FragmentManager 了

所有的 fragment 都具備兩個基本的導(dǎo)航能力 presentFragment 以及 dismissFragment,就是打開和關(guān)閉一個 fragment

// HomeFragment.java
presentFragment(new TargetFragment(), REQUEST_CODE);

一行代碼就跳過去了

帶上個請求碼燕少,TargetFragment 在關(guān)閉前可以通過 setResult 返回結(jié)果給前一個頁面

 Bundle result = new Bundle();
 result.putString("text", resultEditText.getText().toString());
 setResult(Activity.RESULT_OK, result);
 dismissFragment();//關(guān)閉

如果 fragemnt 嵌套在 NavigationFragment 中卡者,會有更多的導(dǎo)航能力, 比如

  • push 入棧一個界面
  • pop 出棧一個界面
  • popTo 同時出棧多個界面到指定界面,而且不用擔(dān)心一次出棧多個界面客们,動畫會有問題

對上面這些導(dǎo)航不滿意虎眨?自定義導(dǎo)航蟋软!

image

具體實現(xiàn)參考 demo 中 GridFragment 這個類

懶加載

AndroidNavigation 提供了兩個生命周期函數(shù)來幫助我們實現(xiàn)懶加載

protected void onViewAppear();
protected void onViewDisappear();

搞定狀態(tài)欄那些事

狀態(tài)欄的煩事有哪些?

沉浸式以及沉浸式帶來的 BUG 嗽桩?

白底黑字但結(jié)果 5.0 以下全是白的岳守?

想要將沉浸式以及狀態(tài)欄顏色兼容到 4.4?

啥碌冶,鍵盤不頂用了湿痢?

一行代碼開關(guān)沉浸式狀態(tài)欄,兼容到 Android 4.4 并解決了相關(guān) BUG

// 開啟沉浸式
setStatusBarTranslucent(true);
image

其它諸如狀態(tài)欄顏色扑庞,只需要有選擇性地重寫以下方法譬重,返回期待的結(jié)果即可

// 狀態(tài)欄字體風(fēng)格,黑或白
protected BarStyle preferredStatusBarStyle();
// 是否隱藏狀態(tài)欄
protected boolean preferredStatusBarHidden();
// 狀態(tài)欄顏色
protected int preferredStatusBarColor();
// 切換狀態(tài)欄顏色時罐氨,是否平滑過渡
protected boolean preferredStatusBarColorAnimated();

就是這么簡單

關(guān)于 AndroidNavigation 更多功能更詳細(xì)的描述臀规,請看這里 README

喜歡的話記得給顆星星,因為要集齊 100 顆才可以召喚神龍栅隐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塔嬉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子租悄,更是在濱河造成了極大的恐慌谨究,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泣棋,死亡現(xiàn)場離奇詭異胶哲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)潭辈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門鸯屿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人把敢,你說我怎么就攤上這事碾盟。” “怎么了技竟?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屈藐。 經(jīng)常有香客問我榔组,道長,這世上最難降的妖魔是什么联逻? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任搓扯,我火速辦了婚禮,結(jié)果婚禮上包归,老公的妹妹穿的比我還像新娘锨推。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布换可。 她就那樣靜靜地躺著椎椰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沾鳄。 梳的紋絲不亂的頭發(fā)上慨飘,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音译荞,去河邊找鬼瓤的。 笑死,一個胖子當(dāng)著我的面吹牛吞歼,可吹牛的內(nèi)容都是我干的圈膏。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼篙骡,長吁一口氣:“原來是場噩夢啊……” “哼稽坤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起医增,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤慎皱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叶骨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茫多,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年忽刽,在試婚紗的時候發(fā)現(xiàn)自己被綠了天揖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡跪帝,死狀恐怖今膊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伞剑,我是刑警寧澤斑唬,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站黎泣,受9級特大地震影響恕刘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抒倚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一褐着、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧托呕,春花似錦含蓉、人聲如沸频敛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斟赚。三九已至,卻和暖如春岂嗓,著一層夾襖步出監(jiān)牢的瞬間汁展,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工厌殉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留食绿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓公罕,卻偏偏與公主長得像器紧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子楼眷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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