提示:講解的該例實現是 FragmentTabHost + Fragment 實現:
1.示例效果圖:

2.場景需求:
如示例圖所示,在首頁實現輪播圖的沉浸,而 “發現” 和“我的”頁是標題的沉浸。
3.實現思路:
(1) 使Activity狀態欄透明,並且讓布局進入到狀態欄后面(style 要求是NoActionBar,在清單文件中配置即可)
(2)對不同樣式需求的Fragment,進行不同的操作
樣例中只有輪播圖和文字標題兩種樣式:
①輪播圖:實現(1),就可以實現效果
②文字標題:可代碼獲取屏幕寬度以及狀態欄的高度,為文字標題的根部局動態添加一個和狀態欄大小一樣的View就可以了,顏色就可以隨意控制了。
4.編碼實現:
實現(1)思路:對Activity:在onCreate方法中,在setContentView()方法后調用以下方法:
/** * 沉浸式狀態欄 */ private void initState() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明狀態欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明導航欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } }
實現(2)思路:示例中對Fragment抽取父類BaseFragment中,成員變量 mStatusBarView 就是和狀態欄大小一樣的View,將其添加在根部局的第一個位置
public abstract class BaseFragment extends Fragment { private ViewGroup mView; protected View mStatusBarView; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (mView == null) { mView = (ViewGroup) inflater.inflate(getLayoutId(), container, false); } ViewGroup parent = (ViewGroup) mView.getParent(); if (parent != null) { parent.removeView(mView); } ButterKnife.bind(this, mView); return mView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); addStatusBar(); } private void addStatusBar() { if (mStatusBarView == null) { mStatusBarView = new View(getContext()); int screenWidth = getResources().getDisplayMetrics().widthPixels; int statusBarHeight = getStatusBarHeight(getActivity()); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(screenWidth, statusBarHeight); mStatusBarView.setLayoutParams(params); mStatusBarView.requestLayout(); if (mView != null) mView.addView(mStatusBarView, 0); } } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); } }
public static int getStatusBarHeight(Activity activity) { int statusBarHeight = 0; if (activity != null) { int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android"); statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId); } return statusBarHeight; }
這樣對於每個子類Fragment對StatusBar就是可控的了,控制其顯示與否,控制其顏色。
5. 細節調整:
布局中部分控件或者子布局不想進入到狀態欄后面,導致無法點擊,則需要在該控件或者子布局中添加一個屬性:android:fitsSystemWindows="true",下面代碼中ImageView就是輪播圖中那個信封按鈕,不希望它被放置到狀態欄后面
<ImageView android:id="@+id/btn_message" android:layout_width="50dp" android:layout_height="65dp" android:layout_alignParentRight="true" android:layout_marginRight="15dp" android:fitsSystemWindows="true" android:src="@drawable/btn_message_selector" />
項目源碼:
鏈接: https://pan.baidu.com/s/1gfqxXD5 密碼: dj7v
