• 火红彩票网官网

  • 火红彩票网官网

  • 火红彩票网官网

  • 火红彩票网官网

火红彩票网官网

作者︰熊,我(wo)-  發布日期︰2020-02-18 12:07:29
Tag標簽︰別用(yong)  狀(zhuang)態  
  • 一(yi)、ToolBar

    1、在build.gradle中(zhong)添加依(yi)賴(lai),例(li)如(ru)︰

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

    2、去掉應用(yong)的ActionBar。可以是修改主題theme為“NoActionBar”,例(li)如(ru)︰

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

    或者不修改主題為'NoActionBar',而在主題的style下(xia),添加︰

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

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

    其實,剛學的時(shi)候,感覺(jue)很納悶,怎麼又(you)多了個TitleBar?後來查了很久才發現,3.0以前,狀(zhuang)態欄下(xia)面xian)氖潛晏飫福ㄖ荒芟允頸晏獾壬倭啃畔xi)),3.0以後就(jiu)變成了應用(yong)欄,也就(jiu)是ActionBar。

    另外,我(wo)測試的時(shi)候,activity是繼承于AppCompatActivity,主題是AppCompat類(lei)型(xing)的。這種情(qing)況(kuang)下(xia),必須要像上面那樣(yang)寫(xie)才有效果,少寫(xie)或值不同的話(hua),要麼沒效果,要麼報錯。

    最後,上面兩個屬(shu)性的說明(ming)可在android.R.attr這個類(lei)中(zhong)查看。

    3、在xml中(zhong)為ToolBar添加屬(shu)性

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

    fitsSystemWindows是ToolBar實現沉浸式狀(zhuang)態欄的關鍵,其大概情(qing)況(kuang)是,如(ru)果設為true,就(jiu)會調整這個view去留一(yi)些空(kong)間給(gei)系統窗口(kou),如(ru)果不設置(zhi)或設為false,ToolBar就(jiu)會和(he)狀(zhuang)態欄重疊在一(yi)起(qi)。

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

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

    4、在java中(zhong)添加判斷sdk版本的代碼並在用(yong)戶(hu)的系統是4.4及以上時(shi)設置(zhi)狀(zhuang)態欄為透明(ming)

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

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

    因為設置(zhi)狀(zhuang)態欄為透明(ming)的這個屬(shu)性,要4.4以上才能使(shi)用(yong),所(suo)以4.4以下(xia)的系統是不能夠(gou)實現沉浸式狀(zhuang)態欄的。而在4.4到5.0的系統中(zhong),狀(zhuang)態欄是全透明(ming)的mo) 簿jiu)是它的顏色(se)會跟你的ToolBar和(he)自定義導航欄的顏色(se)一(yi)樣(yang)。而在5.0以上的系統中(zhong),則是半透明(ming)的mo) 簿jiu)看起(qi)來會比較深暗。

    而我(wo)在6.0的系統上測試時(shi),發現這一(yi)步(bu)沒設置(zhi)和(he)設置(zhi)了的mo) 有?峽矗 鵓jiu)是沒設置(zhi)時(shi)狀(zhuang)態欄顏色(se)淺(qian)一(yi)點,而且ToolBar的padding top為0,而設置(zhi)了的顏色(se)就(jiu)深一(yi)點,padding top為狀(zhuang)態欄的高(gao)度。具體有什麼影(ying)響,還(huai)不清楚。但這會讓自定義導航的外觀變形,它會增加狀(zhuang)態欄的高(gao)度,但又(you)zhi)揮腥謎獠糠鐘胱zhuang)態欄重疊,就(jiu)導致(zhi)效果變形。

    5、最後在java中(zhong)添加

    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'/>

     效果圖(tu)(Android 6.0)︰

    二、自定義導航欄TopBar

    1、設置(zhi)窗口(kou)為無標題,上面xian)步(bu)中(zhong)的兩個方法(fa)都(du)可以實現,或者是在java中(zhong)添加如(ru)下(xia)代碼︰

     requestWindowFeature(Window.FEATURE_NO_TITLE);

    注(zhu)意在添加這句代碼時(shi),確(que)保是在加載(zai)布局內容之前,也就(jiu)是onCreate的setContentView之前。

    另外,我(wo)發現如(ru)果該activity是繼承AppCompatActivity的話(hua),只寫(xie)上面xian)惱餼浯朧敲揮斜浠 模(mo) 允鏡幕huai)是ActionBar。但如(ru)果是繼承FragmentActivity的話(hua),就(jiu)有效果,也就(jiu)說上面xian)步(bu)中(zhong)的第二個方法(fa),只添加其中(zhong)任wo)庖yi)個屬(shu)性都(du)是可以的。至于是什麼原因,我(wo)yi)姑慌 宄/p>

    2、同上面xian)步(bu),判斷系統版本並按需設置(zhi)狀(zhuang)態欄為透明(ming)

    3、獲取狀(zhuang)態欄的高(gao)度

     protected int getStatusHeight() { try {  Class<?> c = Class.forName('com.android.internal.R$dimen'); // 獲得與字(zi)符串對應的Class對象  Object object = c.newInstance(); // 創建這個Class的實例(li)對象  Field field = c.getField('status_bar_height'); // 拿(na)到字(zi)符串對應的變量  int x = Integer.parseInt(field.get(object).toString()); // 通過(guo)這個實例(li)對象拿(na)到這個變量的值,再轉換類(lei)型(xing),最後轉為整型(xing),變為一(yi)個資源id  return getResources().getDimensionPixelSize(x); } catch (Exception e) {  e.printStackTrace(); } return 0; }

    這部分代碼是利用(yong)Java的反(fan)射機制來實現的mo) 蛭 飧nternal包默認會被(bei)sdk/platforms/android-version中(zhong)的android.jar給(gei)移除掉,所(suo)以無法(fa)直接調用(yong)或查看這個包中(zhong)的類(lei)。如(ru)果要使(shi)用(yong)的話(hua),可以借助這個開源項目https://github.com/anggrayudi/android-hidden-api。

    4、獲取自定義TopBar的高(gao)度並修改布局參數

     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的布局文件(jian)中(zhong),其父布局是LinearLayout,而TopBar的父布局是RelativeLayout,所(suo)以這里(li)先要轉成ViewGroup,等getLayoutParams時(shi),再轉成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>

    因為這個布局的高(gao)度會在代碼中(zhong)動(dong)態地(di)修改mo) 9dp加上狀(zhuang)態欄的高(gao)度,所(suo)以只有一(yi)個層(ceng)級的結構的話(hua),那導航欄的內容就(jiu)會往(wang)上偏(pian)。所(suo)以要嵌(qian)套多一(yi)層(ceng)來維(wei)持導航欄的高(gao)度,同時(shi)在最外層(ceng)的布局中(zhong),添加android:gravity='bottom'這個屬(shu)性來保證導航欄不往(wang)上偏(pian)。

    效果圖(tu)(Android 6.0)︰

About IT165 -廣告服(fu)務 -隱私聲(sheng)明(ming) -版權申(shen)明(ming) -免責條(tiao)款 -網(wang)站地(di)圖(tu) -網(wang)友投稿 -聯系方式
本站內容來自于互(hu)聯網(wang),僅供用(yong)于網(wang)絡技術學習,學習中(zhong)請遵(zun)循(xun)相(xiang)關法(fa)律法(fa)規
火红彩票网官网 | 下一页