2012-03-23 26 views
19

En la aplicación Astrid Tasks, hay un botón. Cuando presiona el botón, aparece un menú desplegable.Spinners personalizados/menú desplegable

enter image description here

enter image description here

Se trata básicamente de una ruleta, pero en una forma con los pies en la lista desplegable.

¿Alguien sabe cómo hacer algo similar? ¿Es este un widget que simplemente no veo?

+0

es un menú contextual –

Respuesta

55

Como autor original de este (soy uno de los principales desarrolladores de Android para Astrid) me gustaría compartir cómo lo hace Astrid. Voy a publicar los conceptos básicos aquí, pero puedes encontrar más detalles en nuestro repositorio github (https://github.com/todoroo/astrid). La idea básica es extender el QuickActionWidget de GreenDroid como lo sugiere Hanry. La subclase se ve algo como:

public class MenuPopover extends QuickActionWidget { 

    protected DisplayMetrics metrics; 
    protected LinearLayout content; 

    public MenuPopover(Context context) { 
     super(context); 
     setContentView(R.layout.my_layout); 

     content = (LinearLayout) getContentView().findViewById(R.id.content); 
     metrics = context.getResources().getDisplayMetrics(); 

     setFocusable(true); 
     setTouchable(true); 
    } 

    @Override 
    protected void populateQuickActions(List<QuickAction> quickActions) { 
     // Do nothing 
    } 

    @Override 
    protected void onMeasureAndLayout(Rect anchorRect, View contentView) { 
     contentView.setLayoutParams(new  FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,  ViewGroup.LayoutParams.WRAP_CONTENT)); 
     contentView.measure(MeasureSpec.makeMeasureSpec(getScreenWidth(),  MeasureSpec.EXACTLY), 
       ViewGroup.LayoutParams.WRAP_CONTENT); 

     int rootHeight = contentView.getMeasuredHeight(); 

     int offsetY = getArrowOffsetY(); 
     int dyTop = anchorRect.top; 
     int dyBottom = getScreenHeight() - anchorRect.bottom; 

     boolean onTop = (dyTop > dyBottom); 
     int popupY = (onTop) ? anchorRect.top - rootHeight + offsetY : anchorRect.bottom - offsetY; 

     setWidgetSpecs(popupY, onTop); 
    } 
} 

la my_layout.xml archivo de diseño es bastante simple:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingLeft="10dip"> 

     <LinearLayout 
       android:id="@+id/content" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_below="@+id/gdi_arrow_up" 
       android:orientation="vertical"/> 

     <ImageView 
      android:id="@+id/gdi_arrow_up" 
      android:layout_width="27dip" 
      android:layout_height="27dip" 
      android:layout_marginLeft="-10dip" 
      android:scaleType="fitCenter" 
      android:layout_marginBottom="-8dip" 
      android:src="?attr/asListArrowUp" /> 

     <ImageView 
      android:id="@+id/gdi_arrow_down" 
      android:layout_width="27dip" 
      android:layout_height="27dip" 
      android:scaleType="fitCenter" 
      android:layout_marginBottom="-8dip" 
      android:layout_below="@android:id/list"/> 

     </RelativeLayout> 
</FrameLayout> 

A continuación, basta con añadir un método de ayuda simple de la clase popover para agregar puntos de vista (es decir, filas , con los oyentes opcional) para el cuerpo principal de la popover:

public void addViewToContent(View v, OnClickListener listener) { 
    content.addView(v); 
    if (listener != null) { 
     v.setOnClickListener(listener); 
    } 
} 

Después de crear una instancia de la ventana emergente, se puede mostrar que llamando

menuPopover.show(anchorView); 

Esta es una versión algo simplificada: en la práctica, adjuntamos información adicional, oyentes, etc. a esas vistas para hacer que realmente hagan las cosas cuando se hace clic. Si lo desea, puede consultar el código completo en https://github.com/todoroo/astrid - la clase es com.todoroo.astrid.ui.MainMenuPopover.

Gracias por utilizar Astrid!

+0

¡Guau, esto es genial! Eres increíble, gracias! (P.S. Love Astrid!) – Cole

+14

¡Gracias por hacerlo de código abierto! –