toString无法使用getSelectedItem - Android

时间:2014-04-25 18:15:56

标签: java android bluetooth

BluetoothTest.java

colourSpinner = (Spinner) findViewById(R.id.colourSpinner);
    ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
            R.array.colour, android.R.layout.simple_spinner_item);
    colourSpinner.setAdapter(adapter);

-

-

-

void redButton() throws IOException {
    if(colourSpinner.getSelectedItem().toString() == "Red")
    {
        Toast.makeText(getApplicationContext(), 
        colourSpinner.getSelectedItem().toString(), Toast.LENGTH_LONG).show();
        mmOutputStream.write("1".getBytes());
    }
}

的strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Computer Case Controller</string>
<string-array name="colour">
    <item>Red</item>
    <item>Green</item>
    <item>Blue</item>
    <item>Cyan</item>
    <item>Magenta</item>
    <item>Yellow</item>
    <item>White</item>
</string-array>

嘿,我有一个问题,我现在试图解决一段时间,我不明白为什么我的代码没有按预期工作。

基本上redButton()发送命令&#34; 1&#34;通过蓝牙,同时也创建了一个吐司说的旋转选择的颜色。我已将其缩小到if语句不起作用,但我不明白为什么colourSpinner.getSelectedItem()。toString()不等于&#34; Red&#34;即使这是它输出的内容,如果我将其设置为在没有if语句的情况下烘烤颜色

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

你需要在字符串运算符上执行.equals,而不是==。

if(colourSpinner.getSelectedItem().toString().equals("Red"))

这个问题得到了相当多的询问(尤其是字符串),我相信其原因相当简单。我们能够在相当规律的基础上逃避错误,所以当问题出现时很难发现它不起作用。

String string1 = "hello";
String string2 = "hello";
if(string1 == string2)
    System.out.println("We have a match");

这将打印输出,因为相等是正确的。这是因为当我们创建文字字符串常量“hello”时,我们的值会被转储到堆池中。此时,只要我们创建一个字符串并将其设置为等于堆常量,它就会在堆中引用该值。问题是有时我们需要使用的字符串不会以这种直接方式实例化。有时,根据程序的设计方式,即使堆中有匹配的常量,也可以将字符串指定为内存中的新值。例如,

String string1 = "hello";
String string2 = new String("hello");
String string3 = new String("hello");
if(string1 == string2 || string2 == string3)
    System.out.println("We have a match");

在这个例子中,我们不会按照我们的打印输出,因为我们对堆常量“hello”的引用与我们对内存中新创建的“hello”字符串的引用不同。在更简单的程序中,我们经常设置自己的字符串,因此==比较将起作用,但随着事情变得更加复杂,特别是当我们要求Android为我们做事时,该假设不再有效,并且.equals比较是必要的。

这里有更多关于这个概念的内容:

http://www.thejavageek.com/2013/07/27/string-comparison-with-equals-and-assignment-operator/

答案 1 :(得分:1)

您似乎依赖于Java对字符串的缓存,即始终为相同的字符获取相同的字符串对象。但是,如果您查看this question,您会发现只有在所有地方使用字符串文字时才能保证这种情况。因此,如果您不知道或不能保证字符串是通过文字创建的,请使用equals()进行比较。