Java 出于某种原因,我的if语句不是';t触发
我已经创建了一个onSharedPreferencesChangeListener,它工作正常。我知道这一点,因为当我设置侦听器时,我记录了侦听器,它会触发一个更改 然而,当我尝试切换键变量时(说我需要JRE 1.7+才能切换字符串),我遇到了一个错误,所以我将它改为if-elseif语句 if-elseif语句没有触发,所以我将前两个语句更改为if语句,并将elseif放在后面(认为elseif可能是问题所在)。仍然没有触发 奇怪的是,当我记录事件触发器时,我输出“+key+”作为字符串,键值正是我测试的字符串 这是我的密码,有人能告诉我正确的方向吗Java 出于某种原因,我的if语句不是';t触发,java,android,Java,Android,我已经创建了一个onSharedPreferencesChangeListener,它工作正常。我知道这一点,因为当我设置侦听器时,我记录了侦听器,它会触发一个更改 然而,当我尝试切换键变量时(说我需要JRE 1.7+才能切换字符串),我遇到了一个错误,所以我将它改为if-elseif语句 if-elseif语句没有触发,所以我将前两个语句更改为if语句,并将elseif放在后面(认为elseif可能是问题所在)。仍然没有触发 奇怪的是,当我记录事件触发器时,我输出“+key+”作为字符串,键值
// logic for action when a shared preference is changed.
prefs.registerOnSharedPreferenceChangeListener( new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
String TAG = "UltimateScoreboard";
if (key == "Main_Clock_Minutes") {
msMainClockStart = Long.valueOf( prefs.getString( "Main_Clock_Minutes", "0" ) ) * 60000;
Log.i( TAG, key + " changed: " + String.valueOf(msMainClockStart) );
}
if ( key == "Use_ShotClock" ) {
useShotClock = prefs.getBoolean( "Use_ShotClock", false );
if( useShotClock )
btnShotClock.setVisibility( View.VISIBLE );
else
btnShotClock.setVisibility( View.INVISIBLE );
Log.i( TAG, key );
}
else if ( key == "Shot_Clock_Seconds" ) {
msShotClockStart = Long.valueOf( prefs.getString( "Shot_Clock_Seconds", "0" ) ) * 1000;
Log.i( TAG, key + " changed: " + Long.valueOf(msShotClockStart) );
}
不能使用==比较字符串。使用字符串类方法
equals()
或equalsIgnoreCase()
这是比较字符串的方式必须使用
String.equals()
函数来比较字符串<带有字符串的代码>=仅比较内存位置
例如:
if(key.equals(“Main_Clock_Minutes”)
字符串必须与字符串的方法equals(String s)进行相等测试
字符串的“==”运算符没有重载,因为字符串是引用类型(它是对象,而不是基元类型),所以它是使用“==”进行比较的内存地址。由于Java能够为多个变量共享内存,在比较字符串与“==”时有可能实现,但可能性较小且非常不可预测。您应该像if(key.equals(“Use_ShotClock”))或if(key.equalsIgnoreCase(“Use_ShotClock”))那样进行比较。因为字符串是java中的对象。因此,如果您像if(key==“Use_ShotClock”)那样进行比较,它将尝试比较这两个不同字符串对象的引用。您是否尝试过在比较
字符串时使用.equals()
像这样:
if (key.equals("Main_Clock_Minutes")) {
msMainClockStart = Long.valueOf( prefs.getString( "Main_Clock_Minutes", "0" ) ) * 60000;
Log.i( TAG, key + " changed: " + String.valueOf(msMainClockStart) );
} else if ( key.equals("Use_ShotClock")) {
useShotClock = prefs.getBoolean( "Use_ShotClock", false );
if( useShotClock )
btnShotClock.setVisibility( View.VISIBLE );
else
btnShotClock.setVisibility( View.INVISIBLE );
Log.i( TAG, key );
} else if ( key.equals("Shot_Clock_Seconds")) {
msShotClockStart = Long.valueOf( prefs.getString( "Shot_Clock_Seconds", "0" ) ) * 1000;
Log.i( TAG, key + " changed: " + Long.valueOf(msShotClockStart) );
}
始终尝试将字符串与equals()或equalsIgnoreCase()方法匹配,例如:if(key.equalsIgnoreCase(“Main_Clock_Minutes”){}.NETters一般Java问题:)Pradeep以一种低调的方式这样说。也就是说,您根本无法通过==来比较Java中字符串的值。scala优越的另一个原因>:dpobsible duplicate of
if (key.equals("Main_Clock_Minutes")) {
msMainClockStart = Long.valueOf( prefs.getString( "Main_Clock_Minutes", "0" ) ) * 60000;
Log.i( TAG, key + " changed: " + String.valueOf(msMainClockStart) );
} else if ( key.equals("Use_ShotClock")) {
useShotClock = prefs.getBoolean( "Use_ShotClock", false );
if( useShotClock )
btnShotClock.setVisibility( View.VISIBLE );
else
btnShotClock.setVisibility( View.INVISIBLE );
Log.i( TAG, key );
} else if ( key.equals("Shot_Clock_Seconds")) {
msShotClockStart = Long.valueOf( prefs.getString( "Shot_Clock_Seconds", "0" ) ) * 1000;
Log.i( TAG, key + " changed: " + Long.valueOf(msShotClockStart) );
}