<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        react-native android狀態(tài)欄的實現(xiàn)

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:12:49
        文檔

        react-native android狀態(tài)欄的實現(xiàn)

        react-native android狀態(tài)欄的實現(xiàn):react-native 開發(fā)App的時候難免會遇到狀態(tài)欄的,背景顏色和字體顏色與App內(nèi)容頁面,色調(diào)適配,間言之就是將狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體。 1.android設(shè)備系統(tǒng)元素 導(dǎo)航欄:就是設(shè)備頂部的網(wǎng)絡(luò)、時間、電量等信息欄 ActionBar:
        推薦度:
        導(dǎo)讀react-native android狀態(tài)欄的實現(xiàn):react-native 開發(fā)App的時候難免會遇到狀態(tài)欄的,背景顏色和字體顏色與App內(nèi)容頁面,色調(diào)適配,間言之就是將狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體。 1.android設(shè)備系統(tǒng)元素 導(dǎo)航欄:就是設(shè)備頂部的網(wǎng)絡(luò)、時間、電量等信息欄 ActionBar:

        react-native 開發(fā)App的時候難免會遇到狀態(tài)欄的,背景顏色和字體顏色與App內(nèi)容頁面,色調(diào)適配,間言之就是將狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體。

        1.android設(shè)備系統(tǒng)元素

        1. 導(dǎo)航欄:就是設(shè)備頂部的網(wǎng)絡(luò)、時間、電量等信息欄
        2. ActionBar: 返回按鈕以及系統(tǒng)默認的header區(qū)域,RN開發(fā)中一般不會用到,RN中在navigation中進行定制
        3. 導(dǎo)航欄: 設(shè)備下方的物理返回、回桌面、選擇應(yīng)用程序等系統(tǒng)導(dǎo)航欄

        2.狀態(tài)欄的呈現(xiàn)形式

        1. 默認展示,一直顯示手機系統(tǒng)的狀態(tài)欄
        2. 透明狀態(tài)欄,狀態(tài)欄背景顏色透明,狀態(tài)欄顏色與App顏色一致,用戶界面更加整體。
        3. 隱藏狀態(tài)欄(沉浸式),狀態(tài)欄完全隱藏,類似于全屏游戲、視頻播放器的效果

        2.1 默認展示

        系統(tǒng)默認狀態(tài)欄樣式,無法改變

        2.2 透明狀態(tài)欄

        透明狀態(tài)欄很常見,大多數(shù)的App都是使用這種模式,使得狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體,整個應(yīng)用看起來更加美觀。

        實現(xiàn)透明的狀態(tài)欄的方式很多:

        一、使用App的主題進行配置,在app/main/res/values/styles.xml中設(shè)置主題

        <resources>
        
         <!-- Base application theme. -->
         <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
         <item name="android:windowTranslucentStatus">true</item> // 設(shè)置狀態(tài)欄不占據(jù)空間
         // <item name="android:windowLightStatusBar">true</item> // 設(shè)置狀態(tài)欄字體顏色
         </style>
        
        </resources>
        
        

        這種方式支持api19, 即Android4.4及以上,會在App啟動的時候就生效, 在App啟動時有權(quán)限確認、系統(tǒng)彈窗等也不受影響,在彈出modal之類的深色蒙層時狀態(tài)欄字體會變成成淺色

        只設(shè)置 <item name="android:windowTranslucentStatus">true</item> 這種方式設(shè)置的透明狀態(tài)欄,狀態(tài)欄字體默認白色,無法再動態(tài)通過StatusBar改變狀態(tài)欄的背景顏色,在做需要改變狀態(tài)欄背景顏色的時候就比較尷尬了

        再加一個 <item name="android:windowLightStatusBar">true</item> 這樣設(shè)置狀態(tài)欄字體顏色之后,在深色modal彈出的時候字體不會動態(tài)改變成白色,但可以通過StatusBar設(shè)置barStyle來改變,實際上也不是很方便

        二、android原生設(shè)置,在MainActivity的onCreate中進行設(shè)置

        protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         // 設(shè)置透明狀態(tài)欄
         if (Build.VERSION.SDK_INT >= 21) {
         View decorView = getWindow().getDecorView();
         int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
         decorView.setSystemUiVisibility(option);
         getWindow().setStatusBarColor(Color.TRANSPARENT);
         }
         
         // 設(shè)置透明狀態(tài)欄和透明導(dǎo)航欄
         if (Build.VERSION.SDK_INT >= 21) {
         View decorView = getWindow().getDecorView();
         int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
         decorView.setSystemUiVisibility(option);
         getWindow().setNavigationBarColor(Color.TRANSPARENT);
         getWindow().setStatusBarColor(Color.TRANSPARENT);
         }
        }
        

        透明式狀態(tài)欄,只有5.0及以上系統(tǒng)才支持,因此這里先進行了一層if判斷,只有系統(tǒng)版本大于或等于5.0的時候才會執(zhí)行下面的代碼。 接下來我們使用了 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN SYSTEM_UI_FLAG_LAYOUT_STABLE ,注意兩個Flag必須要結(jié)合在一起使用,表示會讓應(yīng)用的主體內(nèi)容占用系統(tǒng)狀態(tài)欄的空間,也就是說狀態(tài)欄不再占據(jù)空間。最后再調(diào)用Window的setStatusBarColor()方法將狀態(tài)欄設(shè)置成透明色就可以了。

        三、使用RN的StatusBar來設(shè)置,在App首次加載的頁面中對狀態(tài)欄進行設(shè)置

        <StatusBar backgroundColor='transparent' translucent barStyle={'dark-content'} />

        這種方式,會在App剛啟動的時候和App啟動時有權(quán)限確認、系統(tǒng)彈窗等會先試用系統(tǒng)的默認狀態(tài)欄,加載App頁面之后再改變成上面設(shè)置的樣式。 好處在于可以動態(tài)進行設(shè)置狀態(tài)欄的樣式。

        StatusBar屬性簡介:

        1. animated: bool 指定狀態(tài)欄的變化是否應(yīng)以動畫形式呈現(xiàn)。目前支持這幾種樣式:backgroundColor, barStyle和hidden
        2. hidden: bool 是否隱藏狀態(tài)欄。
        3. backgroundColor: 狀態(tài)欄的背景色。
        4. translucent: bool 指定狀態(tài)欄是否透明。設(shè)置為true時,應(yīng)用會在狀態(tài)欄之下繪制(即所謂“沉浸式”——被狀態(tài)欄遮住一部分)。常和帶有半透明背景色的狀態(tài)欄搭配使用。
        5. barStyle: enum('default', 'light-content', 'dark-content') 設(shè)置狀態(tài)欄文本的顏色。

        以上幾種方式都會有一個問題,狀態(tài)欄不再占據(jù)空間,因此在頁面布局的時候需要加 paddingTop 值為狀態(tài)欄的高度。

        純前端就可以實現(xiàn),這也是適配目前主流劉海屏的一種方式,利用StatusBar.currentHeight可以獲取到設(shè)備狀態(tài)欄的高度。

        2.3 隱藏 狀態(tài)欄 和 導(dǎo)航欄

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View decorView = getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(option);
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();
        

        3. 淺色狀態(tài)欄的兼容性配置

        目前市面上的淺色狀態(tài)欄基本都是 白底黑字, 支持這種設(shè)置的有Android6.0及其以上; MIUI v6及以上, Flyme 4.0及以上

        具體兼容方案如下:

        Flyme 4.0及以上

        public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {
         boolean result = false;
         if (window != null) {
         try {
         WindowManager.LayoutParams lp = window.getAttributes();
         Field darkFlag = WindowManager.LayoutParams.class
         .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
         Field meizuFlags = WindowManager.LayoutParams.class
         .getDeclaredField("meizuFlags");
         darkFlag.setAccessible(true);
         meizuFlags.setAccessible(true);
         int bit = darkFlag.getInt(null);
         int value = meizuFlags.getInt(lp);
         if (dark) {
         value |= bit;
         } else {
         value &= ~bit;
         }
         meizuFlags.setInt(lp, value);
         window.setAttributes(lp);
         result = true;
         } catch (Exception e) {
        
         }
         }
         return result;
        }
        

        Android6.0及以上

        public static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
         //狀態(tài)欄字體圖標(biāo)顏色
         View decor = activity.getWindow().getDecorView();
         if (dark) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
         decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR //淺色狀態(tài)欄(字體圖標(biāo)白色)
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //contentView 全屏(置于statusbar之下)
         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
         }
         } else {
         decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
         }
        }
        

        MIUI v6及以上

        public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) {
         if(Build.VERSION.SDK_INT >= 24){
         return false;
         }
         boolean result = false;
         Window window=activity.getWindow();
         if (window != null) {
         Class clazz = window.getClass();
         try {
         int darkModeFlag = 0;
         Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
         Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
         darkModeFlag = field.getInt(layoutParams);
         Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
         if(dark){
         extraFlagField.invoke(window,darkModeFlag,darkModeFlag);//狀態(tài)欄透明且黑色字體
         }else{
         extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字體
         }
         result=true;
        
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
         //開發(fā)版 7.7.13 及以后版本采用了系統(tǒng)API,舊方法無效但不會報錯,所以兩個方式都要加上
         if(dark){
         activity.getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
         }else {
         activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
         }
         }
         }catch (Exception e){
        
         }
         }
         return result;
        }
        
        

        在MainActivity的onCreate中調(diào)用

        LightStatusBarUtil.FlymeSetStatusBarLightMode(this.getWindow(), false);
        LightStatusBarUtil.MIUISetStatusBarLightMode(this, false); 
        LightStatusBarUtil.setAndroidNativeLightStatusBar(this, true);
        

        總結(jié)

        實現(xiàn)透明狀態(tài)欄,以上方案都沒有完全兼容android 4.4以下版本,個人覺得比較合適的做法是 android設(shè)置透明狀態(tài)欄 + 淺色狀態(tài)欄的兼容性配置 + StatusBar 來配合控制

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        react-native android狀態(tài)欄的實現(xiàn)

        react-native android狀態(tài)欄的實現(xiàn):react-native 開發(fā)App的時候難免會遇到狀態(tài)欄的,背景顏色和字體顏色與App內(nèi)容頁面,色調(diào)適配,間言之就是將狀態(tài)欄顏色與App顏色一致,使用戶界面更加整體。 1.android設(shè)備系統(tǒng)元素 導(dǎo)航欄:就是設(shè)備頂部的網(wǎng)絡(luò)、時間、電量等信息欄 ActionBar:
        推薦度:
        標(biāo)簽: 安卓 android and
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 精品久久免费视频| 亚洲视频小说图片| 亚洲国产精品无码久久久秋霞2| 中文字幕亚洲综合小综合在线 | 亚洲乱色熟女一区二区三区丝袜 | 亚洲天堂一区二区三区四区| 成人国产网站v片免费观看| 免费无码av片在线观看| 国产精品四虎在线观看免费 | 国产精品免费_区二区三区观看| 亚洲精品亚洲人成在线| 国产成人精品免费直播| 成年网站免费入口在线观看| 亚洲精品乱码久久久久久中文字幕| 中文字幕乱码一区二区免费| 亚洲一区二区三区四区在线观看| 特黄aa级毛片免费视频播放| 亚洲国产中文字幕在线观看| 亚洲午夜福利在线视频| 777成影片免费观看| 久久精品国产99国产精品亚洲| 成人毛片免费视频| 亚洲啪啪免费视频| 免费黄网站在线看| 亚洲一线产区二线产区精华| 免费亚洲视频在线观看| 中国性猛交xxxxx免费看| 亚洲精品国产日韩无码AV永久免费网| 国产精品免费αv视频| 亚洲精品无码99在线观看| 13小箩利洗澡无码视频网站免费| 亚洲第一页在线视频| 久久久久久曰本AV免费免费| 亚洲av不卡一区二区三区| 精品无码一级毛片免费视频观看 | 特黄特色大片免费| 亚洲精品456在线播放| 免费一看一级毛片全播放| 国产精品免费一区二区三区四区| 亚洲美女又黄又爽在线观看| 91在线视频免费播放|