2012-05-07 20 views
5

Estoy tratando de implementar una barra de acciones en la que uno de los botones al hacer clic muestra un menú emergente. Aquí está el menú. XML (elementos de menú en la barra de acciones)Menú emergente al hacer clic en un botón en acción Barra

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

<item 
    android:id="@+id/search" 
    android:icon="@drawable/ic_action_search" 
    android:orderInCategory="0" 
    android:showAsAction="always" 
    android:title="@string/menu_search"/> 
<item 
    android:id="@+id/refresh" 
    android:icon="@drawable/ic_action_refresh" 
    android:orderInCategory="1" 
    android:showAsAction="always" 
    android:title="@string/menu_refresh"/> 


<Item 
    android:id="@+id/popup" 
    android:icon="@drawable/ic_action_search" 
    android:onClick="showPopup" 
    android:orderInCategory="1" 
    android:showAsAction="always" 
    android:title="@string/menu_search" /> 

deseo para mostrar un menú emergente en el clic del artículo en cuestión con id "@ +/Identificación del emergente".

aquí es el XML para el menú emergente

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

<item 
    android:id="@+id/item1" 
    android:icon="@drawable/ic_action_search" 
    android:orderInCategory="0" 
    android:showAsAction="always" 
    android:title="@string/menu_search"/> 
<item 
    android:id="@+id/item2" 
    android:icon="@drawable/ic_action_search" 
    android:orderInCategory="1" 
    android:showAsAction="always" 
    android:title="@string/menu_search"/> 

aquí es el método onClick del botón

public void showPopup(View v) { 
    PopupMenu popup = new PopupMenu(this, v); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.overflow, popup.getMenu()); 
    popup.show(); 
} 

Y el problema es que no hay emergente aparece en clic de ese botón. Necesito ayuda gente.

+0

¿Estás seguro de que se llama a showPopup? Tal vez el onClick no se registra correctamente? – Gophermofur

+0

No estoy seguro de si el onClick se está registrando correctamente. – darsh

+1

Establezca un log.d o un punto de interrupción en el método showPopup y vea si imprimen algo/reciben un golpe. Si eso funciona, entonces puedes enfocarte en el código dentro de showPopup. – Gophermofur

Respuesta

1

Encontré una solución a esto. En lugar de usar el menú XML para inflar el menú emergente, hice un archivo de diseño XML.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/container" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:background="#8b8989" 
android:orientation="vertical" 
android:padding="10dip" > 

<TextView 
    android:id="@+id/menuItem1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dip" 
    android:text="@string/menu1" /> 

<TextView 
    android:id="@+id/menuItem2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dip" 
    android:text="@string/menu2" /> 
<TextView 
    android:id="@+id/menuItem3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dip" 
    android:text="@string/menu3" /> 
</LinearLayout> 

y he cambiado el método onClick

public void showPopup(View v) { 
    LayoutInflater inflater = (LayoutInflater) MainActivity.this 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     PopupWindow pw = new PopupWindow(inflater.inflate(
       R.layout.overflow_layout, null, false), 300, 400, true); 
     pw.showAtLocation(findViewById(R.id.container), Gravity.CENTER, 0, 
       0); 
} 

Esto resolvió el problema

+3

No me parece una buena solución. –

+0

inflar un diseño cada vez es caro. hay una manera mucho más limpia, eficiente y robusta de hacer esto. Mira mi respuesta – Nlinscott

0
android:onClick="popup" 

puede ser que usted debería cambiarlo a android:onClick="showPopup"?

+0

oh, lo siento, fue un error en la pregunta. Es realmente una y la misma, estoy editando la pregunta – darsh

3

Como el menú emergente es un MENÚ, tiene que manejar esto implementando el "onOptionsItemSelected". Podrá decir qué hacer para cada opción de menú. Reemplazará la opción "onClick" que definió y se invocará automáticamente.

2

Intenta cambiar 'esto' a getActivity().

public void showPopup(View v) { 
    PopupMenu popup = new PopupMenu(getActivity(), v); 
    MenuInflater inflater = popup.getMenuInflater(); 
    inflater.inflate(R.menu.overflow, popup.getMenu()); 
    popup.show(); 
} 

Hope it helps .. !!

+0

Intenté esto, lamentablemente no está funcionando – darsh

+0

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/ PopupMenu1.html. Pruebe esto pero supongo que está haciendo lo mismo .. – Rookie

14

Hola cada uno, que es mi propia solución: He creado el método ShowPopup, y luego lo llamé en onOptionsItemSelected como este:

public void showPopup(){ 
    View menuItemView = findViewById(R.id.menu_save); 
    PopupMenu popup = new PopupMenu(getActivity(), menuItemView); 
    MenuInflater inflate = popup.getMenuInflater(); 
    inflate.inflate(R.menu.popup, popup.getMenu()); 
    popup.show(); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.menu_save:  
     showPopup(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
} 

} 

popup.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
<item 
    android:id="@+id/decon" 
    android:showAsAction="ifRoom" 
    android:title="@string/decon"/> 

<item 
    android:id="@+id/mRes" 
    android:showAsAction="ifRoom" 
    android:title="@string/mesRes"/> 

</menu> 

principal.xml => se llama onCreateOptionsMenu

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

<item 
    android:id="@+id/menu_save" 
    android:enabled="true" 
    android:icon="@drawable/action_save" 
    android:showAsAction="ifRoom|withText" 
    android:title="@string/action_save" 
    android:visible="true"/> 

</menu> 

Finalmente i

implements PopupMenu.OnMenuItemClickListener to @Override onMenuItemClick method. 
+0

Me funcionó :) –

+0

Muchas gracias, realmente me ayudó. –

14

encontré esta aquí: http://developer.android.com/guide/topics/ui/menus.html

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:id="@+id/selectImg" 
     android:icon="@android:drawable/ic_dialog_dialer" 
     android:showAsAction="always"> 

     <menu> 
      <item android:id="@+id/top" 
       android:title="@string/topimg"/> 
      <item android:id="@+id/bottom" 
       android:title="@string/botimg" /> 
     </menu> 

    </item> 
</menu> 

Se puede retener un menú dentro de un menú para presentar submenús cuando se hace clic en el elemento. Luego, en Java, puede usar los mismos métodos que de costumbre.

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu items for use in the action bar 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle presses on the action bar items 
     // View v = findViewById(R.id.f); 
     switch (item.getItemId()) { 
      case R.id.top: 
       //action 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

el ID del 'top' en el XML sigue siendo reconocido a pesar de que es un submenú. Esto funcionó para mí y se parece al menú emergente.

+0

Esto debería ser aceptado respuesta – mdikici

Cuestiones relacionadas