隐藏ActionBar图标

时间:2015-01-09 19:07:16

标签: java android android-fragments

当我的抽屉打开时,我试图隐藏图标。这只是隐藏设置,而不是我想要的图标。

在我的MainActivity上我已经看到如果我添加此代码,图标会隐藏,但是如果我按下其他片段以显示它崩溃。

    @Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // if nav drawer is opened, hide the action items
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
    menu.findItem(R.id.ofertasRefresh).setVisible(!drawerOpen); <--- I want to hide this icon
    return super.onPrepareOptionsMenu(menu);
}

当我按下其他片段表示它说...:

01-09 20:03:01.493  25761-25761/info.androidhive.slidingmenu E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: info.androidhive.slidingmenu, PID: 25761
java.lang.NullPointerException
        at info.androidhive.slidingmenu.MainActivity.onPrepareOptionsMenu(MainActivity.java:170)
        at android.app.Activity.onPreparePanel(Activity.java:2564)
        at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:464)
        at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:800)
        at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:221)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
        at android.view.Choreographer.doCallbacks(Choreographer.java:574)
        at android.view.Choreographer.doFrame(Choreographer.java:543)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5102)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
        at dalvik.system.NativeStart.main(Native Method)

有没有办法轻松完成? 顺便说一下,在我的片段1上,我添加了一个onCreateOptionsMenu来显示图像,它完美无缺。

 @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.refresh_menu, menu);
}

R.menu.refresh_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/ofertasRefresh"
    android:icon="@drawable/ic_action_refresh"
    android:title="Refresh"
    android:alphabeticShortcut="r"
    android:orderInCategory="200"
    android:showAsAction="ifRoom" />
</menu>

干杯。

2 个答案:

答案 0 :(得分:2)

我认为最好的方法是覆盖onDrawerClosed()中的onDrawerOpened() / ActionBarDrawerToggle方法。见这里:

public boolean mDrawerOpened;

    ActionBarDrawerToggle abdt = new ActionBarDrawerToggle( ... ) {

        public void onDrawerClosed(View v) {
            super.onDrawerClosed(v);
            mDrawerOpened = false;
            invalidateOptionsMenu();
            syncState();
        }

        public void onDrawerOpened(View v) {
            super.onDrawerClosed(v);
            mDrawerOpened = true;
            invalidateOptionsMenu();
            syncState();
        }

invalidateOptionsMenu()开始调用主机Activity中的onPrepareOptionsMenu()方法。然后:

public boolean onPrepareOptionsMenu(Menu menu) {
    if (mDrawerOpened) { menu.removeItem(R.id.ofertasRefresh); }
    if (!mDrawerOpened) { menu.add(Menu.NONE, R.id.ofertasRefresh, Menu.NONE, R.string.title); }
    return super.onPrepareOptionsMenu(menu);
}

使用可见性(可能效果更好):

public MenuItem mi;

public boolean onPrepareOptionsMenu(Menu menu) {
    if (mi == null) { mi = menu.findItem(R.id.ofertasRefresh); }
    if (mDrawerOpened) { mi.setVisible(false); }
    if (!mDrawerOpened) { mi.setVisible(true); }
    return super.onPrepareOptionsMenu(menu);
}

答案 1 :(得分:1)

我认为最好是每个片段和活动都有一个菜单XML。这意味着您不必隐藏/显示某些项目。关于回调(from the docs):

  

当a时,片段还会收到onOptionsItemSelected()的回调   菜单项已被选中。

     

注意:虽然您的片段收到了一个项目选择的回调   它添加的每个菜单项,活动首先接收   用户选择菜单项时的相应回调。如果   activity的on-item-selected回调的实现没有   处理所选项目,然后将事件传递给片段   打回来。选项菜单和上下文菜单都是如此。