2015-10-06 5 views
16

J'ai essayé différentes combinaisons dans un fichier xml:Comment afficher l'option de menu avec l'icône et le texte dans AppCompatActivity

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     app:showAsAction="ifRoom|withText" /> 
</menu> 

ou

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     app:showAsAction="always|withText" /> 
</menu> 

ou

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     app:showAsAction="withText" /> 
</menu> 

ou

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     android:showAsAction="always|withText" /> 
</menu> 

J'ai essayé de le mettre programmaticly

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ 
     MenuItem item = menu.add(R.string.menu_create_alarm); 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_WITH_TEXT|MenuItem.SHOW_AS_ACTION_IF_ROOM); 
     item.setIcon(R.drawable.ic_action_accept); 
     item.setOnMenuItemClickListener(
      new OnMenuItemClickListener(){ 

       @Override 
       public boolean onMenuItemClick(MenuItem item){ 
        saveAlarm(); 
        return true; 
       } 
      } 
     ); 


//  inflater.inflate(R.menu.menu_create_alarm, menu); 
     super.onCreateOptionsMenu(menu, inflater); 

    } 

ou

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     android:showAsAction="always|withText" 
     app:showAsAction="always|withText" /> 
</menu> 

Cependant, seul icône apparaît. Et il y a planty de pièce, parce que je n'ai pas défini le titre de la barre d'outils. Suppression des menus et les remplacer par un bouton à l'intérieur de la barre d'outils n'est pas sutable.
Comment lire le texte?

+0

http://stackoverflow.com/questions/14932216/action-bar-sub-menu-item-with-text-and-image-not-working-pr opérationnellement – vab

+0

@vab yo faire un lien vers les réponses, avec la solution déjà répertoriée et ne fonctionne pas – Yarh

+0

Icône + texte ou texte seulement ?? – XxGoliathusxX

Répondre

13

Vous devez ajouter tools:context="your class" à balise menu

menu.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".activities.BaseActivity"> 


    <item 
     android:id="@+id/action_notification1" 
     android:icon="@drawable/three" 
     android:title="action_notification" 
     app:showAsAction="always"> 
     <menu> 
      <item 
       android:id="@+id/profile" 
       android:icon="@drawable/profile" 
       android:orderInCategory="100" 
       android:title="PROFILE" /> 

      <item 
       android:id="@+id/c" 
       android:icon="@drawable/correct_tick" 
       android:orderInCategory="100" 
       android:title="COMPLETED TRIPS" /> 

      <item 
       android:id="@+id/app" 
       android:icon="@drawable/report_issue" 
       android:orderInCategory="100" 
       android:title="REPORT ISSUES" /> 
      <item 
       android:id="@+id/r" 
       android:icon="@drawable/correct_tick" 
       android:orderInCategory="100" 
       android:title="REACHED CENTER" /> 


      <item 
       android:id="@+id/pdf" 
       android:icon="@drawable/pdf_image" 
       android:orderInCategory="100" 
       android:title="BAG INFO" /> 
      <item 
       android:id="@+id/l" 
       android:icon="@drawable/logout" 
       android:orderInCategory="100" 
       android:title="LOGOUT" /> 
     </menu> 
    </item> 


</menu> 

Override onCreateOptionsMenu()

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    menu.getItem(0).getSubMenu().getItem(3).setVisible(false); 
    menu.getItem(0).getSubMenu().getItem(4).setVisible(true); 
    return super.onCreateOptionsMenu(menu); 
} 

vous shold outil écrire: contexte balise menu alors ru n vous obtiendrez des icônes à votre texte

1

essayer ces deux ensemble

app:showAsAction="always|withText" 
android:showAsAction="always|withText" 
+0

il n'y a toujours pas de texte, seule icône – Yarh

+0

Alors que ce lien mai répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – JohanShogun

+2

où est le lien Sir @JohanShogun – Elltz

6

xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_action_accept" 
     android:orderInCategory="100" 
     android:title="@string/menu_create_alarm" 
     android:showAsAction="always|withText" 
     app:showAsAction="always|withText" /> 
</menu> 

java:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    new MenuInflater(this).inflate(R.menu.menu_frg_safetybox, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 
+1

il n'y a toujours pas de texte, seule icône – Yarh

+0

Android décide pour lui-même à la fin de la journée si elle peut adapté ou non. –

+0

comment appeler, nouveau gonfleur dans le fragment? Si je le fais @Override \t public void onCreateOptionsMenu (Menu du menu, MenuInflater inflater) { // \t \t inflater.inflate (R.menu.menu_create_level, menu); \t \t nouveau MenuInflater (getActivity()). Gonfle (R.menu.menu_create_level, menu); \t \t super.onCreateOptionsMenu (menu, inflater); \t}, j'ai toujours seulement l'icône – Yarh

1

'toujours | withText' fonctionnera s'il y a suffisamment de place, sinon placera seulement l'icône. Vous voyez cela en tournant le téléphone en mode paysage.

 <item 
     android:id="@+id/action_create_alarm" 
     android:icon="@drawable/ic_launcher" 
     android:title="Save" 
     app:showAsAction="always|withText" 
     /> 
+0

c'est correct. Si je mets l'appareil en mode paysage, le texte s'affiche. Néanmoins, je veux que le texte s'affiche toujours. Bien que mon titre dans la barre d'outils soit très court (le texte "Activité") n'apparaît pas. – murt

9
protected boolean onPrepareOptionsPanel(View view, Menu menu) { 
    if (menu != null) { 
     if (menu.getClass().getSimpleName().equals("MenuBuilder")) { 
      try { 
       Method m = menu.getClass().getDeclaredMethod(
         "setOptionalIconsVisible", Boolean.TYPE); 
       m.setAccessible(true); 
       m.invoke(menu, true); 
      } catch (Exception e) { 
       Log.e(getClass().getSimpleName(), 
         "onMenuOpened...unable to set icons for overflow menu", 
         e); 
      } 
     } 
    } 
    return super.onPrepareOptionsPanel(view, menu); 
} 
+0

Quand ma classe a prolongé l'activité, cela a fonctionné moi: http://stackoverflow.com/a/22288914/555762. Mais quand j'ai changé ma classe pour étendre AppCompatActivity, la solution précédente a cessé de fonctionner et cette réponse a sauvé ma journée =) –

+0

Merci beaucoup pour cela. Tout changement que nous devons faire dans proguard? – Atul

+0

@Atul Je ne l'ai pas testé pour proguard mais je ne pense pas que progurad a besoin de quelques changements à cause de cela. –

4
@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
//  getMenuInflater().inflate(R.menu.menu_patient_home_screen, menu); 


     menu.add(0, 1, 1, menuIconWithText(getResources().getDrawable(R.mipmap.user_2), getResources().getString(R.string.action_profile))); 
     menu.add(0, 2, 2, menuIconWithText(getResources().getDrawable(R.mipmap.add_user), getResources().getString(R.string.action_add_user))); 
     menu.add(0, 3, 3, menuIconWithText(getResources().getDrawable(R.mipmap.switch_profile), getResources().getString(R.string.action_switch_profile))); 
     menu.add(0, 4, 4, menuIconWithText(getResources().getDrawable(R.mipmap.logout), getResources().getString(R.string.action_sign_out))); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     switch (item.getItemId()) { 
      case 1: 
       Toast.makeText(PatientHomeScreen.this, "Profile is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case 2: 
       Toast.makeText(PatientHomeScreen.this, "Add New User is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case 3: 
       Toast.makeText(PatientHomeScreen.this, "Switch Profile is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case 4: 
       Toast.makeText(PatientHomeScreen.this, "Sign Out is Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    private CharSequence menuIconWithText(Drawable r, String title) { 

     r.setBounds(0, 0, r.getIntrinsicWidth(), r.getIntrinsicHeight()); 
     SpannableString sb = new SpannableString(" " + title); 
     ImageSpan imageSpan = new ImageSpan(r, ImageSpan.ALIGN_BOTTOM); 
     sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

     return sb; 
    } 

Screen shot of emulator

Espérons que cela vous aidera

+0

La solution ci-dessus fonctionne bien. Si vous travaillez dans Fragment, vous n'avez besoin de changer qu'une seule chose, modifiez onCreateOptionsMenu (menu Menu) avec onCreateOptionsMenu (menu Menu, MenuInflater inflater). et ajoutez setHasOptionsMenu (true) dans onCreate (Bundle savedInstanceState) ou View onCreateView (LayoutInflater inflater ....) –

2

Ajouter à la answer de dev_ry, il existe un moyen beaucoup plus lisse, sans utiliser la réflexion par juste la coulée et la suppression l'avertissement API restreint:

import android.support.v7.view.menu.MenuBuilder; 

@SuppressLint("RestrictedApi") 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    if (menu instanceof MenuBuilder) { 
     ((MenuBuilder) menu).setOptionalIconsVisible(true); 
    } 
    getMenuInflater().inflate(R.menu.menu, menu); 
    return super.onCreateOptionsMenu(menu); 
}