0

所以我尝试设置按钮颜色。它是这样的:

    if (D) {Log.d(TAG, "color =" + bytes);};
                    int c = Color.argb(bytes[4], bytes[3], bytes[2],  bytes[1]);
                    btnStart.setBackgroundColor(c);
                    if (D) {Log.d(TAG, "color " + bytes[4]+ bytes[3]+bytes[2]+ bytes[1]);};
                    break;

我得到以下输出到 LogCat: color = [B@40534710 color -1-1-1-1 这是怎么回事?我期待在数组中看到一些其他值,而不是-1 ...

这是完整的代码

    mainHandler=new Handler(){
        public void handleMessage(Message msg) {    
            switch (msg.what){
            case TOAST:
                Bundle bundle = msg.getData();
                String string = bundle.getString("myKey");
                Toast.makeText(getApplicationContext(), string, Toast.LENGTH_SHORT).show();
                break;
            case NEW_SMS:
                if (D) {Log.d(TAG, "newSms recieved");}
                byte[] bytes =(byte[]) msg.obj;
                switch (bytes[0]){
                case SMS_TEXT:
                    bytes = shiftArrayToLeft(bytes);
                    String readMessage = new String(bytes, 0, msg.arg1);
                    txtView.setText(readMessage);
                    break;
                case SMS_COLOR:
                    if (D) {Log.d(TAG, "color =" + bytes);};
                    //LinearLayout lLayout = (LinearLayout) findViewById(R.id.lLayout);
                    int c = Color.argb(bytes[4], bytes[3], bytes[2],  bytes[1]);
                    btnStart.setBackgroundColor(c);
                    if (D) {Log.d(TAG, "color " + bytes[4]+ bytes[3]+bytes[2]+ bytes[1]);};
                    break;
                }

            }
    }};

这是处理蓝牙消息的处理程序

4

1 回答 1

1

你的bytes数组是什么类型的?如果它是一个数组,byte[]那么你就有问题了,因为bytes 是范围从 -128 到 127 的有符号整数,而Color.argb()构造函数期望 4 ints 在 0 到 255 的范围内。这意味着如果你的字节数组的任何元素包含负值,Color.argb()调用将失败。文档说:

这些组件值应该是 [0..255],但是没有执行范围检查,所以如果它们超出范围,则返回的颜色是未定义的。

无论如何,Java 中没有无符号字节类型,因此您必须手动确保将值从 -128 到 127 范围转换为 0 到 255 范围内的整数。像这样的东西应该工作:

int c = Color.argb(((int)bytes[4]) % 256, ((int)bytes[3]) % 256, ((int)bytes[2]) % 256,  ((int)bytes[1]) % 256);

可能有一个更优雅的解决方案,但这至少可以确认这是否是您的问题。

于 2013-07-11T21:47:44.420 回答