今天給大家介紹一個開源庫,看完后哆档,很多 fragment 以及狀態(tài)欄相關(guān)的煩惱將離你而去砌左。
我不喜歡啰嗦,讓我們直入主題吧师崎。
搞定 fragment 那些事
fragment 有哪些煩惱默终?
動畫不正常,尤其是有 fragment 嵌套的時候?
can not perform this action after onSaveInstanceState 異常齐蔽?
不正常的重影两疚?
煩人的生命周期?
不知道用哪個 fragmentManager?
AndroidNavigation 來拯救世界
建議分別在 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)欄會自動隱藏励烦。
相信我,你們的設(shè)計師會喜歡的泼诱。
TabBarFragment 為我們提供了 BottomNavigationBar 選項卡的能力坛掠,譬如微信、支付寶主頁面底部都會有一個
NavigationFragment 則以棧的形式管理它的子 fragment, 并且提供了轉(zhuǎn)場動畫治筒。嵌套在 NavigationFragment 里面的子 fragment 會受到祝福屉栓,擁有自動創(chuàng)建 Toolbar 的能力,并在恰當(dāng)?shù)臅r機(jī)自動添加返回按鈕耸袜。
如果一個應(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 就是個自定義容器
核心代碼
// 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)航蟋软!
具體實現(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);
其它諸如狀態(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 顆才可以召喚神龍栅隐。