Java 出于某种原因,我的if语句不是';t触发

Java 出于某种原因,我的if语句不是';t触发,java,android,Java,Android,我已经创建了一个onSharedPreferencesChangeListener,它工作正常。我知道这一点,因为当我设置侦听器时,我记录了侦听器,它会触发一个更改 然而,当我尝试切换键变量时(说我需要JRE 1.7+才能切换字符串),我遇到了一个错误,所以我将它改为if-elseif语句 if-elseif语句没有触发,所以我将前两个语句更改为if语句,并将elseif放在后面(认为elseif可能是问题所在)。仍然没有触发 奇怪的是,当我记录事件触发器时,我输出“+key+”作为字符串,键值

我已经创建了一个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) );
}