【问题标题】:Change MenuItem title and icon when Handler gets message处理程序收到消息时更改 MenuItem 标题和图标
【发布时间】:2013-02-11 10:29:39
【问题描述】:

我想在连接状态更改时更改标题和图标... updateMenuTitle() is from here 并且可以工作,因为我已经对其进行了测试,但是当我从处理程序调用 updateMenuTitle() 时应用程序在启动时崩溃

 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;
                .......

【问题讨论】:

  • 你能添加 logcat 错误吗?

标签: android actionbarsherlock handler menuitem


【解决方案1】:

我做的有点不同:

private boolean flag = false;

void someMethod() {

   flag = true;
   invalidateOptionsMenu();

}

public boolean onCreateOptionsMenu (Menu menu) {

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

}

这样你就不需要处理消息什么的了。您只需要在 onCreateOptionsMenu 上管理菜单项。

【讨论】:

  • 应用程序没有崩溃,并且初始状态更改了菜单项,不幸的是,在我拥有要连接的设备之前,我无法完全测试
【解决方案2】:

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

检查这个例子

http://thedevelopersinfo.wordpress.com/2009/10/20/dynamically-change-options-menu-items-in-android/

【讨论】:

  • 我不明白,请您解释一下...作为一个obs:菜单项在单击时什么都不做,就像操作栏中的状态通知一样
  • 哦,你使用操作栏菜单没问题,然后调用 invalidateOptionsMenu();更改菜单项的标题和图标后
  • 当我从处理程序调用 updateMenuTitle() 时,应用程序在启动时崩溃,所以我需要知道如何在状态更改时更改标题和图标,因为在当前设置中不起作用...跨度>
猜你喜欢
  • 2014-02-26
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多