2014-05-01 16 views
12

Come posso replicare qualcosa come ho fatto qui sotto in Balsamiq?Come creare un PopupMenu personalizzato in Android

Ho creato questo menu, ma viene visualizzato solo il testo degli elementi (non le icone). È possibile visualizzare sia il titolo che l'icona in un PopupMenu?

Ecco il mio create_post_menu.xml

<?xml version="1.0" encoding="utf-8"?> 

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

    <item 
     android:id="@+id/action_photo" 
     android:icon="@drawable/ic_action_camera" 
     android:title="@string/action_photo" 
     android:showAsAction="always|withText" /> 

    <item 
     android:id="@+id/action_video" 
     android:icon="@drawable/ic_action_video" 
     android:title="@string/action_video" 
     android:showAsAction="always|withText" /> 

    <item 
     android:id="@+id/action_text" 
     android:icon="@drawable/ic_action_edit" 
     android:title="@string/action_text" 
     android:showAsAction="always|withText" /> 

    <item 
     android:id="@+id/action_link" 
     android:icon="@drawable/ic_action_web_site" 
     android:title="@string/action_link" 
     android:showAsAction="always|withText" /> 

</menu> 

A

Modifica

Qui sono i miei onCreateOptionsMenu e onOptionsItemSelected metodi:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (item.getItemId() == R.id.action_new) { 
     View menuItemView = findViewById(R.id.action_new); 
     PopupMenu popupMenu = new PopupMenu(this, menuItemView); 
     popupMenu.inflate(R.menu.create_post_menu); 
     popupMenu.show(); 
     return true; 
    } else if(item.getItemId() == R.id.action_search) { 
     return true; 
    } else if(item.getItemId() == R.id.action_settings) { 
     startActivity(new Intent(MainActivity.this, SettingsActivity.class)); 
     return true; 
    } else if(item.getItemId() == R.id.action_help) { 
     return true; 
    } else { 
     return super.onOptionsItemSelected(item); 
    } 
} 
+0

Stai utilizzando la libreria AppCompact per ActionBar? –

+0

@Ye Lin Aung No, non lo sono. – lschlessinger

+0

Puoi pubblicare il tuo metodo onCreateOptionsMenu()? –

risposta

15

Ho risolto questo problema semplicemente inserendo create_post_menu all'interno di item la cui icona è +.

Per esempio, io ho (utilizzando AppCompat):

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

    <item 
      android:id="@+id/action_new" 
      android:icon="@drawable/ic_action_new" 
      android:title="@string/action_new" 
      app:showAsAction="always"> 

      <menu> 

       <item 
        android:id="@+id/action_photo" 
        android:icon="@drawable/ic_action_camera" 
        android:title="@string/action_photo" 
        app:showAsAction="always|withText" /> 
       <item 
        android:id="@+id/action_video" 
        android:icon="@drawable/ic_action_video" 
        android:title="@string/action_video" 
        app:showAsAction="always|withText" /> 
       <item 
        android:id="@+id/action_text" 
        android:icon="@drawable/ic_action_text" 
        android:title="@string/action_text" 
        app:showAsAction="always|withText" /> 
       <item 
        android:id="@+id/action_place" 
        android:icon="@drawable/ic_action_place" 
        android:title="@string/action_place" 
        app:showAsAction="always|withText" /> 
       <item 
        android:id="@+id/action_more" 
        android:title="@string/action_more" 
        android:visible="false" 
        app:showAsAction="always|withText" /> 

      </menu> 
     </item> 
     ...(more menu items here) 
</menu> 

Senza AppCompat, si può solo sbarazzarsi del namespace XML app sostituendo app con android.

+0

A cosa serve 'xmlns: app'? –

+0

@ M.S. Vedi [questa risposta] (http://stackoverflow.com/a/26692768/2554416) – lschlessinger

12
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.PopupMenu; 
import android.widget.Toast; 
public class MainActivity extends Activity { 
Button button1; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      button1 = (Button) findViewById(R.id.button1);//your created butto 
      button1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
      //Creating the instance of PopupMenu 
      PopupMenu popup = new PopupMenu(MainActivity.this, button1); 
      //Inflating the Popup using xml file 
      popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu()); 

      //registering popup with OnMenuItemClickListener 
      popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      public boolean onMenuItemClick(MenuItem item) { 
       Toast.makeText(MainActivity.this,"You Clicked : " + item.getTitle(),Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
      }); 

      popup.show();//showing popup menu 
      } 
      });//closing the setOnClickListener method 
     } 
    } 
+1

il tuo codice funziona ma mostra solo titoli, come Posso ottenere titoli con icone? qualche idea ?? –

0

Spero che la mia risposta precedente Here possa aiutarti.
Se si desidera solo un menu popup simile, è possibile utilizzare ActionProvider. È più potente.
Se lo si desidera come un vero menu, è possibile utilizzare PopupMenu personalizzato.

+0

Conosci qualche risorsa in cui posso vedere un esempio completo di questo? – lschlessinger

+0

@lschlessinger Basta dare un'occhiata alla guida per sviluppatori Android, http://developer.android.com/guide/topics/ui/actionbar.html#ActionProvider –

+0

Grazie. Proverò a implementarlo. Molto frustrante che il loro esempio da [docs] (http://developer.android.com/guide/topics/ui/actionbar.html#CreatingActionProvider) 'ActionBarSettingsActionProviderActivity' non esiste. – lschlessinger

Problemi correlati