Android主頁Activity對多個Fragment實現不同的沉浸式標題(圖片或者文字標題)


提示:講解的該例實現是 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM