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语句的情况下烘烤颜色
我错过了什么吗?
答案 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()进行比较。