Android 处理程序收到消息时更改菜单项标题和图标

Android 处理程序收到消息时更改菜单项标题和图标,android,actionbarsherlock,handler,menuitem,Android,Actionbarsherlock,Handler,Menuitem,我想在连接状态更改时更改标题和图标。。。 updatementutile()和可以工作,因为我已经对它进行了测试,但当我从处理程序调用updatementutile()时,它不工作。应用程序在启动时崩溃 private void updateMenuTitle(int x) { MenuItem btstatus = menu.findItem(R.id.btstatus); if (x == 1) { btstatus.setTitle("Connected"

我想在连接状态更改时更改标题和图标。。。
updatementutile()
和可以工作,因为我已经对它进行了测试,但当我从处理程序调用
updatementutile()
时,它不工作。应用程序在启动时崩溃

 private void updateMenuTitle(int x) {
    MenuItem btstatus = menu.findItem(R.id.btstatus);
    if (x == 1) {
        btstatus.setTitle("Connected");
        btstatus.setIcon(R.drawable.ic_btstatus_on);
    } else if (x == 2){
        btstatus.setTitle("Connecting");
        btstatus.setIcon(R.drawable.ic_btstatus_idle);
    }else if (x == 0){
        btstatus.setTitle("Disconnected");
        btstatus.setIcon(R.drawable.ic_btstatus_off);
    }
}

private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case MESSAGE_STATE_CHANGE:
            switch (msg.arg1) {
            case BluetoothRfcommClient.STATE_CONNECTED:
                mTxtStatus.setText(R.string.title_connected_to);
                mTxtStatus.append(" " + mConnectedDeviceName);
                updateMenuTitle(1);//not working if I call it from here... app force close
                break;
            case BluetoothRfcommClient.STATE_CONNECTING:
                mTxtStatus.setText(R.string.title_connecting);
                updateMenuTitle(2);//not working if I call it from here... app force close
                break;
            case BluetoothRfcommClient.STATE_NONE:
                mTxtStatus.setText(R.string.title_not_connected);
                updateMenuTitle(0);//not working if I call it from here... app force close
                break;
            }
            break;
            .......
解决方案:

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if (mChangedStat && mChangedStat2) {
            menu.findItem(R.id.btstatus).setTitle(R.string.title_connected);
            menu.findItem(R.id.btstatus).setIcon(R.drawable.ic_btstatus_on);
        } else if (!mChangedStat && mChangedStat2) {
            menu.findItem(R.id.btstatus).setTitle(R.string.title_connecting);
            menu.findItem(R.id.btstatus).setIcon(R.drawable.ic_btstatus_idle);
        } else if (!mChangedStat && !mChangedStat2) {
            menu.findItem(R.id.btstatus).setTitle(R.string.title_not_connected);
            menu.findItem(R.id.btstatus).setIcon(R.drawable.ic_btstatus_off);
        }
}

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MESSAGE_STATE_CHANGE:
                                switch (msg.arg1) {
            case BluetoothServiceClient.STATE_CONNECTED:
                mChangedStat = true;
                mChangedStat2 = true;
                supportInvalidateOptionsMenu();
                break;
            case BluetoothServiceClient.STATE_CONNECTING:
                mChangedStat = false;
                mChangedStat2 = true;
                supportInvalidateOptionsMenu();
                break;
            case BluetoothServiceClient.STATE_NONE:
                mChangedStat = false;
                mChangedStat2 = false;
                supportInvalidateOptionsMenu();
                break;
            }
                break;
                .......

您可以为此实现onPrepareOptionMenu(),因为这样更有效,用户可以打开选项菜单,并且可以显示带有标题和图标的所需菜单

检查这个例子


我做的有点不同:

private boolean flag = false;

void someMethod() {

   flag = true;
   invalidateOptionsMenu();

}

public boolean onCreateOptionsMenu (Menu menu) {

    if (flag) {
      // inflate menu 1
    } else {
      // inflate menu 2
    }
}


这样你就不需要处理信息或其他事情了。您只需要管理OnCreateOptions菜单上的菜单项。

我不明白,请您解释一下。。。作为obs:单击菜单项时,该菜单项没有做任何事情,就像操作栏中的状态通知一样。您使用了操作栏菜单确定,然后调用InvalidateOptions菜单();更改菜单项的标题和图标后,当我调用updateNutitle()时从处理程序来看,应用程序在启动时崩溃,因此我需要知道如何在状态更改时更改标题和图标,因为当前设置不起作用…您可以添加带有错误的logcat吗?应用程序没有崩溃,初始状态更改菜单项。不幸的是,在我连接到设备之前,我无法完全测试