PopupMenu hace clic para que RecyclerView se desplace
Tengo un botón de desbordamiento dentro de un CardView
en Recyclerview
. Cada vez que estoy haciendo clic en el botón, muestro un menú emergente, pero también RecyclerView
está desplazando hacia abajo un elemento. ¿Puede alguien por favor ayudarme a detener este desplazamiento no deseado?
Básicamente estoy intentando replicar el mismo comportamiento del botón del desbordamiento que en Playstore.
- Mostrar menú emergente en el elemento `ActionBar` haga clic en
- Cómo cambiar la anchura de Android PopupMenu
- Ancla el menú emergente sobre el botón de desbordamiento
- Yo uso ShareActionProvider en PopupMenu, pero mostrar dos PopupMenu?
- Rellenar popupmenu sin archivo XML en android
Diseño:
<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>
Adaptador:
@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: Tengo el problema. Cuando se muestra el menú emergente, se desliza la lista hacia abajo para mostrar el menú desplegable completo. ¿Cómo ajustar popup para mostrar hacia arriba / abajo dependiendo del espacio disponible?
- Cómo crear un PopupMenu personalizado en Android
- Posición de popupmenu de Android
- ¿Cómo puedo reemplazar mi código popupmenu con la lista popupwindow?
- Cómo cambiar la fuente de elementos de PopupMenu
- ¿Cómo mostrar el menú emergente exacto debajo de la barra de acción?
- Divisor de menú emergente para el tema de compatibilidad de aplicaciones
- Cómo evitar que el menú emergente se cierre en la casilla de verificación haga clic
- Manejo de elementos del menú emergente
Intenté usar android.widget.PopupMenu en lugar de android.support.v7.widget.PopupMenu y Voila, funciona. Así que es un error en la biblioteca de soporte. ¿Pueden los grandes desarrolladores de aquí confirmar lo mismo?
Puede tener su anchorView anular requestRectangleOnScreen requestRectangleOnScreen()
y devolver false. Esto evitará que cualquier ScrollView
de origen se desplace.
Por lo tanto, en su caso, imgBtnOverflow
sería un ImageButton
personalizado, así:
/** * 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 to jankovd ( https://gist.github.com/jankovd/19ef35efd1f00e9213fa )
Se ha presentado un problema contra el PopupMenu de asistencia técnica aquí: https://code.google.com/p/android/issues/detail?id=135439
requestRectangleOnScreen
no funciona para mí, en mi caso, requestRectangleOnScreen
no se llama, cuando se muestra popupMenu. Mi solución es override requestChildRectangleOnScreen
, y reture false, funcionan bien.
public class PopupAncorRecyclerViewPager extends RecyclerView { @Override public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) { return false; } }
- ¿Cómo puedo comprobar HoneyComb o superior está en ejecución, y por lo tanto llamar a un método para esa versión?
- ¿Cómo configurar layout_alignParentRight = "false" mediante programación?