2016-03-25 25 views
8

Tôi đang sử dụng dưới tấm từ thư viện hỗ trợ Android như thế này:Hỗ trợ Android BottomSheetBehavior không thể động?

XML:

<LinearLayout 
    android:id="@+id/bottomSheetLinearLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/fourth_white" 
    android:orientation="vertical" 
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior" /> 

tôi thêm lần xem đứa trẻ LinearLayout:

bottomSheet.addView(actionButtonView); 

Sau khi tôi đã hoàn tất việc thêm views con , Tôi khởi tạo BottomSheetBehavior và mở rộng nó:

BottomSheetBehavior sheetBehavior = BottomSheetBehavior.from(bottomSheet); 
sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 

Điều này không hoạt động. Không có gì hiển thị. Ngay cả khi tôi đặt trước chiều cao LinearLayout bên trong XML, nó chỉ là tất cả màu trắng.

Nếu tôi thêm tất cả các chế độ xem con bên trong LinearLayout trong XML, thì mọi thứ hoạt động tốt. Nó không hoạt động khi tôi cố gắng tự động thêm các khung nhìn theo chương trình.

Bất kỳ ai có bất kỳ sự cố tương tự nào?

+0

Hiển thị mã của bạn để hiểu rõ hơn ... – Vickyexpert

+1

Bạn có thể đăng mã đầy đủ cách bạn thêm chế độ xem vào 'BottomSheet' không? Vì tôi đã cố gắng tái sản xuất và chưa gặp phải vấn đề đó. – rom4ek

+0

bạn có thể đăng mã cho nhóm xem ngoài mà bạn đang thêm bảng dưới cùng không? Nếu có thể đăng các mã hoàn toàn bị cô lập để tái tạo hành vi này. Bởi vì như @ rom4ek nói tôi cũng không thể tái tạo vấn đề được nêu ra –

Trả lời

1

Troubles với nội dung động trên BottomSheetBehavior liên quan đến việc thực hiện nó mở rộng tính toán kích thước. BottomSheetBehavior tính toán kích thước mở rộng trong phương thức onLayoutChild. Nhưng khi bạn thay đổi nội dung của quá trình bố cục trang tính sẽ khởi chạy không đồng bộ. Ngay cả khi bạn gọi RequestLayout hoặc một cái gì đó tương tự. Vì vậy, kết quả của cuộc gọi là như thế này:

  1. BottomSheetBehavior có kích thước trương nở cũ (trong trường hợp của bạn tôi nghĩ rằng đó là zero)
  2. Bạn thêm nội dung vào BottomSheet. Kích thước mở rộng vẫn cũ.
  3. Bạn gọi SetState thành EXPANDED. BottomSheetBehavior vẫn còn nhớ kích thước mở rộng cũ và khởi chạy hình ảnh động với kích thước đó. Đã thay đổi trạng thái thành STATE_SETTLING!
  4. onLayoutĐược gọi và BottomSheetBehavior tính toán kích thước mở rộng mới. Nhưng hoạt ảnh đã được tiến hành và trạng thái là STATE_SETTLING nên BottomSheetBehavior không thay đổi kích thước của nó
  5. Hoạt ảnh kết thúc. Kích thước của BottomSheet là cũ. Trạng thái đã thay đổi thành EXPANDED nhưng BottomSheetBehavior "quên" rằng kích thước mở rộng đã được thay đổi trong khi hoạt ảnh.

Đó chắc chắn là lỗi triển khai BottomSheetBehaviour.

Trong dự án của tôi, tôi tìm thấy cách giải quyết như vậy:

private void showPanel(final View panelContent) { 
    if (panelBehavior.getState()!=BottomSheetBehavior.STATE_EXPANDED) { 
     panelBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 
      @Override 
      public void onStateChanged(final View bottomSheet, int newState) { 
       if (newState==BottomSheetBehavior.STATE_EXPANDED) { 
        panelBehavior.setBottomSheetCallback(null); 
        contentView.removeAllViews(); 
        contentView.addView(panelContent); 
        panelView.setVisibility(View.VISIBLE); 

       } 
      } 

      @Override 
      public void onSlide(View bottomSheet, float slideOffset) { 

      } 
     }); 
     panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
     return; 
    } 
    contentView.removeAllViews(); 
    contentView.addView(panelContent); 
    panelView.setVisibility(View.VISIBLE); 
} 

private void hidePanel() { 
    panelBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
    panelView.setVisibility(View.GONE); 
    contentView.removeAllViews(); 
} 

Vì vậy, khi bạn cần phải chứng minh BottomSheet với ShowPanel cuộc gọi nội dung mới. Khi bạn cần ẩn hoàn toàn BottomSheet, hãy gọi hidePanel (nếu bạn cần ẩn nó trong dự án của bạn. Nếu không, bạn có thể loại bỏ setVisibility khỏi các phương thức).

Ý tưởng giải pháp là không bao giờ thay đổi nội dung của BottomSheet khi BottomSheetBehavior không ở trạng thái mở rộng. Nếu trạng thái không được mở rộng, chỉ cần thay đổi nó để mở rộng, đợi cho đến khi hoạt hình kết thúc và chỉ sau đó thay đổi nội dung.

1

Cố gắng gửi Runnable vào hàng đợi thông điệp quan điểm của:

bottomSheet.post(new Runnable() { 
    @Override 
    public void run() { 
     bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
    } 
}); 

Hoặc với retrolambda:

bottomSheet.post(() -> bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED)); 
Các vấn đề liên quan