Android obsédant: Ellipsize sur le sous-titre ActionBar
-
28-10-2019 - |
Question
Mon activité utilise le ActionBar.setSubtitle
Fonction Pour afficher le chemin complet de l'emplacement du système de fichiers actuellement affiché. Cela signifie que la sous-chaîne vers la fin du sous-titre est plus pertinente que le début, alors j'ai pensé l'emporter sur le ActionBar
Style pour Ellipsize Text au début, plutôt que la fin, comme ainsi:
res / valeurs / themes.xml
<style name="Theme.Holo" parent="android:Theme.Holo">
<!-- Action bar styles -->
<item name="android:actionBarStyle">@style/Widget.Holo.ActionBar</item>
</style>
res / valeurs / styles.xml
<style name="Widget.Holo.ActionBar" parent="@android:style/Widget.Holo.ActionBar">
<item name="android:subtitleTextStyle">@style/TextAppearance.Holo.Widget.ActionBar.Subtitle</item>
</style>
<style name="TextAppearance.Holo.Widget.ActionBar.Subtitle"
parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Subtitle">
<item name="android:ellipsize">start</item>
</style>
Lorsque j'installe ceci sur mon appareil ICS (Nexus S), le texte est toujours (incorrectement) ellipsédé à la fin. Si je modifie ma version de TextAppearance.Holo.Widget.ActionBar.Subtitle
Inclure un article pour android:textSize
, la taille du texte du sous-titre est modifiée en conséquence, il semblerait donc que je pousse dans le bon style; Je ne peux pas comprendre pourquoi il ne d'honore pas mon android:ellipsize
passer outre.
Pour mettre tout cela dans un format de question: comment puis-je remplacer, en utilisant des styles / thèmes, le android:ellipsize
propriété de la vue de sous-titre dans le ActionBar
?
La solution
Il me semble que ce n'est pas possible avec les thèmes et les styles, mais j'ai trouvé une solution de contournement pour définir la valeur EllipSize dans l'exécution.
Le plus difficile est de trouver TextView de titre (ou de sous-titre), car l'ID de cette vue est dans le package Android interne.
Vous avez donc besoin de créer une classe de stub dans votre projet
package com.android.internal;
public class R {
public static final class id {
public static int action_bar_title = 0;
public static int action_bar_subtitle = 0;
}
}
Après cela, vous devez trouver cette vue dans le code (je le fais avec le code suivant, il fonctionne à la fois avec Sherlock et les barres d'action par défaut)
public class ActionBarUtils {
public static TextView getActionbarTitle(Activity activity) {
TextView title = (TextView) activity.findViewById(R.id.abs__action_bar_title);// for ActionBarSerlock
if (title == null) title = (TextView) activity.findViewById(com.android.internal.R.id.action_bar_title);// for default action bar
return title;
}
}
Vous pouvez maintenant définir la valeur EllipSize dans le code d'activité:
getActionBarTitle().setEllipsize(TextUtils.TruncateAt.MIDDLE)
PS: Assurez-vous que vous appelez getActionBartitle lorsque le titre est visible (après SetDisplayShowTitleenabled (true) Call), sinon vous obtiendrez NullPointerException.
PPS: Si vous utilisez une obscurcissement progressive, vous devez ajouter dans Proguard.cfg:
-keep class com.android.internal.R*{
*;
}