17

EDIT của 2016/01/02: Bug nên được giải quyết bằng cách áp dụng mã được cung cấp bởi Android Đội bóng: https://stackoverflow.com/a/35132144/3397345CoordinatorLayout thanh trạng thái đệm biến mất khỏi ViewPager trang 2

EDIT của 27/01/2016: Lỗi vẫn chưa được giải quyết trong v23.1.1. Các giải pháp được cung cấp cho đến bây giờ không cung cấp thanh trạng thái trong suốt (đó là mục đích của bố cục này) hoặc quá phức tạp. Một màn hình-kỷ lục mới của lỗi này có sẵn ở đây: https://www.youtube.com/watch?v=76IxhlUx8MQ

EDIT của 23/07/2015: Hỗ trợ thiết kế Thư viện v22.2.1 không khắc phục được :-(Ngoài ra điều này xảy ra trên thanh công cụ trở lại nhanh chóng trên MainActivity

EDIT của 28/07/2015: Linked câu hỏi:. CoordinatorLayout status bar padding disappears during fragment transactions

từ kho dụ https://github.com/chrisbanes/cheesesquare tôi đã thực hiện các ViewPager trên hoạt động chi tiết Nó hoạt động, nhưng Statusbar biến mất khỏi trang thứ 2 như bạn thấy trong các hình ảnh chỉ trong các thiết bị Lollipop, Ý tưởng nào? tôi sử dụng android:fitsSystemWindows="true" nhưng nó chỉ hoạt động trên trang đầu tiên :-(

enter image description here

activity_detail_viewpager.xml nếu tôi đặt ở đây fitsSystemWindows, Statusbar là không minh bạch nữa, nhưng nó hoạt động (thanh trạng thái đệm là không bị mất). Nhưng tôi muốn nó trong suốt!

<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

văn vấn đề đến Google: https://code.google.com/p/android/issues/detail?id=180492 - Issue được xác nhận cũng bởi những người khác ppl – Davidea

Trả lời

10

Giải pháp được đề xuất bởi Nhóm Android trong câu trả lời của lỗi được báo cáo của tôi.Mã này cuối cùng sẽ hoạt động.

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

Cảm ơn bạn! – Ale

0

Tôi chạy vào một vấn đề tương tự (sử dụng v23.0.1). Trong trường hợp của tôi, vấn đề cũng xảy ra trên trang đầu tiên. Cách giải quyết mà tôi đã giải quyết là điều chỉnh độ dày và chiều cao của thanh công cụ khi đoạn được tạo.

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

Nice, đó là một sự khởi đầu, và một cái gì đó bắt đầu để làm việc (như là một sửa chữa), nhưng di chuyển sang trái và phải nó xảy ra trên một số trang để có đệm đó bây giờ thừa, có cách nào để biết nếu thanh trạng thái padding là trở nên một lần nữa có thể nhìn thấy để tránh thêm chiều cao thanh trạng thái? Chúng ta nên lấy chiều cao thực của thanh trạng thái. Tôi đoán. – Davidea

-1

Có vẻ là giải pháp cho điều này là đơn giản

Bạn có

android:fitsSystemWindows="true" 

Trong đoạn CoordinateLayoutView

loại bỏ nó khỏi đây và đặt trong quan điểm gốc của hoạt động.

Điều này bây giờ sẽ hoạt động

+0

Xin chào, mục đích là để có nó trong suốt, vì vậy giải pháp này không thể được chấp nhận. Tôi nghĩ, thiết kế thư viện hoạt động cho các trường hợp bình thường và dễ dàng trong khi nó có vấn đề lớn (và không chỉ điều này được mô tả trong câu hỏi của tôi) trong các trường hợp phức tạp. Tôi gần như đã từ bỏ thư viện này trong trường hợp người xem. – Davidea

+0

vui lòng chỉ cho tôi mã, tôi có thanh trạng thái/trong suốt màu nếu đó là hình ảnh trên googlecode thì có vẻ như bạn có thể có android: fitsSystemWindows = "true" ở một vài nơi – RuAware

3

Giống như sidecarcat, tôi gặp phải vấn đề tương tự (sử dụng v23.1.1). Tôi đăng ở đây một cách giải quyết khác bằng cách sử dụng mã của sidecarcat và thêm một số mã để loại bỏ phần đệm thừa trong một số trường hợp.

// 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; 
} 
Các vấn đề liên quan