0

接続状態が変化したときにタイトルとアイコンを変更したい...updateMenuTitle() ここからでupdateMenuTitle()あり、テストしたため動作しますが、開始時にアプリがクラッシュする from ハンドラーを呼び出すと動作しません

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

2 に答える 2

0

私は少し違うことをしています:

private boolean flag = false;

void someMethod() {

   flag = true;
   invalidateOptionsMenu();

}

public boolean onCreateOptionsMenu (Menu menu) {

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

}

このようにして、メッセージなどを処理する必要はありません。onCreateOptionsMenuでメニュー項目を管理するだけで済みます。

于 2013-02-11T11:07:48.423 に答える
0

これはより効率的であり、ユーザーがオプションメニューを開き、必要なメニューをタイトルとアイコンで表示できるため、これに onPrepareOptionMenu() を実装できます。

この例を確認してください

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

于 2013-02-11T10:44:25.403 に答える