web-dev-qa-db-fra.com

Comment obtenir du texte sur une icône ActionBar?

Je veux quelque chose comme ça:

enter image description here

La 3ème icône est pour les notifications et c'est juste une image png maintenant. Est-il possible de faire quelque chose, afin que je puisse changer le texte/numéro, c'est-à-dire .., 03 par programme pour afficher le nombre réel de notifications.

Merci

40
Archie.bpgc

Voici un exemple de code qui a fonctionné pour moi.

1: Créez une mise en page pour votre élément de menu de badge.

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="48dp"
    Android:layout_height="fill_parent"
    Android:layout_gravity="right" >

    <!-- Menu Item Image -->
    <ImageView
        Android:layout_width="48dp"
        Android:layout_height="fill_parent"
        Android:clickable="true"
        Android:src="@drawable/bkg_actionbar_notify_off" />

    <!-- Badge Count -->    
    <TextView
        Android:id="@+id/actionbar_notifcation_textview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:padding="@dimen/padding_small"
        Android:text="99"
        Android:textColor="@color/holo_orange_dark" />

</RelativeLayout>

2: Créez un élément de menu dans res/menu et définissez l'actionLayout sur votre mise en page

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item
        Android:id="@+id/badge"
        Android:actionLayout="@layout/actionbar_badge_layout"
        Android:icon="@drawable/icn_menu_posts"
        Android:showAsAction="always">
    </item>
</menu>

3: Ensuite, dans onCreateOptionsMenu de votre activité ou fragment, vous pouvez faire quelque chose comme ça ...

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.badge, menu);

    RelativeLayout badgeLayout = (RelativeLayout) menu.findItem(R.id.badge).getActionView();
    TextView tv = (TextView) badgeLayout.findViewById(R.id.actionbar_notifcation_textview);
    tv.setText("12");
}

Remarque: Si vous souhaitez modifier le nombre de badges ultérieurement, vous pouvez stocker une référence à l'objet Menu transmis à onCreateOptionsMenu et utiliser le même code pour obtenir la vue requise et définir une valeur.

=== Avertissement ApCompat ============================================= =====

Si vous utilisez AppCompatActivity, vous devez définir l'actionView dans onCreateOptionsMenu

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main_menu, menu);
      MenuItem item = menu.findItem(R.id.badge);
      MenuItemCompat.setActionView(item, R.layout.actionbar_badge_layout);
      RelativeLayout notifCount = (RelativeLayout) MenuItemCompat.getActionView(item);

    TextView tv = (TextView) notifCount.findViewById(R.id.actionbar_notifcation_textview);
    tv.setText("12");

    return super.onCreateOptionsMenu(menu);
122
speedynomads

Une option consiste à créer votre propre vue d'action pour cela. Utilisez Android:actionLayout Dans le XML et getActionView() dans Java après gonflage pour le manipuler. Votre vue d'action serait un ImageView (pour le icône) et ... quelque chose pour le badge. Je pense que vous constaterez qu'il sera difficile d'essayer de créer ce badge via du texte, et que vous êtes mieux servi avec un tas d'images de badge, dont une que vous superposez sur l'icône (par exemple, via RelativeLayout ou FrameLayout, ou en enveloppant l'icône dans un LayerListDrawable).

Une autre option consiste simplement à avoir N versions de l'icône + badge, peut-être enveloppées dans un LevelListDrawable, que vous choisissez au moment de l'exécution.

8
CommonsWare

J'ai dû apporter quelques modifications aux réponses de domji84. Pour une raison quelconque, le fait de cliquer sur imageview n'appelait pas l'événement click, cela fonctionne trouver après avoir supprimé le clicklabe = "true" de la vue d'image.

menu_item_cart.xml

    <!-- Menu Item Image -->
    <ImageView
        Android:layout_width="30dp"
        Android:layout_height="wrap_content"
        Android:src="@mipmap/ic_launcher" />

    <!-- Badge Count -->
    <TextView
        Android:id="@+id/cartCountTextView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentRight="true"
        Android:padding="5dp"
        Android:layout_marginTop="5dp"
        Android:text="99"
        Android:textColor="@Android:color/white"
        Android:textStyle="bold"/>

</RelativeLayout>

menu_main.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_settings"
        Android:title="@string/action_settings"
        Android:orderInCategory="100"
        app:showAsAction="never" />

    <item
        Android:id="@+id/action_cart"
        Android:title="test"
        app:actionLayout="@layout/menu_item_cart_count"
        app:showAsAction="always">
    </item>
</menu>

Code d'activité

@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_main, menu);
    menu.findItem(R.id.action_cart).getActionView().setOnClickListener(this);
    return true;
}
1
Vihaan Verma

Ici, vous pouvez utiliser la barre d'action personnalisée avec la barre d'action par défaut ... préparez d'abord la mise en page en XML ou Java, puis utilisez les matrices d'affichage et obtenez le gestionnaire de fenêtres. comme ça

            DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    ActionBar ab = getSupportActionBar();
    View mactionbar = getLayoutInflater().inflate(R.layout.main2, null);
0
Prashant