ActionBar中的不确定进度条样式-填充问题

14

我想在我的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>
问题是我无法设置进度条的填充。正如您在上面看到的,我已尝试了每种可能的itemPaddingprogressBarPadding 等组合。

结果始终相同: enter image description here

有任何想法吗?

4个回答

10

我找到了一个有效的解决方案,可以设置大小合适、内边距恰当的不确定进度条。我的解决方案没有使用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 用于 Honeycomb和更早版本
  • /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添加带有某些动画的另一个项目。 例如,标准Holo进度条使用两个具有相反方向和不同度数范围的动画。 在SDK中查看progress_medium_holo.xml。

/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


真的没有办法在不制作自定义可绘制对象和调整资源大小的情况下实现这一点吗?通过在样式中设置minWidthminHeightmaxWidthmaxHeight可以几乎达到所需的效果,但是ProgressBar出现在非常角落(没有3个点的溢出菜单图标看起来很糟糕)。在样式中设置paddinglayout_margin没有任何影响。为什么!为什么!!? - janakagamini

1
我不确定确切的答案,但是这些设置对我有用...
这是我的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>

这些设置对我很有用。 如果您有任何疑问,请告诉我。
敬礼 Parvaz Bhaskar 编辑2:由于我尝试了不同的方法,最终我在我的style.xml中只使用了?android:attr/progressBarStyleSmallInverse属性,然后我在我的spinner xml中引用它作为style,如style="?indeterminateProgressStyle"
编辑: 保留menuItem的引用,每当需要显示刷新进度条时,使用setActionView(R.layout.your_layout),并在需要时将其更改为null。onCreateOptionsMenu是在开始时抓取menuItem的好地方。

1
谢谢,但它没有起作用。说实话,我不知道它应该如何工作,因为您在样式中没有引用文件refresh_spinner.xml。您确定您的意思是在ActionBar内部使用ProgressBar吗? - Michał Klimczak
抱歉,我忘了提到。当我点击menuItem时,我会使用menuItem.setActionView(R.layout.refresh_spinner)来替换它,并使用menuItem.setActionView(null)将其改回正常状态以删除并保留原始图标。 - Parvaz Bhaskar
我知道使用Action View的解决方案。我正在寻找内置于ActionBar实现中的ProgressBar功能的解决方案 - setProgressBarIndeterminateVisibility(true)。无论如何,还是谢谢 :) - Michał Klimczak

1

我曾经遇到同样的问题,但我找到了一个简单的答案:

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

宽度是标准的动作栏项宽度。如果您更改了最小高度和最大高度,则图像将双向缩放。

下面是动作栏样式,您可以在其中设置不确定进度的外观:

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

1

今天我遇到了这个问题并为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);

设置一个合适的 右侧 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接