12

ボタンが押されたIndeterminate ProgressBarときに表示し、ViewGroupが更新されたときに[更新]ボタンを再度表示するにはどうすればよいですか?RefreshActionBarSherlock

更新1: ここに不完全な答えがあります。より多くの開発者が将来他の人に役立つ良い答えを作るのを助けることができるように、私は質問に賞金をかけています。

Indeterminate ProgressBar下の画像に示すようなものをどのように表示できますかここに画像の説明を入力してください

4

3 に答える 3

31

ActionBarSherlockは、更新されたMenuItemをアニメーション化するための特定のメソッドを提供していないようです。

(従来のAndroid APIを使用して)実行できることは、setActionView(int resId)メソッドを使用して、ProgressBarを含むレイアウトのIDを指定することです。

更新アクションの開始時に、次のように呼び出します。

item.setActionView(R.layout.refresh_menuitem);

そして、更新アクションが終了したら、次のように呼び出します。

item.setActionView(null);

レイアウトファイルrefresh_menuitem.xmlに含めることができるもののサンプルを次に示します。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:addStatesFromChildren="true"
              android:focusable="true"
              android:paddingLeft="4dp"
              android:paddingRight="4dp"
              android:gravity="center"
              style="?attr/actionButtonStyle">
    <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@android:style/Widget.ProgressBar.Small"/>
</LinearLayout> 
于 2012-06-06T06:43:19.010 に答える
10

この種の不確定なProgressBarをActionBarSherlockオブジェクトに追加する方法は次のとおりです:(実際には他の方が簡単ですが、progressBarは単独で表示され、上には表示されませんMenuItem

1-この行をonCreate()メソッドに入れてから、setContentView()を呼び出します。

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

->この行は、不確定なProgressBar関数を使用することを指定します。

2-:を呼び出して、不確定なProgressBarを有効にします。

setSupportProgressBarIndeterminateVisibility(true);

3-:を呼び出して、不確定なProgressBarを無効にします。

setSupportProgressBarIndeterminateVisibility(false);

備考:ActionBarSherlockフォルダーのサンプルフォルダーをご覧ください。このコードは次のファイルで見つかりました: JakeWharton-ActionBarSherlock-9598f2b \ samples \ demos \ src \ com \ actionbarsherlock \ sample \ demos \ IndeterminateProgress.java

于 2012-06-08T14:19:49.947 に答える
2

完全なコードは次のとおりです。

private static final int menuItemIdRefresh = 10; //class constant
private boolean refresh;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuItem refreshItem = menu.add(0, menuItemIdRefresh, 0,
            getString(R.string.action_refresh)).setShowAsActionFlags(
            MenuItem.SHOW_AS_ACTION_ALWAYS);

    if (isRefreshing) {
        refreshItem.setActionView(R.layout.indeterminate_progress);
    } else {
        refreshItem.setActionView(null);
        refreshItem.setIcon(R.drawable.ic_refresh);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case menuItemIdRefresh: {
            //the user has pressed the refresh button
        if (!isRefreshing) {
            isRefreshing = true;
            new RefreshMyViewAsyncTask().execute("");
        }
    }
        break;

    default:
        break;
    }

    return false;
}

最後に、上記のコードを機能させるには、supportInvalidateOptionsMenu()も呼び出す必要があります。これをRefreshMyViewAsyncTaskのonPreExecute()メソッドに追加できます。

これが誰かに役立つことを願っています。

于 2013-06-11T17:57:08.877 に答える