从AsyncTask的OnCancelled方法更新ActionBar状态

时间:2014-12-26 10:50:02

标签: android android-asynctask

我在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) } 方法,刷新按钮的状态也会保持禁用状态。

我做错了什么?

2 个答案:

答案 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;
}