Android劉海屏適配 ----- ImmersionBar


android 4.4以上沉浸式狀態欄和沉浸式導航欄管理,適配橫豎屏切換、劉海屏、軟鍵盤彈出等問題,可以修改狀態欄字體顏色和導航欄圖標顏色,以及不可修改字體顏色手機的適配,適用於Activity、Fragment、DialogFragment、Dialog,PopupWindow;

  1. 引入

    // 基礎依賴包,必須要依賴 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' // fragment快速實現(可選) implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' // kotlin擴展(可選) implementation 'com.gyf.immersionbar:immersionbar-ktx:3.0.0
  2. 關於全面屏與劉海

    ① 在manifest的Application節點下加入

     <meta-data 
         android:name="android.max_aspect"
         android:value="2.4" />

     

    ② 在manifest的Application節點中加入

    android:resizeableActivity="true"

     

    ③ 在manifest的Application節點中加入

     android:maxAspectRatio="2.4"

     

    ④ 升級targetSdkVersion為25以上版本

  3. 關於劉海屏

    在manifest的Application節點下加入,vivo和oppo沒有找到相關配置信息

       <!--適配華為(huawei)劉海屏-->
       <meta-data 
         android:name="android.notch_support" 
         android:value="true"/>
       <!--適配小米(xiaomi)劉海屏-->
       <meta-data
         android:name="notch.config"
         android:value="portrait|landscape" />

    用法

    初始化

    • 基礎用法(已經可以滿足日常沉浸式)

      ImmersionBar.with(this).init();
    • 高級用法(每個參數的意義)

       ImmersionBar.with(this)
                   .transparentStatusBar()  //透明狀態欄,不寫默認透明色
                   .transparentNavigationBar()  //透明導航欄,不寫默認黑色(設置此方法,fullScreen()方法自動為true)
                   .transparentBar()             //透明狀態欄和導航欄,不寫默認狀態欄為透明色,導航欄為黑色(設置此方法,fullScreen()方法自動為true)
                   .statusBarColor(R.color.colorPrimary)     //狀態欄顏色,不寫默認透明色
                   .navigationBarColor(R.color.colorPrimary) //導航欄顏色,不寫默認黑色
                   .barColor(R.color.colorPrimary)  //同時自定義狀態欄和導航欄顏色,不寫默認狀態欄為透明色,導航欄為黑色
                   .statusBarAlpha(0.3f)  //狀態欄透明度,不寫默認0.0f
                   .navigationBarAlpha(0.4f)  //導航欄透明度,不寫默認0.0F
                   .barAlpha(0.3f)  //狀態欄和導航欄透明度,不寫默認0.0f
                   .statusBarDarkFont(true)   //狀態欄字體是深色,不寫默認為亮色
                   .navigationBarDarkIcon(true) //導航欄圖標是深色,不寫默認為亮色
                   .autoDarkModeEnable(true) //自動狀態欄字體和導航欄圖標變色,必須指定狀態欄顏色和導航欄顏色才可以自動變色哦
                   .autoStatusBarDarkModeEnable(true,0.2f) //自動狀態欄字體變色,必須指定狀態欄顏色才可以自動變色哦
                   .autoNavigationBarDarkModeEnable(true,0.2f) //自動導航欄圖標變色,必須指定導航欄顏色才可以自動變色哦
                   .flymeOSStatusBarFontColor(R.color.btn3)  //修改flyme OS狀態欄字體顏色
                   .fullScreen(true)      //有導航欄的情況下,activity全屏顯示,也就是activity最下面被導航欄覆蓋,不寫默認非全屏
                   .hideBar(BarHide.FLAG_HIDE_BAR)  //隱藏狀態欄或導航欄或兩者,不寫默認不隱藏
                   .addViewSupportTransformColor(toolbar)  //設置支持view變色,可以添加多個view,不指定顏色,默認和狀態欄同色,還有兩個重載方法
                   .titleBar(view)    //解決狀態欄和布局重疊問題,任選其一
                   .titleBarMarginTop(view)     //解決狀態欄和布局重疊問題,任選其一
                   .statusBarView(view)  //解決狀態欄和布局重疊問題,任選其一
                   .fitsSystemWindows(true)    //解決狀態欄和布局重疊問題,任選其一,默認為false,當為true時一定要指定statusBarColor(),不然狀態欄為透明色,還有一些重載方法
                   .supportActionBar(true) //支持ActionBar使用
                   .statusBarColorTransform(R.color.orange)  //狀態欄變色后的顏色
                   .navigationBarColorTransform(R.color.orange) //導航欄變色后的顏色
                   .barColorTransform(R.color.orange)  //狀態欄和導航欄變色后的顏色
                   .removeSupportView(toolbar)  //移除指定view支持
                   .removeSupportAllView() //移除全部view支持
                   .navigationBarEnable(true)   //是否可以修改導航欄顏色,默認為true
                   .navigationBarWithKitkatEnable(true)  //是否可以修改安卓4.4和emui3.1手機導航欄顏色,默認為true
                   .fixMarginAtBottom(true)   //已過時,當xml里使用android:fitsSystemWindows="true"屬性時,解決4.4和emui3.1手機底部有時會出現多余空白的問題,默認為false,非必須
                   .addTag("tag")  //給以上設置的參數打標記
                   .getTag("tag")  //根據tag獲得沉浸式參數
                   .reset()  //重置所以沉浸式參數
                   .keyboardEnable(true)  //解決軟鍵盤與底部輸入框沖突問題,默認為false,還有一個重載方法,可以指定軟鍵盤mode
                   .keyboardMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)  //單獨指定軟鍵盤模式
                   .setOnKeyboardListener(new OnKeyboardListener() {    //軟鍵盤監聽回調
                         @Override
                         public void onKeyboardChange(boolean isPopup, int keyboardHeight) {
                             LogUtils.e(isPopup);  //isPopup為true,軟鍵盤彈出,為false,軟鍵盤關閉
                         }
                    })
                   .init();  //必須調用方可沉浸式

      關閉銷毀

      • 在activity的onDestroy方法中執行

        ImmersionBar.with(this).destroy(); //必須調用該方法,防止內存泄漏

      建議

      • 建議在BaseActivity中初始化和銷毀

        public class BaseActivity extends AppCompatActivity {
        
             @Override
             protected void onCreate(@Nullable Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 // 所有子類都將繼承這些相同的屬性,請在設置界面之后設置
                 ImmersionBar.with(this).init();  
             }
           
             @Override
             protected void onResume() {
                 super.onResume();
                 // 非必加
                 // 如果你的app可以橫豎屏切換,適配了華為emui3系列系統手機,並且navigationBarWithEMUI3Enable為true,
                 // 請在onResume方法里添加這句代碼(同時滿足這三個條件才需要加上代碼哦:1、橫豎屏可以切換;2、華為emui3系列系統手機;3、navigationBarWithEMUI3Enable為true)
                 // 否則請忽略
                 if (OSUtils.isEMUI3_x()) {
                     ImmersionBar.with(this).init();   
                 }   
             }
         
             @Override
             protected void onDestroy() {
                 super.onDestroy();
                 // 必須調用該方法,防止內存泄漏
                 ImmersionBar.with(this).destroy();  
             }
           
            @Override
             protected void onConfigurationChanged(Configuration newConfig) {
                 super.onConfigurationChanged(newConfig);
                 // 非必加
                 // 如果你的app可以橫豎屏切換,適配了4.4或者華為emui3.1系統手機,並且navigationBarWithKitkatEnable為true,
                 // 請務必在onConfigurationChanged方法里添加如下代碼(同時滿足這三個條件才需要加上代碼哦:1、橫豎屏可以切換;2、android4.4或者華為emui3.1系統手機;3、navigationBarWithKitkatEnable為true)
                 // 否則請忽略
                 ImmersionBar.with(this).init();   
             }
         }

         

        Demo下載地址:https://github.com/gyf-dev/ImmersionBar

         

        By:楊

         

 


免責聲明!

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



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