IndeterminateProgressBar в стиле ActionBar - проблема с заполнением

Я хочу поставить неопределенный индикатор выполнения внутри моего ActionBar (используя ActionBarSherlock). Все работает, но я хочу, чтобы это был небольшой индикатор прогресса. Я использую следующий стиль:

<style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar.Small">
    <item name="android:progressBarPadding">32dp</item>
    <item name="progressBarPadding">32dp</item>
    <item name="android:itemPadding">32dp</item>
    <item name="itemPadding">32dp</item>
</style>


<style name="Widget.Styled.ActionBar.Tiles" parent="Widget.Sherlock.Light.ActionBar">
    <item name="android:indeterminateProgressStyle">@style/IndeterminateProgress</item>
    <item name="android:progressBarPadding">32dp</item>
    <item name="progressBarPadding">32dp</item>
    <item name="android:itemPadding">32dp</item>
    <item name="itemPadding">32dp</item>
</style>

Проблема заключается в том, что я не могу установить дополнение на индикатор выполнения. Как вы можете видеть выше, я пробовал все возможные комбинации itemPadding и progressBarPadding и т.д.

Результат всегда один и тот же: enter image description here

Любые идеи?

Ответ 1

Я нашел рабочее решение, как установить неопределенный индикатор выполнения с правильным размером и дополнением. Мое решение не использует обходное решение с setActionView(). Это решение для встроенных функций индикатора выполнения, поддерживаемых встроенной панелью действий (ActionBarSherlock). Индикатор выполнения активирован/отключен с помощью метода setProgressBarIndeterminateVisibility (boolean). Я тестировал его на Android 2, 3, 4 и ldpi, mdpi, xhdpi.

Result

AndroidManifest.xml:

<application
    ...
    android:theme="@style/Theme.Example">

/res/values/styles.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    ...

    <style name="Theme.Example" parent="Theme.Sherlock">
        <item name="actionBarStyle">@style/Example.ActionBar</item>
        <item name="android:actionBarStyle">@style/Example.ActionBar</item>
    </style>

    <style name="Example.ActionBar" parent="Widget.Sherlock.ActionBar">
        <item name="indeterminateProgressStyle">@style/Example.ActionBar.IndeterminateProgressBar</item>
        <item name="android:indeterminateProgressStyle">@style/Example.ActionBar.IndeterminateProgressBar</item>
    </style>

    <style name="Example.ActionBar.IndeterminateProgressBar" parent="@android:style/Widget.ProgressBar.Large.Inverse">
        <item name="android:indeterminateDrawable">@drawable/layer_list_ab_indeterminate_progress_bar</item>
        <item name="android:minWidth">@dimen/ab_indeterminate_progress_bar_size</item>
        <item name="android:maxWidth">@dimen/ab_indeterminate_progress_bar_size</item>
        <item name="android:minHeight">@dimen/ab_indeterminate_progress_bar_size</item>
        <item name="android:maxHeight">@dimen/ab_indeterminate_progress_bar_size</item>
    </style>
</resources>

/res/drawable/layer_list_ab_indeterminate_progress_bar.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <!--
        /res/drawable-mdpi/ab_indeterminate_progress_bar asset is taken from
        /sdk/platforms/android-18/data/res/mdpi/spinner_white_48.png
        and its content (optical square) is resized to ~0.6 (must be even number)

        /res/drawable-mdpi-v14/ab_indeterminate_progress_bar asset is taken from
        /sdk/platforms/android-18/data/res/mdpi/spinner_48_outer_holo.png
        and its content (optical square) is resized to 0.75
        -->
        <rotate
            android:drawable="@drawable/ab_indeterminate_progress_bar"
            android:interpolator="@android:anim/linear_interpolator"
            android:pivotX="50%"
            android:pivotY="50%"
            android:fromDegrees="0"
            android:toDegrees="360" />
    </item>
</layer-list>

/res/values/dimens.xml:

<dimen name="ab_indeterminate_progress_bar_size">48dp</dimen>

Наконец, я создал активацию промежуточных баров. Я использовал эти два актива из Android SDK:

  • /sdk/platforms/android-18/data/res/mdpi/spinner_white_48.png для сотовых и старых
  • /sdk/platforms/android-18/data/res/mdpi/spinner_48_outer_holo.png для ICS и более новых

Чтобы получить правильный размер и дополнение, нам нужно изменить размер активов. Я изменил размер spinner_white_48.png на ~ 0.6. Для mdpi это было 28px. Это должно быть четное число, которое будет центрально-симметричным. Я изменил только содержимое, а не весь значок. Таким образом, значок в mdpi имеет 48px, но его содержимое (оптический квадрат) меньше (28px). Вы можете легко изменить размер содержимого таким образом: сначала измените размер изображения на 28px X 28px, затем измените размер "холста" на 48px X 48px. Я изменил размер spinner_48_outer_holo.png на 0,75. Вы можете загрузить перечисленные ниже ресурсы.

Почему я использую разные активы для Honeycomb- и ICS +? Потому что, если я использую только активы Holo, анимация немного разрывается на некоторых устройствах с Honeycomb -.

Совет. Вы можете добавить еще один элемент с некоторой анимацией в layer_list_ab_indeterminate_progress_bar.xml. Например, стандартный индикатор прогресса Холо использует 2 анимации в противоположном направлении и в разных градусах. См. Progress_medium_holo.xml в SDK.

/res/drawable-mdpi/ab_indeterminate_progress_bar.png:

enter image description here

/res/drawable-mdpi-v14/ab_indeterminate_progress_bar.png(почти не видно на этой странице):

enter image description here

/res/drawable-hdpi/ab_indeterminate_progress_bar.png:

enter image description here

/res/drawable-hdpi-v14/ab_indeterminate_progress_bar.png(почти не видно на этой странице):

enter image description here

/res/drawable-xhdpi/ab_indeterminate_progress_bar.png:

enter image description here

/res/drawable-xhdpi-v14/ab_indeterminate_progress_bar.png(почти не видно на этой странице):

enter image description here

Ответ 2

Я не знаю точного ответа, но эти настройки работали для меня.

Это мой refresh_spinner.xml

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center">
<ProgressBar android:layout_width="32dp"
 android:layout_height="32dp"
 android:layout_gravity="center"
 android:layout_marginRight="12dp"
 android:layout_marginLeft="12dp"
 style="?indeterminateProgressStyle" />
    </FrameLayout>

И это в соответствующем стиле xml

<style name="Widget.MyTheme.ActionBar" parent="Widget.Sherlock.ActionBar">
    <item name="indeterminateProgressStyle">?android:attr/progressBarStyleSmallInverse</item>
</style>

Эти настройки работали для меня. Пожалуйста, дайте мне знать, если у вас есть какие-либо сомнения.

Отношения Парваз Бхаскар

EDIT2: поскольку я пытался использовать разные методы, я в конечном итоге использовал? android: attr/progressBarStyleSmallInverse как единственное свойство в моем стиле .xml, которое я позже переопределил из моего spinner xml под стилем как style = "? indeterminateProgressStyle"

EDIT: сохраняйте ссылку на свой пункт меню, и всякий раз, когда вы хотите показать индикатор прогресса, используйте setActionView (R.layout.your_layout) и измените его на нулевое, когда это будет необходимо. onCreateOptionsMenu будет хорошим местом для захвата элемента меню при запуске.

Ответ 3

Я встречаюсь с этим сегодня и нахожу решение для Android 3/4 +

ProgressBar mProgressBarInActionBar = null;
Resources res = Resources.getSystem();
int id = res.getIdentifier("progress_circular", "id", "android");
View internal = findViewById(id);
if(internal != null && internal instanceof ProgressBar){
    mProgressBarInActionBar = (ProgressBar)internal;
}
mProgressBarInActionBar.setPadding(0, 0, right, 0);

Установите подходящий правый:)

Ответ 4

У меня была та же проблема, и я нашел легкий ответ:

<style name="ActionBarProgressBar.MyStyle" parent="@android:style/Widget.Holo.ProgressBar.Large">
        <item name="android:minWidth">56dp</item>
        <item name="android:maxWidth">56dp</item>
        <item name="android:minHeight">35dp</item>
        <item name="android:maxHeight">35dp</item>
</style>

Ширина - это стандартная ширина элемента панели действий. Если вы измените minHeight и maxHeight, изображение будет масштабироваться в обоих направлениях.

И вот стиль Actionbar, где вы задаете внешний вид Неопределенного Прогресса:

<style name="action_bar_theme" parent="@android:style/Widget.Holo.ActionBar">
        <item name="android:indeterminateProgressStyle">@style/ActionBarProgressBar.MyStyle</item>
</style>

И определение в используемой вами теме (не забудьте использовать ее в своем манифесте):

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/action_bar_theme</item>     
</style>

Cheers, Пол