10
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

    case android.R.id.home:
        return true;

    case R.id.searchIcon:
        return true;

    case R.id.startRefresh:
        refreshItem = item;
        refresh();
        return true;
    case R.id.stopRefresh:

        if (refreshItem != null && refreshItem.getActionView() != null) {
            refreshItem.getActionView().clearAnimation();
            refreshItem.setActionView(null);
        }
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}


public void refresh() {
    if (FeedActivity.this != null) {
        /*
         * Attach a rotating ImageView to the refresh item as an ActionView
         */
        LayoutInflater inflater = (LayoutInflater) FeedActivity.this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ImageView iv = (ImageView) inflater.inflate(
                R.layout.refresh_action_view, null);
        Animation rotation = AnimationUtils.loadAnimation(
                FeedActivity.this, R.anim.clockwise_refresh);
        rotation.setRepeatCount(Animation.INFINITE);
        iv.startAnimation(rotation);
        refreshItem.setActionView(iv);
    }
}

クリックする前に:

ここに画像の説明を入力してください

クリック後:

ここに画像の説明を入力してください

ここでは、アイコンがアニメーション化(回転)されています。

問題:

なぜ左にシフトしているのですか?

左に移動すると、アイコンはクリックできなくなり、奇妙なことにデバイスの戻るボタンも機能しなくなります

編集:

この回答の下のコメント:

ActionItemのアニメーションアイコン

ジェイク・ウォートンは、メニュー項目に正方形で正しいサイズのアイコンを使用している場合、同じ問題を抱えている人には、この奇妙な動作は起こらないと言います。

しかし、mdpiドローアブルを使用するデバイスで32x32の画像を使用しています。述べたように、それは機能しなければなりません:(

ありがとうございました

編集:

refresh_action_view.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/Widget.Sherlock.ActionButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_refresh" />

アプリで使用するカスタムスタイル

<style name="My_solid_ActionBar" parent="@style/Widget.Sherlock.Light.ActionBar.Solid.Inverse">
    <item name="background">@drawable/ab_solid_My</item>
    <item name="backgroundStacked">@drawable/ab_stacked_solid_My</item>
    <item name="backgroundSplit">@drawable/ab_bottom_solid_My</item>
    <item name="progressBarStyle">@style/My_ProgressBar</item>
    <item name="android:background">@drawable/ab_solid_My</item>
    <item name="android:backgroundStacked">@drawable/ab_stacked_solid_My</item>
    <item name="android:backgroundSplit">@drawable/ab_bottom_solid_My</item>
    <item name="android:progressBarStyle">@style/My_ProgressBar</item>
</style>
4

2 に答える 2

8

問題は、すべてのメニュー インフレーションを で処理していないことですonCreateOptionsMenu()ActionBar私が見た更新アニメーションの基本的なロジックは、Andlyticsbooleanなどのオープン ソースのアプリで使用されており、更新アニメーションを表示するかどうかを決定するフラグを実装するonCreateOptionsMenu()ことです。

次のように実装できます。refresh()メソッドが呼び出されると、boolean isRefreshingフラグが trueに設定され、アニメーションを開始するためにinValidateOptionsMenu()「舞台裏」で呼び出されるものを呼び出します。onCreateOptionsMenu()

でメニューを膨らませますonCreateOptionsMenu(...):

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    super.onCreateOptionsMenu(menu, inflater);
    //inflate a menu which shows the non-animated refresh icon
    inflater.inflate(R.menu.my_ab_menu, menu);

    if (isRefreshing) {
        //if we're refreshing, show the animation
        MenuItem item = menu.findItem(R.id.refreshMenuItem);
        item.setActionView(R.layout.action_bar_indeterminate_progress);
        ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView);
        ((AnimationDrawable) iv.getDrawable()).start();
    }
}

次のようにアニメーションを開始します。

 public void refresh(){
        isRefreshing = true;
        inValidateOptionsMenu();
    }

ユーザーが更新アイコンをタップしたときにアニメーションを開始するようにするには、 で次のようにしますonOptionsItemSelected()

case R.id.refreshMenuItem:
    isRefreshing = true;
    item.setActionView(R.layout.action_bar_indeterminate_progress);
    ImageView iv = (ImageView) item.getActionView().findViewById(R.id.loadingImageView);
    ((AnimationDrawable) iv.getDrawable()).start();
    //...

アニメーションの呼び出しを停止するには:

isRefreshing = false;
invalidateOptionsMenu();

このコードは からのものなFragmentので、 の場合は微調整する必要があるかもしれませんがActivity、基本的な考え方は伝わっていると思います。

于 2012-12-07T00:43:20.563 に答える
0

私はあなたが使用しているのとまったく同じコードを試しましたが、それは私にとっては問題なく機能します。異なる可能性があるのは、次の2つだけです。

1)refresh_action_viewレイアウト(比較のためにここにあります):

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_menu_refresh" />

2)アクションバーの表示オプション(比較のために私のstyles.xmlを示します)。

<resources>

<style name="AppTheme" parent="Theme.Sherlock.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/Widget.ActionBar</item>
    <item name="actionBarStyle">@style/Widget.ActionBar</item>
</style>

<style name="Widget.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
    <item name="android:displayOptions">showHome|useLogo|showCustom</item>
    <item name="displayOptions">showHome|useLogo|showCustom</item>
</style>

</resources>

あなたも共有できますか?

于 2012-12-05T18:11:48.767 に答える