2015-03-27 3 views
45

Я искал документацию , но только нашел это: Link. Используется для изготовления бара полупрозрачный. То, что я пытаюсь сделать, это сделать строку состояния полностью прозрачна (как показано на рисунке ниже) и сделать его обратную совместимость для APK < 19: enter image description hereAndroid Полностью прозрачная панель состояния?

Мой styles.xml:

<resources xmlns:tools="http://schemas.android.com/tools"> 
 

 
    <style name="AppTheme" parent="Theme.AppCompat.Light"> 
 
    <item name="android:actionBarStyle">@style/ThemeActionBar</item> 
 
    <item name="android:windowActionBarOverlay">true</item> 
 
    <!-- Support library compatibility --> 
 
    <item name="actionBarStyle">@style/ThemeActionBar</item> 
 
    <item name="windowActionBarOverlay">true</item> 
 
    </style> 
 

 
    <style name="ThemeActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid"> 
 
    <item name="android:background"> @null </item> 
 
    <!-- Support library compatibility --> 
 
    <item name="background">@null</item> 
 
    <item name="android:displayOptions"> showHome | useLogo</item> 
 
    <item name="displayOptions">showHome|useLogo</item> 
 

 
    </style> 
 

 
</resources>

То, что я был в состоянии сделать:

enter image description here

ответ

129

Все, что вам нужно сделать, это установить эти свойства в вашей теме:

<item name="android:windowTranslucentStatus">true</item> 
<item name="android:windowTranslucentNavigation">true</item> 

Ваш макет деятельности/контейнера вы хотите иметь бар прозрачный статус необходим этот набор свойств:

android:fitsSystemWindows="true" 

Это как правило, невозможно выполнить это наверняка на pre-kitkat, похоже, вы можете это сделать but some strange code makes it so.

EDIT: Я бы порекомендовал эту библиотеку: https://github.com/jgilfelt/SystemBarTint для управления цветом строки состояния перед леллопопом.

Ну после долгих раздумий я узнал, что ответ полностью отключить полупрозрачность или любого цвета помещается на панели строки состояния и навигации для леденца, чтобы установить этот флаг на окне:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      Window w = getWindow(); // in Activity's onCreate() for instance 
      w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 
     } 

Нет другая тема-динг является необходимым, оно производит что-то вроде этого:

enter image description here

+0

Я не хочу столкнуться с проблемами или ошибки, когда я говорю обратной совместимости я имею в виду, что он просто не будет прозрачным и не нарушит приложение. Извините, что не описал это в первую очередь. –

+0

О, это все, что произойдет, если вы установите эти 3 свойства выше, строка состояния будет прозрачной на> API 19, и нормальная на

+5

Я использовал код, а затем добавил изображение в качестве фона, а затем добавил 'android : fitsSystemWindows = "true" для my activity_main.xml. Системные решетки являются прозрачными и непрозрачными. –

2

используя этот код в Уре XML, вы будете иметь возможность увидеть шкалу времени в Уре деятельности:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true"> 
0

android:fitsSystemWindows="true" только работа на v21. Мы можем установить его в теме xml или в родительском макете, таком как LinearLayout или в CoordinateLayout. Для ниже v21 мы не можем добавить этот флаг. Пожалуйста, создайте другую папку с различными файлами style.xml согласно вашей потребности.

2

использование андроида: fitsSystemWindows = "ложь" в вашей верхней макете

3

Вы можете использовать внешнюю библиотеку StatusBarUtil:

добавить на уровне модуля build.gradle:

compile 'com.jaeger.statusbarutil:library:1.4.0' 

Затем вы можете использовать следующее использование для деятельности, чтобы сделать панель состояния прозрачной:

StatusBarUtil.setTransparent(Activity activity) 

Пример:

transparent status bar on Lollipop and KitKat

0
<item name="android:statusBarColor" tools:targetApi="lollipop">@android:color/transparent</item> 
      <!--<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>--> 

Dont использовать windowLightStatusBar использовать вместо statusBarColor = @android:color/transparent

0

Чтобы нарисовать макет под статусной:

значения/styles.xml

<item name="android:windowTranslucentStatus">true</item> 

значения-v21/styles.xml

<item name="android:windowDrawsSystemBarBackgrounds">true</item> 
<item name="android:statusBarColor">@color/colorPrimaryDark</item> 

Использование CoordinatorLayout/DrawerLayout, которые уже заботиться о параметре fitsSystemWindows или создать свой собственный макет нравится это:

public class FitsSystemWindowConstraintLayout extends ConstraintLayout { 

    private Drawable mStatusBarBackground; 
    private boolean mDrawStatusBarBackground; 

    private WindowInsetsCompat mLastInsets; 

    private Map<View, int[]> childsMargins = new HashMap<>(); 

    public FitsSystemWindowConstraintLayout(Context context) { 
     this(context, null); 
    } 

    public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public FitsSystemWindowConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 

     if (ViewCompat.getFitsSystemWindows(this)) { 
      ViewCompat.setOnApplyWindowInsetsListener(this, new android.support.v4.view.OnApplyWindowInsetsListener() { 
       @Override 
       public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) { 
        FitsSystemWindowConstraintLayout layout = (FitsSystemWindowConstraintLayout) view; 
        layout.setChildInsets(insets, insets.getSystemWindowInsetTop() > 0); 
        return insets.consumeSystemWindowInsets(); 
       } 
      }); 
      setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
      TypedArray typedArray = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimaryDark}); 
      try { 
       mStatusBarBackground = typedArray.getDrawable(0); 
      } finally { 
       typedArray.recycle(); 
      } 
     } else { 
      mStatusBarBackground = null; 
     } 
    } 

    public void setChildInsets(WindowInsetsCompat insets, boolean draw) { 
     mLastInsets = insets; 
     mDrawStatusBarBackground = draw; 
     setWillNotDraw(!draw && getBackground() == null); 

     for (int i = 0; i < getChildCount(); i++) { 
      View child = getChildAt(i); 
      if (child.getVisibility() != GONE) { 
       if (ViewCompat.getFitsSystemWindows(this)) { 
        ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams) child.getLayoutParams(); 

        if (ViewCompat.getFitsSystemWindows(child)) { 
         ViewCompat.dispatchApplyWindowInsets(child, insets); 
        } else { 
         int[] childMargins = childsMargins.get(child); 
         if (childMargins == null) { 
          childMargins = new int[]{layoutParams.leftMargin, layoutParams.topMargin, layoutParams.rightMargin, layoutParams.bottomMargin}; 
          childsMargins.put(child, childMargins); 
         } 
         if (layoutParams.leftToLeft == LayoutParams.PARENT_ID) { 
          layoutParams.leftMargin = childMargins[0] + insets.getSystemWindowInsetLeft(); 
         } 
         if (layoutParams.topToTop == LayoutParams.PARENT_ID) { 
          layoutParams.topMargin = childMargins[1] + insets.getSystemWindowInsetTop(); 
         } 
         if (layoutParams.rightToRight == LayoutParams.PARENT_ID) { 
          layoutParams.rightMargin = childMargins[2] + insets.getSystemWindowInsetRight(); 
         } 
         if (layoutParams.bottomToBottom == LayoutParams.PARENT_ID) { 
          layoutParams.bottomMargin = childMargins[3] + insets.getSystemWindowInsetBottom(); 
         } 
        } 
       } 
      } 
     } 

     requestLayout(); 
    } 

    public void setStatusBarBackground(Drawable bg) { 
     mStatusBarBackground = bg; 
     invalidate(); 
    } 

    public Drawable getStatusBarBackgroundDrawable() { 
     return mStatusBarBackground; 
    } 

    public void setStatusBarBackground(int resId) { 
     mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null; 
     invalidate(); 
    } 

    public void setStatusBarBackgroundColor(@ColorInt int color) { 
     mStatusBarBackground = new ColorDrawable(color); 
     invalidate(); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (mDrawStatusBarBackground && mStatusBarBackground != null) { 
      int inset = mLastInsets != null ? mLastInsets.getSystemWindowInsetTop() : 0; 
      if (inset > 0) { 
       mStatusBarBackground.setBounds(0, 0, getWidth(), inset); 
       mStatusBarBackground.draw(canvas); 
      } 
     } 
    } 
} 

main_activity.xml

<FitsSystemWindowConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <ImageView 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:fitsSystemWindows="true" 
     android:scaleType="centerCrop" 
     android:src="@drawable/toolbar_background" 
     app:layout_constraintBottom_toBottomOf="@id/toolbar" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="0dp" 
     android:layout_height="?attr/actionBarSize" 
     android:background="@android:color/transparent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:gravity="center" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toBottomOf="@id/toolbar"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:text="Content" 
      android:textSize="48sp" /> 
    </LinearLayout> 
</FitsSystemWindowConstraintLayout> 

Результат:

Screenshot

1

Просто добавьте эту строку кода в основной файл Java:

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 
); 
Смежные вопросы