java - 使 ActionBar 图标动态可见/不可见

标签 java android android-actionbar broadcastreceiver

我的 MainActivity 调用 AsyncTask 来执行一些网络 I/O。当 AsyncTask 开始时,我想“点亮”ActionBar 中的一个图标。当 AsyncTask 完成时,我希望使 ActionBar 图标不可见,即在 AsyncTask 完成时,而不是通过单击按钮。

此时我可以在 AsyncTask 启动时成功点亮 ActionBar 图标。 AsyncTask 完成后,我将另一个广播发送回 MainActivity 以指示 AsyncTask 已完成。我需要能够使用此广播使 ActionBar 图标不可见。我试图使用 InvalidateMenuOptions() 强制 onPrepareMenuOptions 重新创建并使 ActionBar 图标不可见,但它不起作用。这是我到目前为止的尝试 - 所有代码都摘 self 的 MainActivity 类

摘自MainActivity:

public class MainActivity extends Activity {
    private static boolean dataXferRunning = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(true);

        // broadcast receiver to determine if BasestationTransfer is active
        basestationBroadcastReceiver = new BasestationBroadcastReceiver();
        basestationIntentFilter = new IntentFilter("XFER_RUNNING_ACTION");

        boolean hasWifi = CWICUtil.getNetworkState(this);
        if(hasWifi) {
            if(dataXferRunning == false) {
                containerCount = 0;
                DBAdapter dbAdapter = CWICApplication.dbAdapter();
                try {
                    containerCount = (int)dbAdapter.getUnsentContainersCount();
                } catch (SQLException e) {
                    Log.e(TAG, "getUnsentContainersCount() failed: " + e.toString());
                    e.printStackTrace();
                }
                if(containerCount > 0) {
                    invalidateOptionsMenu();
                    startTransfer();  //AsyncTask
                    invalidateOptionsMenu();
                }
            }
        }
    }
}

我的广播接收器:

public static class BasestationBroadcastReceiver extends BroadcastReceiver {  
    @Override
    public void onReceive(Context context, Intent intent) {
        intent.getAction();
        boolean isRunning = intent.getBooleanExtra("XFER_RUNNING", false);
        if(isRunning) {
            dataXferRunning = true;
        } else {
            dataXferRunning = false;
        }
    }
};

我的onPrepareOptionsMenu:

@Override
public boolean onPrepareMenuOptions(Menu menu) {
    if(dataXferRunning) {
        menu.findItem(R.id.action_socketServiceConnected).setVisible(true);
    } else {
        menu.findItem(R.id.action_socketServiceConnected).setVisible(false);
    }
    return super.onPrepareOptionsMenu(menu);
}

总结一下 - 我成功地从我的 AsyncTask 接收到具有正确值的广播。我见过很多使用 ButtonClick 执行此操作的代码,但是我的问题是在 AsyncTask 完成后动态地使我的 ActionBar 图标不可见。另外 - 这是我第一次发帖,如果我可以澄清任何问题,请告诉我,并感谢这个社区,因为几个月来你们一直在帮助我摆脱困境。

最佳答案

onCreateOptionsMenu() 中,您可以保留 Menu 对象的引用(通过类变量或您选择的其他机制),如下所示:

Menu menu;

@Override
public boolean onCreateOptionsMenu( Menu menu ) {
  getSupportMenuInflater().inflate( R.menu.my_menu, menu );
  this.menu = menu;     

  return true;
}

然后,当您想要动态调整菜单项的可见性时,您可以重用该菜单对象引用来调用 menu.findItem(R.id.myId) 来获取各个菜单项并进行调整按照您的意愿动态调整它们的属性。

关于java - 使 ActionBar 图标动态可见/不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21192527/

相关文章:

java - 如何正确添加/操作实体组中的数千个子项?

java - 如何在 Java 中使域对象适应 GUI

java - 获取到目前为止录制的视频长度(或获取准确的开始时间)

android - 项目根项目 "Gradle project not found for Module: "MyApplication"

带有 actionLayout 的 Android 操作栏菜单项无法正常工作

java - 为什么 PDFBox 返回大小为 0 x 0 的图像尺寸

java - 在main方法中调用Comparator参数

Android Debug Tracing问题

android - PreferenceActivity 操作栏主页图标不会返回主页(与 ET :) 不同

android - Action 条显示 Action 的动画