欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分別用ToolBar和自定義導航欄實現沉浸式狀態(tài)欄

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

一、ToolBar

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

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

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

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

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

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

第二個屬性代表是否用ActionBar代替TitleBar。

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

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

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

3、在xml中為ToolBar添加屬性

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

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

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

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

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

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

無論是ToolBar,還是自定義導航欄,這個操作都是實現沉浸式狀態(tài)欄的關鍵。

因為設置狀態(tài)欄為透明的這個屬性,要4.4以上才能使用,所以4.4以下的系統(tǒng)是不能夠實現沉浸式狀態(tài)欄的。而在4.4到5.0的系統(tǒng)中,狀態(tài)欄是全透明的,也就是它的顏色會跟你的ToolBar和自定義導航欄的顏色一樣。而在5.0以上的系統(tǒng)中,則是半透明的,也就看起來會比較深暗。

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

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):

二、自定義導航欄TopBar

1、設置窗口為無標題,上面第2步中的兩個方法都可以實現,或者是在java中添加如下代碼:

requestWindowFeature(Window.FEATURE_NO_TITLE);

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

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

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

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

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

這部分代碼是利用Java的反射機制來實現的,因為這個internal包默認會被sdk/platforms/android-version中的android.jar給移除掉,所以無法直接調用或查看這個包中的類。如果要使用的話,可以借助這個開源項目https://github.com/anggrayudi/android-hidden-api。

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

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);
  }
 });
 }
}

因為在include這個TopBar的布局文件中,其父布局是LinearLayout,而TopBar的父布局是RelativeLayout,所以這里先要轉成ViewGroup,等getLayoutParams時,再轉成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>

因為這個布局的高度會在代碼中動態(tài)地修改,即49dp加上狀態(tài)欄的高度,所以只有一個層級的結構的話,那導航欄的內容就會往上偏。所以要嵌套多一層來維持導航欄的高度,同時在最外層的布局中,添加android:gravity="bottom"這個屬性來保證導航欄不往上偏。

效果圖(Android 6.0):

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • android開發(fā)教程之清除android數據緩存示例(清除本地數據緩存)

    android開發(fā)教程之清除android數據緩存示例(清除本地數據緩存)

    android清除本地數據緩存示例,主要功能清除內/外緩存,清除數據庫,清除sharedPreference,清除files和清除自定義目錄,需要的朋友可以參考下
    2014-02-02
  • Android Service服務詳細介紹及使用總結

    Android Service服務詳細介紹及使用總結

    這篇文章主要介紹了Android Service 服務的詳細資料,網上關于Android Service 服務的文章比較多,但是不是很全面,不夠細致,畢竟是Android 四大組件之一,重要性不用說,這里總結下,需要的朋友可以參考下
    2016-12-12
  • Android省電的秘密之JobScheduler

    Android省電的秘密之JobScheduler

    JobScheduler是Android L版本新引入的API,JobScheduler,顧名思義,是用來調度工作。工作被調度的條件包括網絡變化,充電插拔,周期執(zhí)行等。谷歌為什么要引入這個新的API呢?是為了省電而制定的一種規(guī)范。下面跟著小編一起來看下吧
    2017-02-02
  • Android中實現EditText密碼顯示隱藏的方法

    Android中實現EditText密碼顯示隱藏的方法

    這篇文章主要介紹了Android中實現EditText密碼顯示隱藏的方法,需要的朋友可以參考下
    2017-01-01
  • 如何使用Android注解處理器

    如何使用Android注解處理器

    這篇文章主要介紹了如何使用Android注解處理器,對注解處理器感興趣的同學,可以參考下
    2021-04-04
  • Android中ViewPager你所不知道的優(yōu)化技巧分享

    Android中ViewPager你所不知道的優(yōu)化技巧分享

    提到ViewPager想必各位同學一點都不陌生,它是Android中最常用的組件之一,這篇文章小編就帶大家一起來看看ViewPager一些新的優(yōu)化方式吧
    2024-04-04
  • ViewPager的setOnPageChangeListener方法詳解

    ViewPager的setOnPageChangeListener方法詳解

    這篇文章主要介紹了ViewPager的setOnPageChangeListener方法詳解,非常不錯,具有參考解決借鑒價值,需要的朋友可以參考下
    2016-12-12
  • Android studio報: java.lang.ExceptionInInitializerError 錯誤

    Android studio報: java.lang.ExceptionInInitializerError 錯誤

    本篇文章主要介紹了Android studio報: java.lang.ExceptionInInitializerError錯誤的解決方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Android-屏幕適配需要注意的地方總結

    Android-屏幕適配需要注意的地方總結

    需要注意一下幾個地方:盡量使用線性布局/盡量使用dip和sp,不要使用px/為不同的分辨率提供不同的布局文件和圖片,接下來為你詳細介紹下,感興趣的你可以參考下哈,希望可以幫助到你
    2013-03-03
  • Android仿簡書搜索框效果的示例代碼

    Android仿簡書搜索框效果的示例代碼

    本篇文章主要介紹了Android仿簡書搜索框效果的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論