17

редактирует 01/02/2016: ошибка должна быть решена путем применения кода, предоставленный Android Team: https://stackoverflow.com/a/35132144/3397345CoordinatorLayout Строка состояния обивка исчезает из ViewPager 2-й страницы

редактирует 27/01/2016: Ошибка все еще не решена в v23.1.1. Решения, предоставляемые до сих пор, не дают прозрачной строки статуса (которая является целью этого макета) или слишком сложны. Новый экран рекорд жука доступен здесь: https://www.youtube.com/watch?v=76IxhlUx8MQ

редактируют 23/07/2015: Поддержка Библиотека проектирования v22.2.1 не исправить :-(Кроме того, это происходит на панели инструментов быстрого возврата на MainActivity

редактирует 28/07/2015: Связанного вопрос:. CoordinatorLayout status bar padding disappears during fragment transactions

из примера хранилища https://github.com/chrisbanes/cheesesquare я реализовал ViewPager на Detail деятельности Это работает, но StatusBar исчезает из 2-я страницы, как вы видите, в изображение только в устройствах Lollipop, Любая идея? я использую android:fitsSystemWindows="true" но он работает только на первой странице :-(

enter image description here

activity_detail_viewpager.xml если я ставлю здесь fitsSystemWindows, StatusBar не прозрачны больше, но это работает (строка состояния отступы не потерял). Но я хотел бы его прозрачным!

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/main_content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:overScrollMode="ifContentScrolls"/> 

</android.support.design.widget.CoordinatorLayout> 

activity_detail_fragment.xml

<CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/detail_backdrop_height" 
     android:fitsSystemWindows="true" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsing_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed" 
      app:contentScrim="?attr/colorPrimary" 
      app:expandedTitleMarginStart="48dp" 
      app:expandedTitleMarginEnd="64dp"> 

      <ImageView 
       android:id="@+id/back_item" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:scaleType="centerCrop" 
       android:fitsSystemWindows="true" 
       app:layout_collapseMode="parallax" /> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
       app:layout_collapseMode="pin" /> 

     </android.support.design.widget.CollapsingToolbarLayout> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:paddingTop="24dp"> 

      <android.support.v7.widget.CardView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_margin="@dimen/card_margin"> 

       ... 

      </android.support.v7.widget.CardView> 

      ... 

     </LinearLayout> 

    </android.support.v4.widget.NestedScrollView> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_margin="@dimen/fab_margin" 
     android:clickable="true" 
     android:src="@drawable/ic_discuss" 
     app:layout_anchor="@id/appbar" 
     app:layout_anchorGravity="bottom|end" 
     app:borderWidth="0dp"/> 

</android.support.design.widget.CoordinatorLayout> 

style.xml v21

<resources> 
    <style name="AppTheme" parent="AppTheme.Base"> 
     <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
     <item name="android:statusBarColor">@android:color/transparent</item> 
    </style> 
</resources> 
+1

Опубликовано вопрос в Google: https://code.google.com/p/android/issues/detail?id=180492 - выпуск подтверждается также другими госзакупками – Davidea

ответ

10

Решение, предлагаемое группой Android в ответ на мой сообщенный дефект.Этот код должен, наконец, работать.

ViewPager mViewPager; 

ViewCompat.setOnApplyWindowInsetsListener(mViewPager, 
     new OnApplyWindowInsetsListener() { 
    @Override 
    public WindowInsetsCompat onApplyWindowInsets(View v, 
      WindowInsetsCompat insets) { 
     insets = ViewCompat.onApplyWindowInsets(v, insets); 
     if (insets.isConsumed()) { 
      return insets; 
     } 

     boolean consumed = false; 
     for (int i = 0, count = mViewPager.getChildCount(); i < count; i++) { 
      ViewCompat.dispatchApplyWindowInsets(mViewPager.getChildAt(i), insets); 
      if (insets.isConsumed()) { 
       consumed = true; 
      } 
     } 
     return consumed ? insets.consumeSystemWindowInsets() : insets; 
    } 
}); 
+0

Удивительная благодарность! – Ale

0

я столкнулся с подобным вопросом (с использованием v23.0.1). В моем случае проблема возникает и на первой странице. Обходной путь, на котором я остановился, состоял в том, чтобы отрегулировать заполнение и высоту панели инструментов при создании фрагмента.

// in onCreateView: adjust toolbar padding 
    Toolbar toolbar = (Toolbar) mRootView.findViewById(R.id.toolbar); 
    toolbar.setPadding(0, getStatusBarHeight(), 0, 0); 
    toolbar.getLayoutParams().height = toolbar.getLayoutParams().height + getStatusBarHeight(); 

    return mRootView; 
} 

public int getStatusBarHeight() { 
    int result = 0; 
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
     result = getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
} 
+0

Ницца, это начало, и что-то начинается чтобы работать (как исправление), но прокручивая влево и вправо, на некоторых страницах бывает, что это дополнение теперь лишнее, есть ли способ узнать, добавлено ли заполнение строки состояния, чтобы избежать добавления высоты строки состояния? Мы должны получить реальную высоту строки состояния. Я полагаю. – Davidea

-1

Кажется, что решение это просто

Вы

android:fitsSystemWindows="true" 

В фрагменте CoordinateLayoutView

удалить его отсюда и положить в корневом зрении данного вида деятельности.

Это должно теперь все работы

+0

Привет, цель состоит в том, чтобы он был прозрачным, поэтому это решение не может быть принято. Я думаю, что дизайн-библиотека работает для нормальных и простых случаев, в то время как в сложных случаях (и не только это описано в моем вопросе) возникают большие проблемы. Я почти там, чтобы отказаться от этой библиотеки в случае viewpager. – Davidea

+0

, пожалуйста, покажите мне код, у меня есть прозрачная/статусная строка, если это изображение на googlecode, тогда похоже, что у вас может быть android: fitsSystemWindows = "true" в нескольких местах – RuAware

3

Как sidecarcat, я столкнулся с подобным вопросом (с использованием v23.1.1). Я размещаю здесь обходное решение, используя код sidecarcat и добавляя некоторый код для удаления суперплоской прокладки в некоторых случаях.

// in onCreateView: adjust toolbar padding 
    final int initialToolbarHeight = mToolbar.getLayoutParams().height; 
    final int initialStatusBarHeight = getStatusBarHeight(); 
    mToolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int[] locToolbar = new int[2]; 
      mToolbar.getLocationOnScreen(locToolbar); 
      int yToolbar = locToolbar[1]; 
      int topPaddingToolbar = mToolbar.getPaddingTop(); 
      if (isAdded()) { 
       //normal case : system status bar padding on toolbar : yToolbar = initialStatusBarHeight && topPaddingToolbar = 0 
       //abnormal case : no system status bar padding on toolbar -> toolbar behind status bar => add custom padding 
       if (yToolbar != initialStatusBarHeight && topPaddingToolbar == 0) { 
        mToolbar.setPadding(0, initialStatusBarHeight, 0, 0); 
        mToolbar.getLayoutParams().height = initialToolbarHeight + initialStatusBarHeight; 
       } 
       //abnormal case : system status bar padding and custom padding on toolbar -> toolbar with padding too large => remove custom padding 
       else if (yToolbar == initialStatusBarHeight && topPaddingToolbar == initialStatusBarHeight) { 
        mToolbar.setPadding(0, 0, 0, 0); 
        mToolbar.getLayoutParams().height = initialToolbarHeight; 
       } 
      } 
     } 
    }); 

    return mRootView; 
} 

public int getStatusBarHeight() { 
    int result = 0; 
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
     result = getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^