11

Tôi đang sử dụng NSV trong CL cho khả năng nén thanh công cụ khi NSV cuộn xuống. Vấn đề mà tôi đang gặp phải là NSV của tôi không được cuộn lên đầu khi nó tải, thay vào đó, nó được bù đắp từ đỉnh của NSV bằng một biên độ khá (tôi không chắc chắn nơi khoảng cách này đến từ đâu, nó không ở trong bố cục). Hãy xem ảnh chụp màn hình, cái đầu tiên cho thấy cách tải NSV và bạn có thể thấy rõ ràng NSV đã cuộn xuống một chút từ trên cùng bằng cách so sánh thứ hai (khi tôi cuộn NSV lên trên cùng bằng tay):NestedScrollView (NSV) trong CoordinatorLayout (CL): NSV Không ở trên cùng khi được tải

When NSV loads, it's not at the top NSV scrolled to the top manually for comparison sake

tôi đã làm một số cập nhật để bố trí này và nó gây ra điều này xảy ra, trước đây, nó được nạp ở phía trên mà không vấn đề. Tuy nhiên, tôi không thêm bất kỳ khoảng cách nào đáng lẽ phải gây ra điều này.

Dưới đây là cách bố trí Tôi đang sử dụng cho việc này:

<android.support.design.widget.CoordinatorLayout 
    android:id="@+id/cl_goal_detail" 
    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="0dp" 
    android:layout_weight="1"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/abl_goal_detail" 
     android:layout_width="match_parent" 
     android:layout_height="144dp" 
     app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsing_toolbar_goal_detail" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:paddingBottom="@dimen/content_space_double" 
      app:collapsedTitleTextAppearance="@style/title.dark" 
      app:expandedTitleTextAppearance="@style/display3.plus.dark" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar_goal_detail" 
       style="@style/toolbar" 
       app:layout_collapseMode="pin" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 
     </android.support.design.widget.CollapsingToolbarLayout> 
    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.NestedScrollView 
     android:id="@+id/nsv_goal_detail" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingBottom="@dimen/content_space_half" 
     android:paddingLeft="@dimen/content_space_half" 
     android:paddingRight="@dimen/content_space_half" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <FrameLayout 
      android:id="@+id/container_goal_detail" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="fill_vertical"/> 
    </android.support.v4.widget.NestedScrollView> 
</android.support.design.widget.CoordinatorLayout> 

Bất kỳ ý tưởng sẽ được đánh giá!

Trả lời

7

OK! Sau một NGÀY vững chắc gỡ lỗi mọi thành phần duy nhất trong bố cục của tôi và Mảnh vỡ tôi đã xác định những gì tôi tin là một lỗi.

Trước tiên, vấn đề: Chỉ ra rằng có các phần tử trong chế độ xem con của NSV sẽ thay đổi hiển thị thành View.GONE khi thời gian chạy đang khiến danh sách cuộn xuống. Tôi nhận thấy rằng danh sách cuộn đến ngay phía trên phần tử nơi hiển thị được bật (bao gồm mọi lề được đặt trên chế độ xem).

Thứ hai, khắc phục: Tôi đã khắc phục sự cố này bằng cách đặt tất cả chế độ xem thành android: visibility = "gone" trong bố cục xml, sau đó, tôi chuyển đổi chế độ hiển thị của mỗi chế độ xem nếu cần. Trước đây, các chế độ xem được hiển thị theo mặc định và sau đó tôi đã làm việc từ đó. Tôi chỉ cần thay đổi logic của mình để bắt đầu với tất cả GONE, không quá khó khăn.

Tôi giả định công trình này vì các chế độ xem bạn sẽ ẩn trong thời gian chạy không tạo thành một phần của phép tính chiều cao tổng thể khi NSV được tạo trong onCreateView(). Khi phân đoạn tiến triển trên chế độ onCreateView() an toàn để tự động thay đổi chế độ xem, tuy nhiên, nếu lượt xem được tính như một phần của chiều cao trong onCreateView() và THEN bị ẩn với View.GONE, các phép đo sẽ trở nên sôi nổi và bạn kết thúc bằng danh sách cuộn xuống đáng kể.

4

Các bạn đã thử thêm bên dưới dòng trong ViewGroup của bạn ví dụ: FrameLayout trong trường hợp của bạn

android:descendantFocusability="blocksDescendants" 

Tôi nghĩ rằng điều này cũng sẽ làm việc cho bạn.

Nếu không thử thêm NSV.

+1

Điều đó có ý nghĩa gì trong trường hợp này? –

0

Câu trả lời của bạn đã giúp tôi rất nhiều để tìm ra vấn đề của tôi (btw, nó giống nhau). Nhưng tôi đã làm nó theo một cách khác. Tôi đoán bạn đang sử dụng RecyclerView. Trong trường hợp của tôi, tôi đang sử dụng 3 RecyclerViews. Vâng, từ câu trả lời của bạn, tôi bắt đầu ẩn các recyclers và tôi phát hiện ra chỉ là một trong số họ đã gây ra vấn đề này. Những gì tôi đã làm là tôi đã điền vào một postDelayed:

new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       recyler.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
       recyler.setAdapter(new MyAdapter(myList)); 
      } 
     }, 3000); 

Điều đó làm việc tốt!

+0

Xin chào Octavio, tôi sẽ không khuyên bạn nên sử dụng độ trễ để sửa lỗi này. Sự chậm trễ là không cần thiết và tại 3 giây quá dài. Nguyên tắc của Google đề xuất một trang sẽ hiển thị (không bao gồm hoạt ảnh) trong 16ms, vì vậy điều này có thể làm người dùng thất vọng. – AutoM8R

1

Trong trường hợp của tôi, có một EditText gần cuối nội dung cuộn của tôi đang lấy nét.Vì NestedScrollView thực hiện một số công cụ bố cục lạ, chế độ xem được lấy nét không cuộn lên đầu khi hoạt động bắt đầu, vì vậy nguyên nhân thực sự không dễ dàng rõ ràng. Thêm cài đặt này vào bố cục con của NestedScrollView đã sửa nó cho tôi:

android:focusableInTouchMode="true" 
Các vấn đề liên quan