acvitity와fragment에서 단독으로 설정할 수 있는 침착식 상태 표시줄의 사용자 정의 실현 방식 (흰 바탕에 검은 글자 상태 표시줄 포함)

8272 단어 Android
흰색 바탕에 검은색 글자를 간단하게 설정합니다.
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }
  • 상태막대 색상을 흰색으로 변경하면 됩니다
  • 목적:
    안드로이드의 몰입식 상태 표시줄을 설정하면 모든 배경을 통일적으로 설정할 수 있습니다. 아래의 삼자 라이브러리에 의존하여 BaseAcvitity에 설정하면 됩니다(api에 대한 요구가 있습니다. 4.4 이하의 효과가 나타나지 않거나 반투명 효과). 상태 표시줄에 투명을 설정한 후 하나의 레이아웃이나 이미지뷰로 채울 수 있습니다.acvitity나fragment의 루트에android:fitsSystemWindows="true"를 붙여서 페이지 레이아웃이 상태 표시줄에 채워지지 않도록 하세요.우리는 자신의 숨겨진 레이아웃과 상태 표시줄 등이 높고 첫 번째 단계를 채워야 한다. 삼자 의존 라이브러리 추가(이 의존 라이브러리는 프로젝트의 모든 페이지의 통일된 색이나 배경 그림의 침착한 상태 표시줄을 실현하는 데 주로 사용된다)
     compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    

    두 번째 단계: 사용자 정의 도구 클래스, 상태 표시줄 높이 동적 가져오기(acvitity와fragment의 두 그룹 네 가지 방법 포함)
    public class ImmersiveStatusBar {
        /**
         *                   
         *
         */
        public static void initStateInAcvitity(Activity activity, LinearLayout linear_bar) {
    
            //      4.4  4.4             
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                //     
                activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    //            activity.getWindow().setFlags(
    //                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
    //                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                //     
    //            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    //            LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
                linear_bar.setVisibility(View.VISIBLE);
                //         
                int statusHeight = getStatusBarHeightInAcvitity(activity);
                //            
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();
                params.height = statusHeight;
                linear_bar.setLayoutParams(params);
            }
        }
    
        /**
         *               
         *
         * @return
         */
        public static int getStatusBarHeightInAcvitity(Activity activity) {
            try {
                Class> c = Class.forName("com.android.internal.R$dimen");
                Object obj = c.newInstance();
                Field field = c.getField("status_bar_height");
                int x = Integer.parseInt(field.get(obj).toString());
                return activity.getResources().getDimensionPixelSize(x);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
        }
        /**
         *      Fragment             
         *
         */
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public static void initStateInFragment(Fragment fragment, LinearLayout linear_bar) {
    
            //      4.4  4.4             
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                fragment.getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                //     
                fragment.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                //       flag      setStatusBarColor         
                fragment.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    
    //            fragment.getActivity().getWindow().setFlags(
    //                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
    //                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                //     
    //            fragment.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                //
    //            LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
    
                //         
                int statusHeight = getStatusBarHeightInFragment(fragment);
                //            
                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) linear_bar.getLayoutParams();
                params.height = statusHeight;
                linear_bar.setLayoutParams(params);
    //            linear_bar.setBackground(fragment.getActivity().getDrawable(android.R.drawable.bottom_bar));
                linear_bar.setVisibility(View.VISIBLE);
            }
        }
    
        /**
         *          Fragment     
         *
         * @return
         */
        public static int getStatusBarHeightInFragment(Fragment fragment) {
            try {
                Class> c = Class.forName("com.android.internal.R$dimen");
                Object obj = c.newInstance();
                Field field = c.getField("status_bar_height");
                int x = Integer.parseInt(field.get(obj).toString());
                return fragment.getActivity().getResources().getDimensionPixelSize(x);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
        }
    }
    
    

    세 번째 단계: 침몰식 상태 표시줄을 실현해야 하는acvitity나fragment의 xml 레이아웃 파일에 숨겨진 레이아웃을 추가하여 투명한 상태 표시줄 배경을 채웁니다
    
    
        
        
        
    

    4단계: Java 코드의 onResume 방법에서 두 번째 방법을 호출하여 숨겨진 레이아웃을 매개 변수로 전송하고 그의 높이를 동적으로 설정하며 다음과 같은 설정을 한다.
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void onResume() {
            ImmersiveStatusBar.initStateInFragment(context,ll_bar2);
            SystemBarTintManager tintManager = new SystemBarTintManager(getActivity());
            tintManager.setStatusBarTintEnabled(true);
            tintManager.setStatusBarTintResource(R.color.colorPrimary);//         
    //        tintManager.setStatusBarTintDrawable(getResources().getDrawable(R.drawable.mybgcolor_02));//          
            super.onResume();
        }
    

    버전 제어: 만약에 흰색 바탕에 검은색 글자의 상태 표시줄을 실현하려면 핸드폰 시스템이 6.0 이상이어야 하고 4.4-6.0의 시스템은 흰색 글자만 가능하며 시스템 상태 표시줄의 색을 바꿀 수 없다. 6.0시스템은 이 상태 표시줄의 글씨체가 검은색이어야 한다면 Theme 테마에 추가해야 한다.
    true
    

    이렇게 하면 상태 표시줄을 흰색 또는 연한 색으로 설정할 때 6.0 시스템의 상태 표시줄은 자동으로 검은색으로 변한다. 여기서 시스템을 6.0 이상과 4.4-6.0으로 나누어 버전별로 다른 상태 표시줄을 표시한다. 그렇지 않으면 흰색 배경의 상태 표시줄을 직접 설정하면 상태 표시줄의 글씨체는 기본적으로 흰색이고 보이지 않는다. 4.4 이하는 고려하지 않는다.4.4 이하의 핸드폰을 사용하는 사람이 없고 4.4 이하의 버전 자체가 침몰식 상태막대를 지원하지 않기 때문에 설치해도 소용이 없기 때문에Acvitity나 Fragment에서 다음과 같이 판단한다.
    
            if (Build.VERSION.SDK_INT >= 23) {//  6.0           
                Window window = getWindow();
                //         ,  ContentView          
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    //			       flag      setStatusBarColor         
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                //       
                window.setStatusBarColor(getResources().getColor(R.color.title_bg_color));
                //     
                //window.setNavigationBarColor(activity.getResources().getColor(colorResId));
            } else {
                ImmersiveStatusBar.initStateInAcvitity(this, ll_top_status);
                SystemBarTintManager tintManager = new SystemBarTintManager(this);
                tintManager.setStatusBarTintEnabled(true);
    //        tintManager.setStatusBarTintResource(R.color.title_bg_color);//         
                tintManager.setStatusBarTintDrawable(getResources().getDrawable(R.drawable.wodetitle03));
            }
    

    이렇게 6.0 이상 시스템에서 이루어진 것은 바로 흰색 배경의 짙은 색 글씨체의 상태 표시줄이다. 만약에 핸드폰 시스템이 4.4-6.0이면 투명한 상태 표시줄이 되고 색깔은 사용자 정의가 가능하며 그림 배경도 점차적으로 변화하는 효과를 실현할 수 있다. 어쨌든 흰색 배경을 설정하지 않으면 된다.상태막대 글꼴 이상을 볼 수 없도록 설정한 효과가 ViewPager+Fragment에서 서로 다른 Fragment로 전환될 때 이것은 상태막대가 서로 다른 배경이므로 acvitity에서 설정하는 것이 더욱 편리하고 군말하지 않습니다

    좋은 웹페이지 즐겨찾기