Автоматически скрываемые ActionBar и ShareActionProvider

Я использую родной ActionBar и ShareActionProvider.

В моей активности есть код, который скрывает ActionBar за четыре секунды:

Handler hideUIHandler = new Handler();
hideUIHandler.postDelayed(new Runnable() { 
  public void run() { 
    getActionBar().hide();
  } 
}, 4000);

К сожалению, hideUIHandler скрывает ActionBar, даже когда я щелкнул элемент «Поделиться», чтобы увидеть меню, предоставляемое ShareActionProvider.

В этом случае я не хочу скрывать ActionBar. Что я должен делать?


person kirik88    schedule 03.04.2014    source источник


Ответы (1)


Вы можете переопределить Activity.onMenuOpened и Activity.onPanelClosed, чтобы определить, когда отображается дополнительное меню или другие подменю, например ShareActionProvider. Вот пример:

/** True if an options menu has been opened, false otherwise */
private boolean mMenuOpened;

@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    mMenuOpened = true;
    return super.onMenuOpened(featureId, menu);
}

@Override
public void onPanelClosed(int featureId, Menu menu) {
    super.onPanelClosed(featureId, menu);
    mMenuOpened = false;
}

В качестве альтернативы

ActivityChooserView есть способ проверить ActivityChooserView.isShowingPopup, но вам придется создать подкласс ShareActionProvider и вызвать его через отражение, поскольку класс ActivityChooserView скрыт.

Вот пример:

AccessibleShareActionProvider

/**
 * A subclass of {@link ShareActionProvider} that uses reflection to invoke
 * <p>
 * <code>android.widget.ActivityChooserView.isShowingPopup</code>
 * <p>
 */
public class AccessibleShareActionProvider extends ShareActionProvider {

    /** The action view created for {@link ShareActionProvider} */
    private View mActivityChooserView;

    /**
     * Constructor for <code>AccessibleShareActionProvider</code>
     * 
     * @param context The {@link Context} to use
     */
    public AccessibleShareActionProvider(Context context) {
        super(context);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public View onCreateActionView(MenuItem forItem) {
        mActivityChooserView = super.onCreateActionView(forItem);
        return mActivityChooserView;
    }

    /**
     * @return True if showing, false if already dismissed
     */
    public boolean isShowingPopup() {
        try {
            final Class<?> acv = Class.forName("android.widget.ActivityChooserView");
            final Method isShowingPopup = acv.getMethod("isShowingPopup", new Class[] {});
            return (boolean) isShowingPopup.invoke(mActivityChooserView, new Object[] {});
        } catch (final Exception ignored) {
            // Nothing to do
        }
        return false;
    }

}

Ваш MenuItem

<item
    android:id="@+id/menu_item_share"
    android:actionProviderClass="your_path_to.AccessibleShareActionProvider"
    android:showAsAction="ifRoom"
    android:title="@string/share"/>

В вашем Activity

private Handler mHandler = new Handler();
private AccessibleShareActionProvider mShareProvider;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    ...
    final MenuItem item = menu.findItem(R.id.menu_item_share);
    mShareProvider = (AccessibleShareActionProvider) item.getActionProvider();
    ...
    return super.onCreateOptionsMenu(menu);
}

private final Runnable mHideActionBar = new Runnable() {

    @Override
    public void run() {
        // If the ShareActionProvider is showing, delay for 4 seconds
        if (mShareProvider.isShowingPopup()) {
            mHandler.removeCallbacksAndMessages(null);
            mHandler.postDelayed(mHideActionBar, 4000);
            return;
        }
        getActionBar().hide();
    }

};
person adneal    schedule 03.04.2014