2014-05-01 5 views
12

Wie kann ich etwas wie ich unten in Balsamiq replizieren?So erstellen Sie ein benutzerdefiniertes PopupMenu in Android

Ich habe dieses Menü erstellt, aber es zeigt nur den Text der Elemente (nicht die Symbole). Ist es möglich, sowohl den Titel als auch das Icon in einem PopupMenu anzuzeigen?

Hier ist meine 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

bearbeiten

Hier sind meine onCreateOptionsMenu und onOptionsItemSelected Methoden:

@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

Verwenden Sie die AppCompact-Bibliothek für ActionBar? –

+0

@Ye Lin Aung Nein, bin ich nicht. – lschlessinger

+0

Können Sie Ihre onCreateOptionsMenu() -Methode posten? –

Antwort

15

Ich löste dieses Problem, indem ich einfach die create_post_menu innerhalb der item setzen, deren Symbol eine + ist.

Zum Beispiel habe ich (mit 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> 

Ohne AppCompat, könnten Sie einfach loszuwerden, die XML-Namespace app von app mit android ersetzen.

+0

Was ist die Verwendung von 'xmlns: app'? –

+0

@ M.S. Siehe [diese Antwort] (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

Ihr Code funktioniert, aber es zeigt nur Titel, wie Ich kann Titel mit Symbolen erreichen? irgendeine Idee ?? –

0

Ich hoffe meine vorherige Antwort Here kann Ihnen helfen.
Wenn Sie nur ein ähnliches Popup-Menü möchten, können Sie ActionProvider verwenden. Es ist stärker.
Wenn Sie es als ein echtes Menü möchten, können Sie benutzerdefinierte PopupMenu verwenden.

+0

Kennen Sie Ressourcen, in denen ich ein vollständiges Beispiel sehen kann? – lschlessinger

+0

@lschlessinger Werfen Sie einen Blick auf Android Entwickler Guide, http://developer.android.com/guide/topics/ui/actionbar.html#ActionProvider –

+0

Danke. Ich werde versuchen, dies zu implementieren. Sehr frustrierend, dass ihr Beispiel aus der [docs] (http://developer.android.com/guide/topics/ui/actionbar.html#CreatingActionProvider) 'ActionBarSettingsActionProviderActivity' nicht existiert. – lschlessinger