我在ActionBar
中有一个刷新按钮,可在Clicked时刷新当前活动。仅当AysncTask
为callcelled
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.desc_xml, menu);
refreshItem = menu.findItem(R.id.action_refresh);
return true;
}
onPrepareOptionsMenu
方法,我将其设置为false
@Override
public boolean onPrepareOptionsMenu(Menu menu){
refreshItem.setEnabled(false);
super.onPrepareOptionsMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_refresh:
new AsycnTaskName(MyClass.this).execute();
break;
}
return super.onOptionsItemSelected(item);
}
以及onCancelled
的{{1}}内部方法,我重新启用了它。
AsyncTask
但即使执行了@Override
protected void onCancelled(String result) {
Toast.makeText(c, "Enabled", Toast.LENGTH_LONG).show();
invalidateOptionsMenu();
refreshItem.setEnabled(true)
}
方法,刷新按钮的状态也会保持禁用状态。
我做错了什么?
答案 0 :(得分:2)
当您致电invalidateOptionsMenu()
时,它会再次呼叫onPrepareOptionsMenu()
。
问题是,您在准备选项菜单时每次都设置refreshItem.setEnabled(false)
。因此,即使您将其设置为true
,此菜单也不会被激活。
因此,您需要在类级别获取一个全局变量,并默认将其设置为false
。然后只处理这个变量。
如下所示
private boolean refreshItemEnabled = false; // At class level
@Override
public boolean onPrepareOptionsMenu(Menu menu){
refreshItem.setEnabled(refreshItemEnabled); // Set variable here, not hardcoded value
super.onPrepareOptionsMenu(menu);
return true;
}
然后您的onCancelled()
就像
@Override
protected void onCancelled(String result) {
Toast.makeText(c, "Enabled", Toast.LENGTH_LONG).show();
refreshItemEnabled = true; // Set menu enabled
invalidateOptionsMenu();
}
答案 1 :(得分:0)
在主要活动类中声明static boolean
变量。
static boolean setStatus = false;
在onPrepareOptionsMenu(Menu menu)
,
@Override
public boolean onPrepareOptionsMenu(Menu menu){
refreshItem.setEnabled(YourClassName.setStatus);
super.onPrepareOptionsMenu(menu);
return true;
}
在OnCancelled
方法
YourClassName.setStatus = true;
refreshItem.setEnabled(YourClassName.setStatus)
您还可以将按钮设置为不活动时隐藏,
public boolean onPrepareOptionsMenu(Menu menu){
refreshItem.setEnabled(YourClassName.setStatus);
refreshItem.setVisible(YourClassName.setStatus);
super.onPrepareOptionsMenu(menu);
return true;
}