14

(ActionBarSherlock を使用して) ActionBar 内に不確定な進行状況バーを配置したいと考えています。すべてが機能しますが、小さなプログレス バーにしたいと考えています。私は次のスタイルを使用します:

<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などの可能な限りの組み合わせを試しました。

結果は常に同じです。 ここに画像の説明を入力

何か案は?

4

4 に答える 4

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 の次の 2 つのアセットを使用しました。

  • ハニカム以前の場合は /sdk/platforms/android-18/data/res/mdpi/spinner_white_48.png
  • ICS 以降の場合は /sdk/platforms/android-18/data/res/mdpi/spinner_48_outer_holo.png

適切なサイズとパディングを取得するには、アセットのサイズを変更する必要があります。spinner_white_48.png のサイズを~0.6に変更しました。mdpi の場合は 28px でした。中心対称になるには偶数でなければなりません。アイコン全体ではなく、コンテンツのみのサイズを変更しました。したがって、mdpi のアイコンは 48 ピクセルのままですが、そのコンテンツ (光学正方形) は小さくなります (28 ピクセル)。この方法でコンテンツのサイズを簡単に変更できます。最初に「画像サイズ」を 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 (このページではほとんど見えません):

ここに画像の説明を入力

于 2013-08-21T21:21:33.753 に答える
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);

適切な権利を設定してください:)

于 2014-09-25T12:28:17.350 に答える
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>

Width は標準の Actionbar 項目の幅です。minHeight と maxHeight を変更すると、画像は両方の方法でスケーリングされます。

Indeterminate Progress の外観を設定する 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>
于 2014-11-10T12:05:53.380 に答える
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>

これらの設定は私にとってはうまくいきました。ご不明な点がございましたら、お知らせください。

よろしくパルヴァズ・バスカー

EDIT2:さまざまな方法を試していたので、style.xmlの唯一のプロパティとして?android:attr/progressBarStyleSmallInverseを使用することになりました。これは、後でスタイルの下のスピナーxmlからstyle="?indeterminateProgressStyle"として参照しました

編集: menuItem の参照を保持し、更新プログレスバーを表示するときはいつでも setActionView(R.layout.your_layout) を使用し、必要がなくなったら null に変更します。onCreateOptionsMenu は、開始時に menuItem を取得するのに適した場所です。

于 2013-03-20T14:08:34.863 に答える