Стилизация неопределенного индикатора выполнения в ActionBar - PullRequest
18 голосов
/ 06 февраля 2012

Я хотел бы поместить прогрессбар на панель действий, но установка

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);  
setProgressBarIndeterminateVisibility(true);

на onCreate метод дает средний размер прогрессирующего бара (48dip x 48dip), я думаю.Я хочу изменить размер progressBar, но я не могу найти, как это сделать.Можете ли вы помочь мне, пожалуйста?

Ответы [ 7 ]

28 голосов
/ 06 февраля 2012

Вам нужно будет создать свой собственный стиль для применения к панели действий.Об этом можно прочитать в блоге разработчиков Android. Чтобы оформить промежуточный индикатор выполнения, попробуйте использовать indeterminateProgressStyle и Widget.ProgressBar.Small.Вот быстрый пример.

<style name="YourTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/ActionBarIPS</item>
</style>

<style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar">
    <item name="android:indeterminateDrawable">@drawable/ic_launcher</item>
</style>

<style name="ActionBarIPS" parent="@android:style/Widget.ActionBar">
    <item name="android:indeterminateProgressStyle">@style/IndeterminateProgress</item>
    <item name="android:background">@color/white</item>
</style>
15 голосов
/ 14 ноября 2012

Стилизованный анимированный значок неопределенного индикатора выполнения на панели действий:

1. Определите res / values ​​/ styles.xml (в этом примере библиотека Sherlock используется для предоставления панели действий в старых версиях Android, поэтому, если вы не используете Sherlock, вам следует использовать соответствующих родителей для определения своих пользовательских стилей):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="Theme.Sherlock">
        <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
        <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
    </style>

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

    <style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar.Small"> 
       <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_custom</item> 
    </style> 
</resource>

2. Определите res / drawable / progress_indeterminate_custom.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
    <rotate
        android:drawable="@drawable/ic_progress_logo1"
        android:fillAfter="true"
        android:fromDegrees="-180"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="180" />
    </item>
     <item>
    <rotate
        android:drawable="@drawable/ic_progress_logo2"
        android:fillAfter="true"
        android:fromDegrees="180"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="-180" />
</item>
</layer-list>

3. Вышеупомянутый код использует 2 изображения (ic_progress_logo1 и ic_progress_logo2) в качестве пользовательского индикатора неопределенности прогресса. Вы можете использовать столько изображений / рисунков, сколько хотите, добавляя новые элементы. Также вы можете применять разные эффекты / анимацию. Больше информации здесь: Анимационные ресурсы

4.Применить стиль, который вы создали, используя AndroidManifest.xml:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" 
    android:name=".application.MyApplication">
    <activity
        android:name=".activities.MyActivity"
        android:label="@string/app_name"
        android:theme="@style/MyTheme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

5. Наслаждайтесь своим неопределенным значком анимированного пользовательского прогресса: D

8 голосов
/ 11 марта 2014

Я боролся со всеми этими решениями, потому что я не использовал actionbarsherlock. Я воспользовался ответом Власто Бенни Лавы, который изначально не работал для меня.

Вот что я сделал шаг за шагом:

1) откройте ваш файл styles.xml, он должен быть в /res/values/styles.xml. Если его не существует, создайте его.

2) вставить в:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="myTheme" parent="android:Theme.Holo">
        <item name="android:actionBarStyle">@style/ActionBar.MyStyle</item>
    </style>

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

    <style name="ActionBarProgressBar.MyStyle" parent="@android:style/Widget.Holo.ProgressBar.Small">
        <item name="android:minWidth">28dp</item>
        <item name="android:maxWidth">28dp</item>
        <item name="android:minHeight">28dp</item>
        <item name="android:maxHeight">28dp</item>
    </style> 
</resources>

Одна ловушка, с которой я столкнулся, вы не можете использовать название темы "AppTheme", иначе переопределения не будут работать. Я использовал "MyTheme". Эта тема использует Holo, поэтому она имеет черный ActionBar, как показано на рисунке ниже. Если вы хотите иметь панель действий белого цвета, тогда, конечно, замените android:Theme.Holo на android:Theme.Holo.Light и т. Д.

3) Редактировать AndroidManifest.xml.

ваш <application> должен содержать android:theme="@style/myTheme", чтобы приложение использовало ваши стили переопределения с styles.xml

т.е. мой файл тегов приложения манифеста выглядит примерно так:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/myTheme"
    android:name="Application Name Here" >

Поскольку вы просто уменьшаете размер существующего файла png, вам не нужно экспортировать изображения и перемещать их в место для рисования и т. Д.

Вот как выглядит моя, размер иконки для меня идеален.

enter image description here

2 голосов
/ 23 января 2014

Чтобы сделать ProgressBar на ActionBar меньше , вам нужно переопределить Widget.Holo.ProgressBar.Small, например,

<style name="Theme.MyStyle" parent="@style/Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="actionBarStyle">@style/ActionBar.MyStyle</item>
    ...
</style>

<style name="ActionBar.MyStyle" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">
    ...
    <item name="android:indeterminateProgressStyle">@style/ActionBarProgressBar.MyStyle</item>
    ...
</style>

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

и установить размер в соответствии с вашими предпочтениями.

2 голосов
/ 31 марта 2012

Для ActionBarSherlock вы можете изменить неопределенный прогресс, поставив в скобки Widget.ProgressBar.Small, это должно работать и без Шерлока.

Я извлек чертежи из папки android-15 res в SDK, не забудьте захватить progress_small_white.xml и связанный ресурс.

 <?xml version="1.0" encoding="utf-8"?>
 <resources>
     <style name="Dark" parent="Theme.Sherlock">
         <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
         <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
     </style>

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

      <style name="IndeterminateProgress" parent="@android:style/Widget.ProgressBar.Small"> 
        <item name="android:indeterminateDrawable">@drawable/progress_small_holo</item> 
    </style> 
 </resource>
1 голос
/ 25 июля 2014

Вставьте код ниже в ваш метод on Create и запустите этот столбец ниже в промежуточном режиме.
Если вы хотите показать процент прогресса, тогда прокомментируйте progressBar.setIndeterminate(true); метод и раскомментируйте progressBar.setProgress(65) метод и поддерживайте ваш прогресс

       progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal);
       progressBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 24));
     //progressBar.setProgress(65);
     //progressBar.setBackgroundDrawable(getResources().getDrawable(R.color.lock_background_greeen));
      progressBar.setIndeterminate(true);

    // retrieve the top view of our application
      final FrameLayout decorView = (FrameLayout) getWindow().getDecorView();
      decorView.addView(progressBar);


      ViewTreeObserver observer = progressBar.getViewTreeObserver();
      observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            View contentView = decorView.findViewById(android.R.id.content);
            progressBar.setY(contentView.getY() - 10);

            ViewTreeObserver observer = progressBar.getViewTreeObserver();
            observer.removeGlobalOnLayoutListener(this);
        }
    });
0 голосов
/ 29 декабря 2015

Я должен быть совместим со старыми версиями Android SDK, поэтому я должен был сохранить его простым и использовать:

styles.xml

 <style name="TallerTitleBarDialogThemeStyle" parent="@android:style/Theme.Dialog">
    <item name="android:windowTitleSize">36dp</item>
</style>

AndroidManifest.xml

android:theme="@style/TallerTitleBarDialogThemeStyle"

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

...