今天給你們介紹一個開源庫,看完後,不少 fragment 以及狀態欄相關的煩惱將離你而去。java
我不喜歡囉嗦,讓咱們直入主題吧。git
fragment 有哪些煩惱?github
動畫不正常,尤爲是有 fragment 嵌套的時候?微信
can not perform this action after onSaveInstanceState 異常?app
不正常的重影?ide
煩人的生命週期?函數
不知道用哪一個 fragmentManager?字體
AndroidNavigation 來拯救世界動畫
下載體驗 apkthis
建議分別在 Android 4.四、5.0 和 6.0 下體驗
一行代碼實現 Fragment 嵌套,一次性構建好嵌套層級
AndroidNaviation 提供了幾款經常使用的容器來幫助咱們快速實現 fragment 嵌套,分別是 DrawerFragment, TabBarFragment, NavigationFragment
看名字不難理解,DrawerFragment 爲咱們提供了抽屜的能力,是一個很拉風的抽屜哦,當打開時,狀態欄會自動隱藏。
相信我,大家的設計師會喜歡的。
TabBarFragment 爲咱們提供了 BottomNavigationBar 選項卡的能力,譬如微信、支付寶主頁面底部都會有一個
NavigationFragment 則以棧的形式管理它的子 fragment, 而且提供了轉場動畫。嵌套在 NavigationFragment 裏面的子 fragment 會受到祝福,擁有自動建立 Toolbar 的能力,並在恰當的時機自動添加返回按鈕。
若是一個應用的主頁面,既有 drawer 也有 tabs,每一個 tab 的頁面還要能切換到其它頁面,看起來很複雜的嵌套吧。但 AndroidNavigation 能夠一次性就把這些 UI 層級構建好
// 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); // 設置 menu 的最大寬度
// 把 DrawerFragment 設置爲 Activity 的根
setRootFragment(drawerFragemnt);
}
}
複製代碼
就這樣,咱們把上面提到的 UI 層級構建好了,一共有四層 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);
}
}
複製代碼
並不複雜
一行代碼實現 Fragment 跳轉,再也不須要寫一大堆操做 fragment 的代碼了,不用擔憂用錯 FragmentManager 了
全部的 fragment 都具有兩個基本的導航能力 presentFragment 以及 dismissFragment,就是打開和關閉一個 fragment
// HomeFragment.java
presentFragment(new TargetFragment(), REQUEST_CODE);
複製代碼
一行代碼就跳過去了
帶上個請求碼,TargetFragment 在關閉前能夠經過 setResult 返回結果給前一個頁面
Bundle result = new Bundle();
result.putString("text", resultEditText.getText().toString());
setResult(Activity.RESULT_OK, result);
dismissFragment();//關閉
複製代碼
若是 fragemnt 嵌套在 NavigationFragment 中,會有更多的導航能力, 好比
對上面這些導航不滿意?自定義導航!
具體實現參考 demo 中 GridFragment 這個類
懶加載
AndroidNavigation 提供了兩個生命週期函數來幫助咱們實現懶加載
protected void onViewAppear();
protected void onViewDisappear();
複製代碼
狀態欄的煩事有哪些?
沉浸式以及沉浸式帶來的 BUG ?
白底黑字但結果 5.0 如下全是白的?
想要將沉浸式以及狀態欄顏色兼容到 4.4?
啥,鍵盤不頂用了?
一行代碼開關沉浸式狀態欄,兼容到 Android 4.4 並解決了相關 BUG
// 開啓沉浸式
setStatusBarTranslucent(true);
複製代碼
其它諸如狀態欄顏色,只須要有選擇性地重寫如下方法,返回期待的結果便可
// 狀態欄字體風格,黑或白
protected BarStyle preferredStatusBarStyle();
// 是否隱藏狀態欄
protected boolean preferredStatusBarHidden();
// 狀態欄顏色
protected int preferredStatusBarColor();
// 切換狀態欄顏色時,是否平滑過渡
protected boolean preferredStatusBarColorAnimated();
複製代碼
就是這麼簡單
關於 AndroidNavigation 更多功能更詳細的描述,請看這裏 README
喜歡的話記得給顆星星,由於要集齊 100 顆才能夠召喚神龍。