0

何が起こっているのか簡単なシナリオをお話ししましょう。

アクションバーに更新ボタンがあり、何かが読み込まれている間、不確定なProgressStyle(回転する円)に切り替わります。

私のプロジェクトでは、次のレイアウトがあります。(例:res / layout / actionbar_indeterminate_progress.xml)

<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_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:layout_gravity="center"
        style="?android:attr/indeterminateProgressStyle" />
</FrameLayout>

ユーザーが更新ボタンをクリックすると、次のようになります。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);

    refreshMenuItem = menu.findItem(R.id.menu_refresh);

    if (refreshMenuItem != null) {
        // Show refresh button if we are in action bar mode, but only if
        // there's something to be refreshed
        boolean selectedItemExists = (getCurrentBrowsingContainer() != null);
        refreshMenuItem.setVisible(selectedItemExists);
        if (is_spinner_running) {
            refreshMenuItem.setActionView(R.layout.actionbar_indeterminate_progress);
        } else {
            refreshMenuItem.setActionView(null);
        }
    }

    return super.onCreateOptionsMenu(menu);
}

また、私のres / menu/main.xmlは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    ...
        <item android:id="@+id/menu_refresh" android:icon="@drawable/ic_menu_refresh" android:showAsAction="always" android:title="@string/refresh" />
    <item android:id="@+id/menu_search" android:title="@string/menu_search" android:icon="@android:drawable/ic_menu_search" android:showAsAction="never" />
    <item android:id="@+id/settings" android:title="@string/settings" android:icon="@android:drawable/ic_menu_preferences"></item>
    <item android:id="@+id/exit" android:title="@string/exit" android:icon="@android:drawable/ic_menu_close_clear_cancel"></item>   
        ...
</menu>

問題は、たとえばポートレートでアクティビティを開始し、更新ボタンを押すと、うまく停止することです。今、私はそれを回転させて、もう一度更新ボタンを押しますが、今は何らかの理由で不確定な進行状況を表示し続けます。確認したところ、refreshMenuItem.setActionView(null)が呼び出されていますが、それでも不確定なものが表示され続けます。また、refreshMenuItemが何らかの理由で表示されていないように見えます。これは、不確定な進行状況をクリックしたときにonOptionsItemSelectedが呼び出されないためです。

そのため、別のサンプルアプリを試してみましたが、問題なく完全に機能します。だから私はどこでうまくいかないのだろうかと思っています。任意のポインタが役立ちます。

4

2 に答える 2

1

実際、私は問題を理解しました。私のプロジェクトは以前に構成の変更を処理することになっていた(したがって、マニフェストにconfigchangesがあった)。actionbarsherlockを使用すると、configchangesで応答しなくなります。

これで、構成の変更前にアクティビティを再作成していなかったため、一部のコードでアクティビティを渡していました。これは、再作成されることはなく、クリーンアップを行ったため、問題ありませんでした。ただし、actionbarsherlockを機能させるには、configchangesでアクティビティを再作成する必要があります。アクティビティの以前のインスタンスはコードの一部にまだ存在しており、アクティビティの新しいインスタンスでオーバーライドされていませんでした。したがって、回転を停止しようとしていたmenuitemは、実際には古いインスタンスに属していて、新しいインスタンスには属していませんでした。

そのため、アクティビティの現在のインスタンスを使用するようにコードをリファクタリングし、すべてがうまく機能しました!

于 2012-07-19T12:37:53.033 に答える
0

中間進行状況をクリックしたときにonOptionsItemSelectedが呼び出されないことについて:アクションビューが設定されている場合、アクションアイテムのデフォルトの動作が無効になります。また、以前に設定されたアクションプロバイダーをオーバーライドします。アクションビューのクリックを処理する唯一の方法は、OnClickListenerを設定することです。

ローテーション後に止まらない中間の進行について:私は正確にこの問題を抱えていませんでした。私の場合、更新アクションアイテムをクリックしても中間の進行状況はまったく表示されませんが、コードからトリガーされた場合はうまく表示されます。私がそれを機能させる方法は、setActionView(...)を呼び出すコードをHandler.post(Runnable)に移動することです。

于 2012-07-14T09:21:56.087 に答える