我想在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
等所有可能的组合。
结果总是一样的:
有什么想法吗?
答案 0 :(得分:10)
我找到了一个有效的解决方案,如何使用适当的大小和填充设置不确定进度条。我的解决方案不使用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中的这两个资产:
要获得正确的尺寸和填充,我们需要调整资源的大小。我将spinner_white_48.png的大小调整为<strong> ~0.6 。对于mdpi,它是28px。它必须是偶数才能是中心对称的。我只调整了内容,而不是整个图标。因此mdpi中的图标仍然是48px,但其内容(光学方块)较小(28px)。您可以通过这种方式轻松调整内容大小:首先将“图像大小”更改为28px X 28px,然后将“画布大小”更改回48px X 48px。我将spinner_48_outer_holo.png的大小调整为<strong> 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(在此页面上几乎看不到):
答案 1 :(得分: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
EDIT2:因为我尝试了不同的方法,我最终使用了?android:attr / progressBarStyleSmallInverse 作为我的style.xml中唯一的属性,我后来在我的spinner xml中以style =“?indeterminateProgressStyle”
的样式从它中引用它编辑: 保留menuItem的引用,每当要显示刷新进度条时,使用setActionView(R.layout.your_layout),并在需要结束时将其更改为null。 onCreateOptionsMenu将是一个在开始时抓取menuItem的好地方。
答案 2 :(得分: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);
设置合适的右侧:)
答案 3 :(得分: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>
宽度是标准的Actionbar项目宽度。如果更改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>
干杯, 保罗