2

正しく機能するonSharedPreferencesChangeListenerを作成しました。リスナーをセットアップするときにリスナーをログに記録し、変更がトリガーされるため、これを知っています。

ただし、キー変数を切り替えようとしたときにエラーが発生したため(文字列を切り替えるには、JRE 1.7以降が必要であると言っています)、if-elseifステートメントに変更しました。

if-elseifステートメントがトリガーされなかったので、最初の2つを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")のように比較すると、異なる2つの文字列オブジェクトの参照を比較しようとします。

于 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は複数の変数のメモリを共有できるため、文字列を「==」と比較するとtrueになる可能性がありますが、その可能性は低く、非常に予測不可能です。

于 2013-01-07T03:33:25.183 に答える