2

我创建了一个正常工作的 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) );
            }
4

5 回答 5

8

您必须使用该String.equals()函数来比较字符串。==with Strings 仅比较内存位置。

例如:if (key.equals("Main_Clock_Minutes"))

于 2013-01-07T03:30:35.903 回答
6

您不能使用 == 比较字符串。使用 String 类方法equals()equalsIgnoreCase().

if ( key.equals("Use_ShotClock") ) { }

这就是你比较字符串的方式

于 2013-01-07T03:30:32.290 回答
2

你应该比较 if (key.equals("Use_ShotClock")) 或 if (key.equalsIgnoreCase("Use_ShotClock"))。因为字符串是java中的对象。因此,如果您像 if ( key == "Use_ShotClock" ) 进行比较,它将尝试比较这两个不同的字符串对象的引用。

于 2013-01-07T03:35:57.090 回答
2

您是否尝试过.equals()在比较中使用strings

像这样:

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) );
}
于 2013-01-07T03:38:22.643 回答
1

必须使用 String 的方法 equals(String s) 来测试字符串是否相等。

“==”运算符没有为字符串重载,因为字符串是引用类型(它是一个对象,而不是原始类型),它是使用“==”比较的内存地址。由于 Java 能够为多个变量共享内存,因此在将字符串与“==”进行比较时有机会得到正确的结果,但这不太可能而且非常不可预测。

于 2013-01-07T03:33:25.183 回答