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

时间:2014-01-17 17:49:22

标签: java android android-actionbar broadcastreceiver

我的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图标不可见。此外 - 这是我第一次发帖,让我知道我是否可以澄清任何问题,再次感谢这个社区,因为你已经让我离开了几个月的堵塞。

1 个答案:

答案 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)来获取您的各个菜单项并动态调整其属性,无论您喜欢什么。

相关问题