web-dev-qa-db-ja.com

更新機能付きのGMailアプリのようなActionBarのProgressBar

HoneycombタブレットのGMailアプリケーションと同じことをしたいと思います。 [更新]ボタンをクリックすると、アイコンがプログレスバーに置き換えられます。これどうやってするの?

ありがとう

23
g123k

わかりました、私はカイリーンが提案したことを試しましたが、それは私にとってはうまくいきませんでした。不確定な進行状況を元のボタンに戻したい場合は、クリックできなくなります。このレイアウトを使用して進行状況を確認しました。

(actionbar_refresh_progress.xml)

<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:Android="http://schemas.Android.com/apk/res/Android"
             Android:layout_width="32dp"
             Android:layout_height="32dp"
             Android:layout_gravity="center"/>

そしてこれはボタンに戻ります

(actionbar_refresh_button.xml)

<ImageView xmlns:Android="http://schemas.Android.com/apk/res/Android"
           Android:src="@drawable/ic_menu_refresh_holo_light"
           Android:layout_height="wrap_content"
           Android:layout_width="wrap_content"/>

私のコードは:

private void setRefreshing(boolean refreshing) {
        this.refreshing = refreshing;
        if(refreshMenuItem == null) return;
        View refreshView;
        LayoutInflater inflater = (LayoutInflater)getActionBar().getThemedContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(refreshing)
            refreshView = inflater.inflate(R.layout.actionbar_refresh_progress, null);
        else
            refreshView = inflater.inflate(R.layout.actionbar_refresh_button, null);

        refreshMenuItem.setActionView(refreshView);
    }

Google IOアプリ、特にこのファイルのソースを閲覧した後: http://code.google.com/p/iosched/source/browse/Android/src/com /google/Android/apps/iosched/ui/HomeActivity.Java 別の簡単な方法を見つけました。

これで、進行状況のある最初のレイアウトのみが必要になり、作業方法は次のようになります。

private void setRefreshing(boolean refreshing) {
    this.refreshing = refreshing;
    if(refreshMenuItem == null) return;

    if(refreshing)
        refreshMenuItem.setActionView(R.layout.actionbar_refresh_progress);
    else
        refreshMenuItem.setActionView(null);
}

メニュー項目の定義:

<item Android:id="@+id/mail_refresh"
      Android:title="Refresh"
      Android:icon="@drawable/ic_menu_refresh_holo_light"
      Android:showAsAction="always"/>

誰かがこれがお役に立てば幸いです。

25
Ivan G.

Gmailは、「更新中」状態のアクションビューを使用してこれを行います。更新の呼び出しは、標準のアクションボタン/ onMenuItemSelectedパスを使用して行われます。

更新状態に入るときは、更新MenuItemのアクションビューをProgressBarに設定します。 (プログラムで作成し、レイアウトから拡張し、CommonsWareが提案するようにメニューxmlでactionLayoutを使用します。)更新状態を終了するときは、アクションビューをnullに戻し、参照を保持して設定できるようにします。次に更新したときに再び元に戻ります。メニューを膨らませた後、MenuItemへの参照を保持することができ、後でメニューへの変更がアクションバーに反映されます。

このアプローチには、フルタイムのアクションビューを使用したり、状態変更の他の詳細を自分で管理したりするよりもいくつかの利点があります。アクションビューは、メニュー項目に対して生成されたアクションボタンを完全に置き換え、更新がすでに進行している間、ユーザーが通常のonMenuItemSelectedイベントを更新のために送信できないようにします。処理するものが1つ少なくなり、アクションビューは完全に非対話型のままになります。

API 14以降のActionProviderを使用して、プロセス全体をもう少しカプセル化するための巧妙な方法を実行できますが、上記は非常に単純です。

25
adamp

メニュー項目がすでに設定されていると仮定すると、2つの新しいレイアウトを作成することから始める必要があります。 1つは通常の更新ボタンのレイアウトを含み、もう1つはプログレスバーを含みます。

それらを取得したら、次のコードを呼び出して2つのレイアウトを切り替えます。更新アイコンに戻すために、2回目に呼び出す必要があるタイミングを正確に決定するのはあなた次第です。

private void doRefresh(Boolean refreshing, MenuItem menuItem)
{
    View refreshView;
    LayoutInflater inflater = (LayoutInflater) getActionBar().getThemedContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if(refreshing)
        refreshView = inflater.inflate(R.layout.actionbar_indeterminate_progress, null);
    else
        refreshView = inflater.inflate(R.layout.refresh_icon, null);

    menuItem.setActionView(refreshView);

}
8
Cailean

アクションバーメニュー項目のアクションビューとして、次のレイアウトを使用します。

actionbar_refresh_progress.xml

<FrameLayout
    Android:layout_height="wrap_content"
    Android:layout_width="@dimen/abc_action_button_min_width"
    Android:minWidth="@dimen/abc_action_button_min_width">
    <ProgressBar
        Android:layout_width="32dp"
        Android:layout_height="32dp"
         Android:layout_gravity="center"
         style="?indeterminateProgressStyle" />
</FrameLayout>

次に

menuItem.setActionView(R.layout.actionbar_refresh_progress);

ジンジャーブレッド全体で機能し、残りは魅力のように機能します。互換性のために、サポートアクションバーの寸法を使用していることに注意してください。 ICS以上の場合は、代わりに@dimen/action_button_min_widthを使用できます。

ソース: https://code.google.com/p/iosched/source/browse/Android/res/layout/actionbar_indeterminate_progress.xml?r=f4fd7504d43b25a75cc23b58d6f844f3553b48c

1