2017-06-29 82 views
1

我已經用盡了關於以編程方式更改狀態欄顏色的每篇文章,但其中沒有一篇涉及此特定情況。Android - 在Viewpager中的片段之間切換狀態欄透明度

我有一個Activity包含一個ViewPager和一個BottomNavigationView。 ViewPager持有三個碎片,BottomNavigationView在平滑滾動關閉的情況下在它們之間移動。

由於三個碎片中的第一個是地圖,我希望狀態欄在顯示第一個碎片時是透明的,但在其他兩個碎片上恢復爲其不透明顏色。

下面是一些代碼,顯示了我試圖設置和恢復狀態欄狀態。

private class TabSelectedObserver implements Observer<Integer> { 
    @Override 
    public void onChanged(@Nullable Integer selectedTab) { 
     if (selectedTab != null) { 
      activityMainBinding.mainPager.setCurrentItem(selectedTab, false); 
      switch (selectedTab) { 
       case 0: 
        applyTransparentStatusBarTheme(); 
        break; 
       default: 
        applyOpaqueStatusBarTheme(); 
        break; 
      } 
     } 
    } 
} 

private void applyTransparentStatusBarTheme() { 
    hideSystemUi(); 
    getWindow().setStatusBarColor(ContextCompat.getColor(this, android.R.color.transparent)); 
} 

private void applyOpaqueStatusBarTheme() { 
    showSystemUi(); 
    getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.rippallete_700)); 
} 

private void hideSystemUi() { 
    // Set flags for hiding status bar and navigation bar 

    mSystemUiVisibility = mSystemUiVisibility 
      | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; 
    getWindow().getDecorView().setSystemUiVisibility(mSystemUiVisibility); 
} 

private void showSystemUi() { 
    // Reset flags for hiding status bar and navigation bar 
    mSystemUiVisibility = mSystemUiVisibility 
      & ~View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; 
    getWindow().getDecorView().setSystemUiVisibility(mSystemUiVisibility); 
} 

Here's a gif showing the behavior I end up with

每一件事情我fitSystemWindows試過沒有產生我想要的結果。

如果任何人有任何建議,你會給每個片段一個單獨的狀態欄顏色,1是透明的,我真的很感激它。

回答

0

因此,假如您是根據什麼選項卡中,選擇你可以做一些類似的位置設置狀態欄的顏色:

private void updateStatusBarColour(int tabPosition) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 

     switch (tabPosition) { 
      case FIRST_TAB: 
      case SECOND_TAB: 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        mRootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 
       } 
       window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryLight)); 
       break; 
      case THIRD_TAB: 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        mRootView.setSystemUiVisibility(0); 
       } 
       window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimary)); 
       break; 
      case FOURTH_TAB: 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        mRootView.setSystemUiVisibility(0); 
       } 
       window.setStatusBarColor(ContextCompat.getColor(this, R.color.colorDarkTan)); 
       break; 
     } 
    } 
} 

注意,我所說的setSystemUiVisibilitymRootView,其中mRootView是包含ViewPager的根父視圖(或者包含Activity的根佈局)。該調用專門設置狀態欄的主題,以便狀態欄項目(如電池符號)可以在黑暗或淺色背景中顯示,具體取決於您最終設置的顏色。