我的MainActivity调用AsyncTask来执行一些网络I / O.当AsyncTask开始时,我想“点亮”ActionBar中的一个图标。当AsyncTask完成时,我想让ActionBar图标不可见,即在AsyncTask完成时,而不是通过按钮点击。
此时我可以在AsyncTask启动时成功点亮ActionBar图标。在AsyncTask完成时,我将另一个广播发送回MainActivity以指示AsyncTask已完成。我需要能够使用此广播使ActionBar图标不可见。我试图使用InvalidateMenuOptions()来强制onPrepareMenuOptions重新创建并使ActionBar图标不可见,但它无法正常工作。这是我到目前为止的尝试 - 所有代码都摘自我的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();
}
}
}
}
}
我的BroadcastReciever:
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图标不可见。此外 - 这是我第一次发帖,让我知道我是否可以澄清任何问题,再次感谢这个社区,因为你已经让我离开了几个月的堵塞。
答案 0 :(得分:2)
在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)
来获取您的各个菜单项并动态调整其属性,无论您喜欢什么。