web-dev-qa-db-fra.com

Obtention du titre ActionBar TextView avec AppCompat v7 r21

J'ai une bibliothèque qui nécessite d'utiliser la couleur de TextView pour le titre ActionBar. Avant AppCompat v7 r21, je pouvais simplement trouver ViewById et obtenir directement la couleur de la vue. Cependant, pour une raison quelconque, cela ne fonctionne pas. La vue est toujours nulle. J'ai écrit du code qui analyse la totalité de la hiérarchie des vues et imprime les identifiants, types et valeurs de tous les TextViews. La vue du titre n'avait pas d'identifiant, ce que je trouve très bizarre.

Une chose que j'ai remarquée, c'est que lorsque j'ai essayé d'obtenir la barre d'action, une barre d'outils a été renvoyée (même si je n'ai pas utilisé de barre d'outils dans mon application). J'ai donc itéré sur les vues des enfants de la barre d'outils et chaque fois qu'un TextView était trouvé, je comparais sa valeur textuelle à toolbar.getTitle () afin de m'assurer que c'est bien le TextView que je cherchais. Pas idéal et je ne suis pas sûr que cela fonctionne dans tous les cas.

Est-ce que quelqu'un sait quelle pourrait être la solution la plus sûre?

15
Ahmed Nawara

Pas besoin de créer votre propre TextView, il suffit de parcourir les enfants de la barre d'outils pour obtenir le titre intégré.

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// loop through all toolbar children right after setting support 
// action bar because the text view has no id assigned

// also make sure that the activity has some title here
// because calling setText() with an empty string actually
// removes the text view from the toolbar

TextView toolbarTitle = null;
for (int i = 0; i < toolbar.getChildCount(); ++i) {
    View child = toolbar.getChildAt(i);

    // assuming that the title is the first instance of TextView
    // you can also check if the title string matches
    if (child instanceof TextView) {
        toolbarTitle = (TextView)child;
        break;
    }
}
22
headsvk

Généralement, lorsque j'utilise la barre d'outils dans mes cas, si je fais quelque chose de personnalisé avec le titre, je vais simplement gonfler la vue du titre manuellement, puis définir ses attributs en XML. Le but de la barre d’outils est d’empêcher que de tels événements ne se produisent, pour que vous puissiez mieux contrôler l’apparence de votre barre d’outils.

    <Android.support.v7.widget.Toolbar
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        Android:id="@+id/my_awesome_toolbar"
        Android:layout_height="@dimen/standard_vertical_increment"
        Android:layout_width="match_parent"
        Android:minHeight="@dimen/standard_vertical_increment"
        Android:background="@drawable/actionbar_background">


        <TextView
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            Android:id="@+id/toolbar_title"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="@color/Red" />

    </Android.support.v7.widget.Toolbar>

Ensuite, dans le code, vous feriez quelque chose comme ceci:

Toolbar toolbar = findViewById(R.id.my_awesome_toolbar);
//Get rid of the title drawn by the toolbar automatically
toolbar.setTitle("");
TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
toolbarTitle.setTextColor(Color.BLUE);

Je sais que c’est un article plus ancien, mais c’est la meilleure méthode que j’ai trouvée pour autoriser la couleur et les polices de texte personnalisées dans la barre d’outils. 

19
Jawnnypoo

Vous pouvez faire comme ça.

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
TextView title=(TextView )toolbar.getChildAt(0);

C'est un travail pour moi.

1
Rahul Giradkar

edit (septembre 2018): ne l'utilisez pas à partir d'Android P La réflexion sur le SDK Android peut faire exception à la règle!

Je l'ai eu en utilisant la réflexion.

toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("Title"); //important step to set it otherwise getting null
TextView title = null;
try{
        Field f = toolbar.getClass().getDeclaredField("mTitleTextView");
        f.setAccessible(true);
        title = (TextView) f.get(toolbar);
        title.setText("I have title TextView");
} catch(Exception e){
        e.printStackTrace();
}

Veuillez noter que cela fonctionne si la barre d’outils est pas définie pour prendre en charge ActionBar ...

setSupportActionBar(toolbar); // with this set text view behave differently 
                              //and text may not be visible...
1
smory

Voici un moyen d’obtenir le titre à l’avenir, au cas où Android changerait l’ordre des icônes et du texte.

//If you just want to set the text
ActionBar actBar = getSupportActionBar();
if(actBar != null) {
    actBar.setTitle(R.string.your_ab_title);
}

//If you want to customize more than the text    
Toolbar ab = findViewById(R.id.action_bar);
if(ab != null){
    for (int i= 0; i < ab.getChildCount(); i++){
        View child = ab.getChildAt(i);
        if(child instanceof TextView) {
            //You now have the title textView. Do something with it
        }
     }
}
0
Chris Sprague