最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分別用ToolBar和自定義導(dǎo)航欄實(shí)現(xiàn)沉浸式狀態(tài)欄

 更新時(shí)間:2017年01月12日 11:25:26   作者:熊,我-  
本文主要介紹了分別用ToolBar和自定義導(dǎo)航欄實(shí)現(xiàn)沉浸式狀態(tài)欄的方法步驟,具有一定的參考價(jià)值,下面跟著小編一起來看下吧

一、ToolBar

1、在build.gradle中添加依賴,例如:

compile 'com.android.support:appcompat-v7:23.4.0'

2、去掉應(yīng)用的ActionBar。可以是修改主題theme為“NoActionBar”,例如:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

或者不修改主題為"NoActionBar",而在主題的style下,添加:

 <item name="windowNoTitle">true</item>
 <item name="windowActionBar">false</item>

第二個(gè)屬性代表是否用ActionBar代替TitleBar。

其實(shí),剛學(xué)的時(shí)候,感覺很納悶,怎么又多了個(gè)TitleBar?后來查了很久才發(fā)現(xiàn),3.0以前,狀態(tài)欄下面的是標(biāo)題欄(只能顯示標(biāo)題等少量信息),3.0以后就變成了應(yīng)用欄,也就是ActionBar。

另外,我測試的時(shí)候,activity是繼承于AppCompatActivity,主題是AppCompat類型的。這種情況下,必須要像上面那樣寫才有效果,少寫或值不同的話,要么沒效果,要么報(bào)錯(cuò)。

最后,上面兩個(gè)屬性的說明可在android.R.attr這個(gè)類中查看。

3、在xml中為ToolBar添加屬性

 android:fitsSystemWindows="true"
 android:minHeight="?attr/actionBarSize"

fitsSystemWindows是ToolBar實(shí)現(xiàn)沉浸式狀態(tài)欄的關(guān)鍵,其大概情況是,如果設(shè)為true,就會(huì)調(diào)整這個(gè)view去留一些空間給系統(tǒng)窗口,如果不設(shè)置或設(shè)為false,ToolBar就會(huì)和狀態(tài)欄重疊在一起。

而第二個(gè)屬性中,它的值全寫是"?android:attr/actionBarSize",其意思是引用當(dāng)前主題中的actionBarSize這個(gè)屬性。更多相關(guān)說明可查看官方文檔中Accessing Resources的部分。

上面兩個(gè)屬性可在android.view.View這個(gè)類中查看。

4、在java中添加判斷sdk版本的代碼并在用戶的系統(tǒng)是4.4及以上時(shí)設(shè)置狀態(tài)欄為透明

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

無論是ToolBar,還是自定義導(dǎo)航欄,這個(gè)操作都是實(shí)現(xiàn)沉浸式狀態(tài)欄的關(guān)鍵。

因?yàn)樵O(shè)置狀態(tài)欄為透明的這個(gè)屬性,要4.4以上才能使用,所以4.4以下的系統(tǒng)是不能夠?qū)崿F(xiàn)沉浸式狀態(tài)欄的。而在4.4到5.0的系統(tǒng)中,狀態(tài)欄是全透明的,也就是它的顏色會(huì)跟你的ToolBar和自定義導(dǎo)航欄的顏色一樣。而在5.0以上的系統(tǒng)中,則是半透明的,也就看起來會(huì)比較深暗。

而我在6.0的系統(tǒng)上測試時(shí),發(fā)現(xiàn)這一步?jīng)]設(shè)置和設(shè)置了的,從效果上看,區(qū)別就是沒設(shè)置時(shí)狀態(tài)欄顏色淺一點(diǎn),而且ToolBar的padding top為0,而設(shè)置了的顏色就深一點(diǎn),padding top為狀態(tài)欄的高度。具體有什么影響,還不清楚。但這會(huì)讓自定義導(dǎo)航的外觀變形,它會(huì)增加狀態(tài)欄的高度,但又沒有讓這部分與狀態(tài)欄重疊,就導(dǎo)致效果變形。

5、最后在java中添加

setSupportActionBar(mToolbar);

ToolBar的布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:id="@+id/tool_bar"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="@color/colorPrimary"
 android:elevation="4dp"
 android:fitsSystemWindows="true"
 android:minHeight="?android:attr/actionBarSize"
 app:title="ToolBar"
 app:subtitle="toolbar"/>

 效果圖(Android 6.0):

二、自定義導(dǎo)航欄TopBar

1、設(shè)置窗口為無標(biāo)題,上面第2步中的兩個(gè)方法都可以實(shí)現(xiàn),或者是在java中添加如下代碼:

requestWindowFeature(Window.FEATURE_NO_TITLE);

注意在添加這句代碼時(shí),確保是在加載布局內(nèi)容之前,也就是onCreate的setContentView之前。在《Android群英傳》“Android控件架構(gòu)”,這一節(jié)中解釋了為什么requestWindowFeature()需要在setContentView()之前。

另外,我發(fā)現(xiàn)如果該activity是繼承AppCompatActivity的話,只寫上面的這句代碼是沒有變化的,顯示的還是ActionBar。但如果是繼承FragmentActivity的話,就有效果,也就說上面第2步中的第二個(gè)方法,只添加其中任意一個(gè)屬性都是可以的。至于是什么原因,我還沒弄清楚。

2、同上面第4步,判斷系統(tǒng)版本并按需設(shè)置狀態(tài)欄為透明

3、獲取狀態(tài)欄的高度

protected int getStatusHeight() {
 try {
 Class<?> c = Class.forName("com.android.internal.R$dimen"); // 獲得與字符串對應(yīng)的Class對象
 Object object = c.newInstance(); // 創(chuàng)建這個(gè)Class的實(shí)例對象
 Field field = c.getField("status_bar_height"); // 拿到字符串對應(yīng)的變量
 int x = Integer.parseInt(field.get(object).toString()); // 通過這個(gè)實(shí)例對象拿到這個(gè)變量的值,再轉(zhuǎn)換類型,最后轉(zhuǎn)為整型,變?yōu)橐粋€(gè)資源id
 return getResources().getDimensionPixelSize(x);
 } catch (Exception e) {
 e.printStackTrace();
 }
 return 0;
}

這部分代碼是利用Java的反射機(jī)制來實(shí)現(xiàn)的,因?yàn)檫@個(gè)internal包默認(rèn)會(huì)被sdk/platforms/android-version中的android.jar給移除掉,所以無法直接調(diào)用或查看這個(gè)包中的類。如果要使用的話,可以借助這個(gè)開源項(xiàng)目https://github.com/anggrayudi/android-hidden-api。

4、獲取自定義TopBar的高度并修改布局參數(shù)

protected void setStatusBar() {
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
 final ViewGroup viewGroup = (ViewGroup) findViewById(R.id.top_bar);
 final int statusHeight = getStatusHeight();
 viewGroup.post(new Runnable() {
  @Override
  public void run() {
  int topBarHeight = viewGroup.getHeight();
  LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) viewGroup.getLayoutParams();
  layoutParams.height = statusHeight + topBarHeight;
  viewGroup.setLayoutParams(layoutParams);
  }
 });
 }
}

因?yàn)樵趇nclude這個(gè)TopBar的布局文件中,其父布局是LinearLayout,而TopBar的父布局是RelativeLayout,所以這里先要轉(zhuǎn)成ViewGroup,等getLayoutParams時(shí),再轉(zhuǎn)成LinearLayout.LayoutParams。

TopBar的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/top_bar"
 android:layout_width="match_parent"
 android:layout_height="49dp"
 android:background="@color/colorPrimary"
 android:gravity="bottom">
 <RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="49dp">
 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:text="@string/app_name"
  android:textSize="24sp"
  android:textColor="#ffffff"/>
 </RelativeLayout>
</RelativeLayout>

因?yàn)檫@個(gè)布局的高度會(huì)在代碼中動(dòng)態(tài)地修改,即49dp加上狀態(tài)欄的高度,所以只有一個(gè)層級(jí)的結(jié)構(gòu)的話,那導(dǎo)航欄的內(nèi)容就會(huì)往上偏。所以要嵌套多一層來維持導(dǎo)航欄的高度,同時(shí)在最外層的布局中,添加android:gravity="bottom"這個(gè)屬性來保證導(dǎo)航欄不往上偏。

效果圖(Android 6.0):

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Android開發(fā)中Listview動(dòng)態(tài)加載數(shù)據(jù)的方法示例

    Android開發(fā)中Listview動(dòng)態(tài)加載數(shù)據(jù)的方法示例

    這篇文章主要介紹了Android開發(fā)中Listview動(dòng)態(tài)加載數(shù)據(jù)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android操作ListView界面布局與數(shù)據(jù)動(dòng)態(tài)更新相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10
  • Android實(shí)現(xiàn)手勢劃定區(qū)域裁剪圖片

    Android實(shí)現(xiàn)手勢劃定區(qū)域裁剪圖片

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)手勢劃定區(qū)域裁剪圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android 10.0截屏流程詳解

    Android 10.0截屏流程詳解

    這篇文章主要為大家介紹了Android 10.0截屏流程詳解,通常未通過特殊定制的 Android 系統(tǒng),截屏都是經(jīng)過同時(shí)按住音量下鍵和電源鍵來截屏,本篇文章就只討論使用這些特殊按鍵來進(jìn)行截屏
    2023-06-06
  • Android基于Service的音樂播放器

    Android基于Service的音樂播放器

    這篇文章主要為大家詳細(xì)介紹了Android基于Service的音樂播放器,本文開發(fā)一個(gè)基于Service的音樂播放器,音樂由后臺(tái)運(yùn)行的Service負(fù)責(zé)播放,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android控件之GridView用法實(shí)例分析

    Android控件之GridView用法實(shí)例分析

    這篇文章主要介紹了Android控件之GridView用法,通過繪制九宮格的實(shí)例形式分析了GridView可滾動(dòng)網(wǎng)格的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Android使用http實(shí)現(xiàn)注冊登錄功能

    Android使用http實(shí)現(xiàn)注冊登錄功能

    這篇文章主要為大家詳細(xì)介紹了Android使用http實(shí)現(xiàn)注冊登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解Android中Activity運(yùn)行時(shí)屏幕方向與顯示方式

    詳解Android中Activity運(yùn)行時(shí)屏幕方向與顯示方式

    本文主要對如何控制Android中Activity運(yùn)行時(shí)屏幕方向與顯示方式進(jìn)行詳細(xì)全面的實(shí)例講解。具有很好的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12
  • Android實(shí)現(xiàn)多段顏色進(jìn)度條效果

    Android實(shí)現(xiàn)多段顏色進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)多段顏色進(jìn)度條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Android使用jni調(diào)用c++/c方法詳解

    Android使用jni調(diào)用c++/c方法詳解

    這篇文章主要介紹了Android使用jni調(diào)用c++/c方法詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Android TabHost組件使用方法詳解

    Android TabHost組件使用方法詳解

    這篇文章主要以實(shí)例講解的方式為大家詳細(xì)介紹了Android TabHost組件的使用方法,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論

贵德县| 平远县| 日照市| 和平区| 广宁县| 津市市| 广东省| 镇原县| 察雅县| 永丰县| 汶川县| 惠东县| 炎陵县| 都江堰市| 瓮安县| 峨眉山市| 永定县| 东丽区| 贵州省| 托克托县| 互助| 南投县| 遂溪县| 西丰县| 虞城县| 建宁县| 潞西市| 张北县| 辰溪县| 满洲里市| 宁南县| 巴楚县| 弥勒县| 西盟| 民权县| 贞丰县| 台东市| 沂南县| 隆安县| 新营市| 渭南市|