我的 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/