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吗?应用程序没有崩溃,初始状态更改菜单项。不幸的是,在我连接到设备之前,我无法完全测试