web-dev-qa-db-fra.com

Dynamic TextView sur ActionBar

J'ai besoin d'implémenter un TextView dans le ActionBar. Cette TextView affiche l’état de la connexion Bluetooth, elle sera donc mise à jour en fonction de cet état.

Je ne parle pas de changer le titre de la barre d’action, mais d’ajouter une ficher textview. sous le titre ou à droite.

Pour le moment, ce que j'ai fait est de créer un élément dans le menu.xml:

<item
    Android:id="@+id/statusTextview"
    Android:actionViewClass="Android.widget.TextView"
    Android:showAsAction="ifRoom"
    Android:title="Disconected" />

Ajoutez-le ensuite à l'activité principale:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.bluetooth, menu);
    return true;
}
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
    final MenuItem menuItem = menu.findItem(R.id.statusTextview);
    tvStatus = (TextView) menuItem.getActionView();
    return super.onPrepareOptionsMenu(menu);
}

Mais cela ne fonctionne pas correctement. À la première fois, devrait afficher le statut Disconnected et ne rien afficher. Ensuite, lorsque le statut change et que la vue texte doit être mise à jour, unNPEest lancé.

13
masmic

Vous pouvez ajouter TextView manuellement dans 

@Override
public boolean onCreateOptionsMenu(Menu menu) {

En suivant le code.

TextView tv = new TextView(this);
            tv.setText(getString(R.string.matchmacking)+"  ");
            tv.setTextColor(getResources().getColor(R.color.WHITE));
            tv.setOnClickListener(this);
            tv.setPadding(5, 0, 5, 0);
            tv.setTypeface(null, Typeface.BOLD);
            tv.setTextSize(14);
            menu.add(0, FILTER_ID, 1, R.string.matchmacking).setActionView(tv).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

et si vous voulez accéder à la vue texte, faites alors tv en tant que variable de classe.

20
Yashdeep Patel

Juste au cas où quelqu'un aurait encore besoin de ça: 

Vous pouvez définir de manière dynamique la propriété text de l'élément de menu en appelant la méthode setTitle("Your new string or String resource id") sur l'élément de menu. De cette façon, vous n'avez pas besoin de convertir ActionView en TextView. Par exemple:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    String bluetoothStatus = "Connected"; //get from source

   menu.findItem(R.id.the_id_of_the_menu_item).setTitle(bluetoothStatus);
    return super.onPrepareOptionsMenu(menu);
}
1
Pens Naku