Je veux quelque chose comme ça:
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
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);
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.
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;
}
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);