2013-06-05 26 views
11

Voglio creare una voce di menu di overflow personalizzato nel mio ActionBar in aggiunta alla voce Impostazioni come descritto nella seguente immagine:Android creare voce di menu di overflow personalizzato

Action bar

Ma se c'è poco spazio in l'ActionBar Non voglio che Item1 e Item2 entrino nell'elemento Setting come overflow, ma in "my overflow item".

questo è il mio menù di codice XML:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:icon="@android:drawable/ic_menu_agenda" 
    android:title="Item1" 
    android:showAsAction="ifRoom|withText" /> 

<item 
    android:icon="@android:drawable/ic_menu_add" 
    android:title="Item2" 
    android:showAsAction="ifRoom|withText" /> 

<item android:id="@+id/pick_action_provider" 
    android:icon="@android:drawable/ic_menu_sort_by_size" 
    android:showAsAction="always" 
    android:title="Overflow" > 
    <menu> 
     <item android:id="@+id/action_sort_size" 
       android:icon="@android:drawable/ic_menu_camera" 
       android:title="Item3" /> 
     <item android:id="@+id/action_sort_alpha" 
       android:icon="@android:drawable/ic_menu_sort_alphabetically" 
       android:title="Item4" /> 
    </menu> 
</item> 

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:showAsAction="never" 
    android:title="@string/action_settings"/></menu> 

risposta

6

Questo ti aiuterà. Avevo codificato questo per menu di overflow

Nel menù/main.xml presentare

<item 
    android:id="@+id/overflow" 
    android:orderInCategory="100" 
    android:showAsAction="always" 
    android:icon="@drawable/ic_overflow" 
    android:title=""> 
    <menu> 
     <item 
      android:id="@+id/facebook" 
      android:title="Facebook"/> 

     <item 
      android:id="@+id/Twitter" 
      android:title="Twitter"/> 

     <item 
      android:id="@+id/Youtube" 
      android:title="Youtube"/> 
    </menu> 
</item> 

E qui è il codice Java:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.main, menu); 

    return true; 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    // Handle action bar actions click 

    super.onOptionsItemSelected(item); 
    if(item.getItemId() == R.id.facebook){ 
     Toast.makeText(Getstarted.this, "Option pressed= facebook",Toast.LENGTH_LONG).show(); 
    } 
    else if(item.getItemId() == R.id.Youtube){ 
     Toast.makeText(Getstarted.this, "Option pressed= youtube",Toast.LENGTH_LONG).show(); 
    } 
    else if(item.getItemId() == R.id.Twitter){ 
     Toast.makeText(Getstarted.this, "Option pressed= twitter",Toast.LENGTH_LONG).show(); 
    } 
    return true;  

} 
+1

Grazie, ma android: showAsAction = "always" -> app: showAsAction = "always" – Arnab

0

Vedere questi collegamenti

http://www.codeproject.com/Articles/173121/Android-Menus-My-Way

http://developer.android.com/guide/topics/ui/actionbar.html#Dropdown

e vi consiglio di utilizzare ActionBarSherlock per creare un menu di overflow personalizzato

Vedere questa risposta per sapere come creare voce di menu di overflow utilizzando ActionBar sherlock

ActionbarSherlock does not include "overflow" section of Action Bar (on Android 2.1)

+0

Non voglio utilizzare la libreria esterna o il menu a discesa perché è un tipo di navigazione e non un menu di overflow e sono sviluppato per Android 4+ – lory105

0

È probabilmente necessario rimuovere la voce di impostazione nel menu ossia @ + id/action_settings.

Se si vuole ancora di essere lì, semplicemente rimuovere è "showAsActionAttribute" o scambio a

android:showAsAction="always" 

Per Item1 e Item2: aggiungere le loro showAsAction attributi come android:showAsAction="ifRoom|withText"

Speranza che aiuta.

0

Il modo migliore per fare ciò che si desidera ottenere è gonfiare una personalizzata ActionBar.

Effettuare le seguenti operazioni.

1) Creare un XML RelativeLayout

2) Includere una voce di menu e tag all'interno del XML

3) Gonfiare la barra delle azioni tramite la classe ActionBar.

4) Questo è tutto!

Attenzione: non dimenticare di utilizzare la libreria di compatibilità !! Ci sono alcune dipendenze in esso per il funzionamento di cui sopra.

0

quando click elemento dalla ActionBar

PopupMenu popup = new PopupMenu(MainActivity.this, v); 
popup.getMenuInflater().inflate(
          R.mymenu xml , popup.getMenu()); 



mymenu.xml 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
    android:icon="@android:drawable/ic_menu_agenda" 
    android:title="Item1" 
    android:showAsAction="ifRoom" /> 

<item 
    android:icon="@android:drawable/ic_menu_add" 
    android:title="Item2" 
    android:showAsAction="ifRoom" /> 

<item android:id="@+id/pick_action_provider" 
    android:icon="@android:drawable/ic_menu_sort_by_size" 
    android:showAsAction="ifRoom" 
    android:title="Overflow" > 
    <menu> 
     <item android:id="@+id/action_sort_size" 
     android:showAsAction="ifRoom|withText" 
       android:icon="@android:drawable/ic_menu_camera" 
       android:title="Item3" /> 
     <item android:id="@+id/action_sort_alpha" 
android:showAsAction="ifRoom|withText"  
       android:icon="@android:drawable/ic_menu_sort_alphabetically" 
       android:title="Item4" /> 
    </menu> 
</item> 

<item 
    android:id="@+id/action_settings" 
    android:orderInCategory="100" 
    android:showAsAction="ifRoom" 
    android:title="@string/action_settings"/></menu> 
+0

Puoi spiegare perché e come questo risponde alla domanda? Cosa sta facendo il tuo codice? – Ben

0

Prova utilizzando

<item .... <any_damn_name>:showAsAction="ifRoom|withText" /> 

non dimenticate di aggiungere

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

e cercare di avere menu distinti per frammenti e globali (Impostazioni nel file di menu Global.xml)

Assicurarsi di gonfiare entrambi nell'ordine corretto.

0

menu.xml:

<item android:id="@+id/game" 
     android:icon="@drawable/menu_addnew" 
     android:title="game" 
     android:showAsAction="ifRoom"/> 
<item android:id="@+id/help" 
     android:icon="@drawable/menu_addnew" 
     android:title="help" /> 

abc.class di file rende questi cambiamenti:

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
     case R.id.game: 
      Game(); 
      return true; 
     case R.id.help: 
      Help(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

Vedi Menus documentazione.

0

creare uno stile per il troppo pieno menu e passare in una descrizione del contenuto

<style name="Widget.ActionButton.Overflow" parent="@android:style/Widget.Holo.ActionButton.Overflow"> 
    <item name="android:contentDescription">@string/accessibility_overflow</item> 
</style> 

<style name="Your.Theme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> 
    <item name="android:actionOverflowButtonStyle">@style/Widget.ActionButton.Overflow</item> 
</style> 

Chiama ViewGroup.findViewsWithText e inserisci la descrizione del contenuto. Meno così:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // The content description used to locate the overflow button 
    final String overflowDesc = getString(R.string.accessibility_overflow); 
    // The top-level window 
    final ViewGroup decor = (ViewGroup) getWindow().getDecorView(); 
    // Wait a moment to ensure the overflow button can be located 
    decor.postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      // The List that contains the matching views 
      final ArrayList<View> outViews = new ArrayList<>(); 
      // Traverse the view-hierarchy and locate the overflow button 
      decor.findViewsWithText(outViews, overflowDesc, 
        View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); 
      // Guard against any errors 
      if (outViews.isEmpty()) { 
       return; 
      } 
      // Do something with the view 
      final ImageButton overflow = (ImageButton) outViews.get(0); 
      overflow.setImageResource(R.drawable.ic_action_overflow); 

     } 

    }, 1000); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Add a dummy item to the overflow menu 
    menu.add("Overflow"); 
    return super.onCreateOptionsMenu(menu); 
} 

View.findViewsWithText stati aggiunti livello API 14 soltanto. Quindi, per favore prova a fare un metodo da te come in questo modo:

public static void findViewsWithText(List<View> outViews, ViewGroup parent, String targetDescription) { 
    if (parent == null || TextUtils.isEmpty(targetDescription)) { 
     return; 
    } 
    final int count = parent.getChildCount(); 
    for (int i = 0; i < count; i++) { 
     final View child = parent.getChildAt(i); 
     final CharSequence desc = child.getContentDescription(); 
     if (!TextUtils.isEmpty(desc) && targetDescription.equals(desc.toString())) { 
      outViews.add(child); 
     } else if (child instanceof ViewGroup && child.getVisibility() == View.VISIBLE) { 
      findViewsWithText(outViews, (ViewGroup) child, targetDescription); 
     } 
    } 
} 

Questo non è un codice testato. Quindi se ci sono problemi durante l'implementazione, per favore fatemelo sapere.

Problemi correlati