我创建了一个正常工作的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) );
}
答案 0 :(得分:8)
您必须使用String.equals()
函数来比较字符串。带有字符串的==
仅比较内存位置。
例如:if (key.equals("Main_Clock_Minutes"))
答案 1 :(得分:6)
您无法使用==比较字符串。使用String类方法equals()
或equalsIgnoreCase()
。
if ( key.equals("Use_ShotClock") ) { }
这是比较字符串的方式
答案 2 :(得分:2)
你应该比较if(key.equals(“Use_ShotClock”))或if(key.equalsIgnoreCase(“Use_ShotClock”))。因为string是java中的对象。因此,如果您比较if(key ==“Use_ShotClock”),它将尝试比较那两个不同的字符串对象的参考。
答案 3 :(得分: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) );
}
答案 4 :(得分:1)
字符串必须在与String的方法equals(String s)相等的情况下进行测试。
" =="运算符没有为Strings重载,因为String是一个引用类型(它是一个对象,而不是一个基本类型),它是使用" ==进行比较的内存地址。 &#34 ;.由于Javas能够为多个变量共享内存,因此在将字符串与" =="进行比较时,有可能实现这一点,但这种可能性较小且非常难以预测。