【问题标题】:indeterminateProgressBar in ActionBar styling - padding issueActionBar 样式中的 indeterminateProgressBar - 填充问题
【发布时间】:2013-03-20 09:36:15
【问题描述】:

我想在我的 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等所有可能的组合。

结果总是一样的:

有什么想法吗?

【问题讨论】:

    标签: android android-actionbar actionbarsherlock


    【解决方案1】:

    我找到了一个可行的解决方案,如何使用适当的大小和填充设置不确定的进度条。我的解决方案没有使用 setActionView() 的解决方法。它是内置进度条功能的解决方案,由本机操作栏 (ActionBarSherlock) 支持。进度条通过 setProgressBarIndeterminateVisibility(boolean) 方法启用/禁用。我在 Android 2、3、4 和 ldpi、mdpi、xhdpi 上对其进行了测试。

    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 进度条使用 2 个具有相反方向和不同度数范围的动画。查看 SDK 中的 progress_medium_holo.xml。

    /res/drawable-mdpi/ab_indeterminate_progress_bar.png:

    /res/drawable-mdpi-v14/ab_indeterminate_progress_bar.png(在这个页面上几乎看不到):

    /res/drawable-hdpi/ab_indeterminate_progress_bar.png:

    /res/drawable-hdpi-v14/ab_indeterminate_progress_bar.png(在此页面上几乎看不到):

    /res/drawable-xhdpi/ab_indeterminate_progress_bar.png:

    /res/drawable-xhdpi-v14/ab_indeterminate_progress_bar.png(在此页面上几乎看不到):

    【讨论】:

    • 如果不制作自定义可绘制对象和调整资产大小,真的没有办法做到这一点吗?设置minWidthminHeightmaxWidthmaxHeight 几乎可以达到你想要的效果,但是ProgressBar出现在最角落(没有3点溢出菜单图标它看起来很可怕)。在样式中设置paddinglayout_margin 没有影响。为什么!为什么!!??
    【解决方案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 作为我的 style.xml 中唯一的属性,后来我在 style="?indeterminateProgressStyle" 下从我的微调器 xml 中引用它

    编辑: 保留对 menuItem 的引用,每当您想显示刷新进度条时,请使用 setActionView(R.layout.your_layout),并在需要结束时将其更改为 null。 onCreateOptionsMenu 将是一个在开始时获取 menuItem 的好地方。

    【讨论】:

    • 谢谢,但没用。老实说,我不知道它应该如何工作,因为您在您的风格中没有引用文件refresh_spinner.xml。你确定你的意思是ProgressBar 里面的ActionBar
    • 对不起,我忘了提。我用 menuItem.setActionView(R.layout.refresh_spinner) 点击时替换了我的 menuItem,并将其改回正常我使用 menuItem.setActionView(null) 删除并保留原来的图标
    • 我知道带有操作视图的解决方案。正在寻找具有内置于操作栏实现中的进度条功能的解决方案 - setProgressBarIndeterminateVisibility(true) 无论如何谢谢 :)
    【解决方案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 样式,您可以在其中设置 Indeterminate Progress 的外观:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 2011-12-20
        相关资源
        最近更新 更多