2

必要なもの:「サインイン」オプションを使用してオプションメニューを作成します。ユーザーがサインインすると、ユーザーがメニューボタンをもう一度タップしたときに「サインアウト」に変更する必要があります。

純粋なSDKを使用する場合、onPrepareOptionsMenuのメニューオプションを変更できますが、互換性ライブラリv4を使用する場合も同じように機能しますが、ActionBarSherlockを使用すると、onPrepareOptionsMenuでメニューが更新されません。引き続き呼び出されますが、表示されるメニューは変更されません。

誰かがこれに対する解決策を持っていますか?

4

2 に答える 2

3

ええ、これはABSの厄介なバグです。次のように修正できます。FragmentActivity.javaでonPrepareOptionsMenu(android.view.Menu menu)メソッドを見つけ、コメントアウトまたは削除します。

if (mOptionsMenuInvalidated) {

行とそれに対応する閉じ括弧であるため、このブロックは毎回実行されます。使用している場合は、FragmentMapActivityアクティビティでも同じことを行います。

于 2011-11-11T12:09:05.060 に答える
1

このスレッドは少し古く、提案された修正を適用できませんでした(またはより良い修正を見つけることができませんでした)。ActionBarSherlock 4.2を使用していますが、オプションメニューがオーバーレイであるICSデバイスにサインインすると、まだ問題があります。サインインアクティビティが閉じた後でのみ、メニューを強制的に無効にする方法がわかりませんでした(アプリにはサインイン状態が変更されたと判断しました)。

メニューを無効にするフラグを使用して問題を解決しましたonResume。フラグを使用するのはハックのように感じますが、履歴書ごとに無効にするよりはましです。

@Override
protected void onResume()
{
    if ( checkLoginState == Boolean.TRUE )
    {
        invalidateOptionsMenu();
        checkLoginState = Boolean.FALSE;
    }
    super.onResume();
}

次にonOptionsItemSelected、フラグを設定します。

@Override
public boolean onOptionsItemSelected( MenuItem item )
{
    // Handle item selection
    switch ( item.getItemId() )
    {
        case R.id.actionbar_settings_signin_out:
            if (isUserLoggedIn() == Boolean.TRUE )
            {
                logout();
                validateOptionsMenu();
            }
            else
            {
                // set the flag so that on resume we update the options menu
                checkLoginState = Boolean.TRUE;
                startSignInActivity();
            }
            return true;

これは私にとってはうまくいっていますが、他の人がそれをより良い方法で解決したかどうか知りたいです。

于 2013-03-14T14:09:50.057 に答える