Переопределение Android: многоточие на субтитрах ActionBar - PullRequest
4 голосов
/ 15 января 2012

Моя деятельность использует функцию ActionBar.setSubtitle для отображения полного пути к отображаемой в настоящий момент папке файловой системы.Это означает, что подстрока ближе к концу субтитра является более релевантной, чем начало, поэтому я подумал, что я бы переопределил стиль ActionBar для эллиптического текста в начале, а не в конце, например:

res / values ​​/ themes.xml

<style name="Theme.Holo" parent="android:Theme.Holo">
    <!-- Action bar styles -->
    <item name="android:actionBarStyle">@style/Widget.Holo.ActionBar</item>
</style>

res / values ​​/ 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>

Когда я устанавливаю это на мойУстройство ICS (Nexus S), текст по-прежнему (неправильно) в конце имеет многоточие.Если я изменю свою версию TextAppearance.Holo.Widget.ActionBar.Subtitle, включив в нее элемент для android:textSize, размер текста субтитра будет соответствующим образом изменен, так что может показаться, что я ковыряюсь в правильном стиле;Я просто не могу понять, почему он не соблюдает мое android:ellipsize переопределение.

Чтобы перевести все это в формат вопроса: как я могу переопределить, используя стили / темы, свойство android:ellipsize субтитрапросмотр в ActionBar?

1 Ответ

10 голосов
/ 16 июля 2012

Мне кажется, что это невозможно с темами и стилями, но я нашел обходной путь для установки значения размера эллипса во время выполнения.

Самое сложное - это найти заголовок (или подзаголовок) TextView, потому чтоидентификатор этого представления находится во внутреннем пакете Android.

Так что вам нужно создать класс заглушки в вашем проекте

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;
}

}

После этого вам нужно найти это представление в коде (я делаю это сследующий код, он работает как с sherlock, так и с панелями действий по умолчанию)

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;
}
}

Теперь вы можете установить значение эллипса в коде активности:

getActionBarTitle().setEllipsize(TextUtils.TruncateAt.MIDDLE)

PS: убедитесь, чтоВы вызываете getActionBarTitle, когда заголовок виден (после вызова setDisplayShowTitleEnabled (true)), в противном случае вы получите NullPointerException.

PPS: если вы используете обфускацию proguard, вы должны добавить в proguard.cfg:

-keep class com.android.internal.R*{
    *;
}
...