2015-04-06 21 views
12

Tôi có nút tràn bên trong một CardView trong Recyclerview. Bất cứ khi nào tôi nhấp vào nút, tôi hiển thị menu bật lên nhưng cũng có thể RecyclerView đang cuộn xuống một mục. Bất cứ ai có thể vui lòng giúp tôi ngừng cuộn không mong muốn này?PopupMenu nhấp vào gây ra RecyclerView để cuộn

Về cơ bản tôi đang cố gắng sao chép hành vi nút tràn tương tự như trong Cửa hàng Play.

Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_margin="5dp"> 

<android.support.v7.widget.CardView 
    android:id="@+id/cv_tracks" 
    android:layout_width="match_parent" 
    android:layout_height="65dp" 
    > 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="60dp"> 

     <ImageView 
      android:id="@+id/ivTracks" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:background="@drawable/unknown" 
      /> 
     <Button 
      android:id="@+id/imgbtn_overflow" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@android:color/transparent" 
      android:drawableTop="@drawable/ic_overflow" 
      android:paddingLeft="25dp" 
      android:paddingRight="20dp" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" /> 
</RelativeLayout> 
</android.support.v7.widget.CardView> 
</RelativeLayout> 

Adaptor:

@Override 
public void onBindViewHolder(final TracksViewHolder tracksViewHolder, int i) { 

    tracksViewHolder.imgBtnOverflow.setTag(i); 
    tracksViewHolder.imgBtnOverflow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //Creating the instance of PopupMenu 
      final int position = (Integer) v.getTag(); 

      PopupMenu popup = new PopupMenu(mContext,tracksViewHolder.imgBtnOverflow); 

      //Inflating the Popup using xml file 
      popup.getMenuInflater() 
        .inflate(R.menu.popup_menu_overflow, popup.getMenu()); 


      //registering popup with OnMenuItemClickListener 
      popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

       public boolean onMenuItemClick(MenuItem item) { 

       if(mPopUpClick!=null) 
        mPopUpClick.actionOnPopUpItemClick(position,item,songs.get(position)); 
        return true; 
       } 
      }); 

      popup.show(); //showing popup menu 
     } 
    }); 

} 

UPDATE: Got vấn đề .Khi hiển thị trình đơn popup, nó trượt danh sách xuống để hiển thị toàn bộ danh sách thả xuống. Làm thế nào để điều chỉnh popup để hiển thị lên/xuống tùy thuộc vào không gian có sẵn?

Trả lời

23

Đã thử sử dụng android.widget.PopupMenu thay vì android.support.v7.widget.PopupMenu và Voila, nó hoạt động. Vì vậy, nó là một lỗi trong thư viện hỗ trợ. Các nhà phát triển giỏi ở đây có xác nhận không?

+0

Tương tự đối với tôi, sử dụng android.widget.PopupMenu hoạt động cho đến nay. – Chris

9

Bạn có thể ghi đè AnchorView requestRectangleOnScreen() và trả về false. Điều này sẽ ngăn chặn bất kỳ phụ huynh nào ScrollView từ cuộn.

Vì vậy, trong trường hợp của bạn, imgBtnOverflow sẽ là một tùy chỉnh ImageButton, như vậy:

/** 
* A custom {@link ImageButton} which prevents parent ScrollView scrolling when used as the 
* anchor for a {@link android.support.v7.widget.PopupMenu} 
*/ 
public class NonScrollImageButton extends ImageButton { 

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

    @Override 
    public boolean requestRectangleOnScreen(Rect rectangle, boolean immediate) { 
     return false; 
    } 
} 

Props để jankovd (https://gist.github.com/jankovd/19ef35efd1f00e9213fa)

Một vấn đề đã được đệ trình chống lại Hỗ trợ PopupMenu đây: https://code.google.com/p/android/issues/detail?id=135439

0

requestRectangleOnScreen không hoạt động đối với tôi, trong trường hợp của tôi, requestRectangleOnScreen không được gọi, khi hiển thị popupMenu. giải pháp của tôi là ghi đè requestChildRectangleOnScreen và thử lại sai, hoạt động tốt.

public class PopupAncorRecyclerViewPager extends RecyclerView { 
     @Override 
    public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) { 
     return false; 
    } 
} 
1

Tôi có cùng một vấn đề, và tôi sử dụng theo cách này:

mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false) { 
      @Override 
      public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate) { 
       return false; 
      } 
     }; 
mRecyclerView.setLayoutManager(mLayoutManager); 

RecyclerView dùng LayoutManager để quản lý bố trí, vì vậy tôi nghĩ rằng sự thay đổi layoutmanger behaver sự là giải pháp người đặt cược.

Các vấn đề liên quan