5

Tôi có một hoạt động bao gồm Thanh công cụ và máy nhắn tin lượt xem. bố trí của nó như sau:SwipeRefreshLayout bên trong ViewPager

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 

<android.support.v4.view.ViewPager 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="112dp" 
    android:layout_gravity="bottom" 
    tools:context=".Rhino68PanelActivity" /> 

<LinearLayout 
    android:id="@+id/toolbarContainer" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <include 
     android:id="@+id/app_bar" 
     layout="@layout/app_bar" /> 

    <include 
     android:id="@+id/tap_strip" 
     layout="@layout/tab_strip" /> 

</LinearLayout> 

Sau đó tôi tải hai mảnh vào xem máy nhắn tin. Mỗi mảnh chứa SwipeRefreshLayout của riêng nó. Tôi sẽ hiển thị một mảnh bố trí:

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/swipe_refresh_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="12" 
    tools:context=".Rhino68PanelActivity$DummySectionFragment"> 
    ...   
    <android.support.v7.widget.RecyclerView 
    android:id="@+id/recyclerView_panel_status" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:clipToPadding="false" /> 

</LinearLayout> 

Bây giờ khi tôi chạy hoạt động có vẻ như để làm việc. Tuy nhiên tôi đã nhận thấy đó là tôi trượt theo chiều ngang (tức là để đi đến tab tiếp theo). Nó gây nên swipeRefreshLayout OnRefreshListener

 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       mSwipeRefreshLayout.setRefreshing(true); 
       DoUpdate(); 
      } 
     }); 

Tôi cũng trải qua hành vi thị giác kỳ lạ khi tôi cố gắng và làm mới. Các dấu hiệu tải (vòng tròn quay) thường không hiển thị, và đôi khi nó cho thấy nhưng vẫn nhỏ. Tôi không chắc liệu đây có phải là nguyên nhân của hai quan điểm xung đột với nhau hay không.

Có cách nào để tôi có thể khắc phục sự cố này không. Tôi không chắc chắn như thế nào. Có thể bằng cách giới hạn SwipeRefreshLayout để chỉ nghe các lần vuốt dọc?

Mọi đề xuất sẽ được đánh giá rất nhiều.

+1

Tôi không có vấn đề này bên trong dự án của tôi, cũng sử dụng cấu trúc tương tự. Bạn có thể đăng một dự án mẫu để tái tạo vấn đề này không? – corsair992

+0

Bạn có muốn chia sẻ bố cục của mình không? Chắc chắn hai bố cục sẽ ảnh hưởng lẫn nhau? Nếu tôi thậm chí chỉ cần ghi âm 'SwipeRefreshLayout' nó sẽ kích hoạt' OnRefresh() ' – Zapnologica

+1

Có một khoảng thời gian slop trước khi một trong các' ViewGroup' tiếp quản sự kiện cảm ứng, và nó được xác định bởi việc kéo là dọc hay ngang . Sau khi một sự kiện cảm ứng được thực hiện bởi một 'ViewGroup', nó tiếp tục xử lý sự kiện mà không có sự can thiệp (sử dụng phương thức' requestDisallowInterceptTouchEvent() '). Ứng dụng và bố cục của tôi khá phức tạp và cũng bảo mật, nó sẽ giúp ích nếu bạn có thể đăng một dự án mẫu tối thiểu với vấn đề này (để tôi có thể gỡ lỗi nó). – corsair992

Trả lời

1

Đó là vì có lỗi trong SwipeRefreshLayout! Lỗi này là "onRefresh không hoạt động đúng nếu onMeasure không được gọi là" Bạn nên mở rộng SwipeRefreshLayout như thế này!

public class SwipeRefreshLoading extends SwipeRefreshLayout { 
    public SwipeRefreshLoading(Context context) { 
     super(context, null); 
    } 

    public SwipeRefreshLoading(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    private boolean mMeasured = false; 
    private boolean mPreMeasureRefreshing = false; 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     if (!mMeasured) { 
      mMeasured = true; 
      setRefreshing(mPreMeasureRefreshing); 
     } 
    } 


    @Override 
    public void setRefreshing(boolean refreshing) { 
     if (mMeasured) { 
      super.setRefreshing(refreshing); 
     } else { 
      mPreMeasureRefreshing = refreshing; 
     } 
    } 
} 
+0

Cảm ơn bạn! Tôi có RefreshLayout bên trong ViewPager và 'setRefreshing' bên trong" trang "(nó là một mảnh trong trường hợp của tôi) không hoạt động vì một số lý do. Nhân tiện, tôi sử dụng đoạn mã của bạn và tôi có một chút sai vị trí của spinner làm mới. Nếu bạn chuyển logic từ phương thức 'onMeasure' sang' onLayout' thì vị trí sẽ chính xác. – IlyaEremin

+0

@IlyaEremin tôi gặp sự cố trong vievpager với refreshlayout - khi i triger onrefresh * setrefresg (false) trong phần đầu tiên của viewpager thì hoạt ảnh đã biến mất (ok) - nhưng trong hoạt ảnh mảnh thứ hai vẫn còn chơi ngay cả tôi gọi setrefreshinng (false) - i mở rộng bố trí như trên - cũng chuyển sang onlayout nhưng vẫn không có hiệu lực cũng đã cố gắng bài trì hoãn về bố trí - có lẽ tôi nên thêm setrefresh để đặt ra? – ceph3us

+0

@TomaszBest đây là câu hỏi ngu ngốc, nhưng tôi hỏi. Bạn đã gọi 'setRefreshing (false)' cho đoạn thứ hai 'SwipeRefreshLayout'? – IlyaEremin

3

Tôi cũng có vấn đề ngu ngốc này. Nó dường như là một lỗi trong SwipeRefreshLayout. Để giải quyết vấn đề này, tôi phải xóa tất cả các chế độ xem con trong phương thức Fragment.onDestroyView().

public SwipeRefreshLayout mSwipeRefreshLayout; 
... 

@Override public void onDestroyView() { 
    mSwipeRefreshLayout.removeAllViews(); 
    super.onDestroyView(); 
} 
Các vấn đề liên quan