RefreshActionItem

2014-01-31T00:00:00+00:00 Android Java

的な感じでChrome拡張機能にあるchrome.browserAction.setBadgeText的な事も出来るリロード機能に特化した?AndroidライブラリのRefreshActionItemを使ってみた

使い方はほんと簡単なのでざっくりと(ドキュメントに書いてる通り)

※RefreshActionItemは別途でActionBarSherlockが必要。ドキュメントにはandroid-viewbadgerっていうのも使ってると記載されているがこれに組み込まれている模様なので別途取得してくる必要は無い模様

res/menu/menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/refresh_button"
        android:actionViewClass="com.manuelpeinado.refreshactionitem.RefreshActionItem"
        android:showAsAction="always"
        android:title="@string/action_refresh" />

</menu>

MainActivity.java

package sample.test;

import java.util.Random;

import android.os.Bundle;
import android.os.Handler;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.manuelpeinado.refreshactionitem.RefreshActionItem;
import com.manuelpeinado.refreshactionitem.RefreshActionItem.RefreshActionListener;

public class MainActivity extends SherlockActivity implements RefreshActionListener {

    private Handler mHandler = new Handler();
    private RefreshActionItem mRefreshActionItem;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main, menu);

        MenuItem item = menu.findItem(R.id.refresh_button);
        mRefreshActionItem = (RefreshActionItem) item.getActionView();
        mRefreshActionItem.setMenuItem(item);
        mRefreshActionItem.setMax(100);
        //mRefreshActionItem.setProgressIndicatorType(ProgressIndicatorType.INDETERMINATE);
        mRefreshActionItem.setRefreshActionListener(this);

        return true;
    }

    @Override
    public void onRefreshButtonClick(RefreshActionItem sender) {
        sender.showProgress(true);

        new Thread() {
            @Override
            public void run() {
                task(50);
                task(100);

                mHandler.post(new Thread() {
                    @Override
                    public void run() {
                        mRefreshActionItem.showProgress(false);
                        mRefreshActionItem.showBadge(String.valueOf(random()));
                    }
                });
            }
        }.start();
    }

    private void task(int value) {
        try {
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        mRefreshActionItem.setProgress(value);
    }

    private int random() {
        return 1 + new Random().nextInt(9);
    }
}

要は

  • RefreshActionItem#showProgress(true)をする
  • RefreshActionItem#setProgress(int)を処理状況なプログレスを設定
  • RefreshActionItem#showProgress(false)をする
  • RefreshActionItem#setBadgeText(String)をする事でリロードにあたって読み込まれた数等のテキストを設定したり出来る(chrome.browserAction.setBadgeTextみたいに)

あとおそらくはデフォルトでProgressなIndicatorTypeはPIEモードになっているのでデフォルトだと円が描画されてsetProgressの値分だけ線の部分が塗りつぶされるような形式なUIになっているが

mRefreshActionItem.setProgressIndicatorType(ProgressIndicatorType.INDETERMINATE);

のように変更する事も出来るINDETERMINATEモードだとAndroid標準であるようなProgressDialog形式なリロードUI方式になる模様

ってな感じ。android-viewbadgerも別途検証してみたい所

ottoの@Produceに関して SwipeListView