J’essaie de trouver la bonne façon d’utiliser une police personnalisée pour le titre de la barre d’outils, et de la centrer dans la barre d’outils (exigence du client).
Pour l’instant, j’utilise la bonne vieille ActionBar, et j’ai donné au titre une valeur vide, et j’ai utilisé setCustomView
pour placer ma police personnalisée dans le TextView et la centrer en utilisant ActionBar.LayoutParams.
Existe-t-il une meilleure façon de procéder ? J'utilise la nouvelle barre d'outils comme barre d'action.
Pour utiliser un titre personnalisé dans votre Toolbar
, tout ce que vous avez à faire est de vous rappeler que Toolbar
est juste un ViewGroup fantaisiste et que vous pouvez ajouter un titre personnalisé comme ceci :
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_top"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="@color/action_bar_bkgnd"
app:theme="@style/ToolBarTheme" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Toolbar Title"
android:layout_gravity="center"
android:id="@+id/toolbar_title" />
</android.support.v7.widget.Toolbar>
Cela signifie que vous pouvez donner au TextView
le style que vous souhaitez, car il s'agit d'un TextView
ordinaire. Ainsi, dans votre activité, vous pouvez accéder au titre de la manière suivante :
Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);
Nous n'avons pas d'accès direct au TextView du titre de la barre d'outils, nous utilisons donc la réflexion pour y accéder.
private TextView getActionBarTextView() {
TextView titleTextView = null;
try {
Field f = mToolBar.getClass().getDeclaredField("mTitleTextView");
f.setAccessible(true);
titleTextView = (TextView) f.get(mToolBar);
} catch (NoSuchFieldException e) {
} catch (IllegalAccessException e) {
}
return titleTextView;
}
Voici une approche dépendant du texte du titre pour trouver l'instance TextView
de la Toolbar
.
public static TextView getToolbarTitleView(ActionBarActivity activity, Toolbar toolbar){
ActionBar actionBar = activity.getSupportActionBar();
CharSequence actionbarTitle = null;
if(actionBar != null)
actionbarTitle = actionBar.getTitle();
actionbarTitle = TextUtils.isEmpty(actionbarTitle) ? toolbar.getTitle() : actionbarTitle;
if(TextUtils.isEmpty(actionbarTitle)) return null;
// can't find if title not set
for(int i= 0; i < toolbar.getChildCount(); i++){
View v = toolbar.getChildAt(i);
if(v != null && v instanceof TextView){
TextView t = (TextView) v;
CharSequence title = t.getText();
if(!TextUtils.isEmpty(title) && actionbarTitle.equals(title) && t.getId() == View.NO_ID){
//Toolbar does not assign id to views with layout params SYSTEM, hence getId() == View.NO_ID
//in same manner subtitle TextView can be obtained.
return t;
}
}
}
return null;
}