5

シーンを設定する際に車両の速度を変更する必要があり、戻るボタンを押すと壁紙サービスに反映される必要があるライブ壁紙を作成しています。私の設定アクティビティでは、リスト設定の変更を次のように共有設定に保存します:-

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.prefs);


    ListPreference listPreference = (ListPreference) findPreference("listPref");
    currValue = listPreference.getValue();
    Log.e("LiveWallpaperSettings", "currvalue " + currValue);

    listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference arg0, Object arg1) {

            SharedPreferences customSharedPreference = getSharedPreferences("Speed", LiveWallpaperSettings.MODE_PRIVATE);
            SharedPreferences.Editor editor = customSharedPreference.edit();
            editor.putString("Speed",currValue);
            editor.commit();

            return true;
        }

    });

私の壁紙サービスは、andenginelivewallpaper拡張機能を使用して作成されています。リスト設定の変更をサービスに反映させたい場合は、どうすればよいですか。これは私がしたことですが、機能していないようです。

私のprefs.xml

 <PreferenceCategory
            android:title="Settings">

            <ListPreference
                    android:title="Speed"
                    android:summary="Change the Speed"
                    android:key="listPref"
                    android:defaultValue="15"
                    android:entries="@array/listArray"
                    android:entryValues="@array/listValues" 
             />
</PreferenceCategory>

私のarray.xml

<resources>
<string-array name = "listArray">
    <item>Slow</item>
    <item>Medium</item>
    <item>Fast</item>
</string-array>
<string-array name = "listValues">
    <item>5</item>
    <item>15</item>
    <item>30</item>
</string-array>

私のサービスでは、SharedPreferences.OnSharedPreferenceChangeListenerを実装し、次のメソッドを実装します

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {

    sharedPreferences = getSharedPreferences("Speed", MODE_PRIVATE);
    strSpeedValue = sharedPreferences.getString("Speed", "5");

    fltSpeedValue = Integer.parseInt(strSpeedValue);
    final AutoParallaxBackground autoParallaxBackground = new AutoParallaxBackground(0, 0, 0, 10);
    autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(fltSpeedValue, new Sprite(0,mCamera.getHeight() - this.mParallaxLayer.getHeight(),this.mParallaxLayer, getVertexBufferObjectManager())));
    autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(0f, new Sprite(CAMERA_WIDTH/2 - 30, CAMERA_HEIGHT/2,this.mAutoLayer, getVertexBufferObjectManager())));
    mMainScene.setBackground(autoParallaxBackground);
}

@Override
protected void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes

    PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    // Unregister the listener whenever a key changes
    PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
}

しかし、listpreferenceで変更している値は、サービスでは変更されません。私は何か間違ったことをしていますか?

4

2 に答える 2

1

解決しました!

PreferenceActivityで値を誤って設定していて、OnSharedPreferenceChangeListenerを適切に実装していませんでした。

解決 :-

 ListPreference listPreference;

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.prefs);        
    listPreference = (ListPreference) findPreference("listPref");

}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

    SharedPreferences customSharedPreference = getSharedPreferences(key, LiveWallpaperSettings.MODE_PRIVATE);
    SharedPreferences.Editor editor = customSharedPreference.edit();
    editor.putString("Speed",listPreference.getValue());
    editor.commit();
    Log.e("LiveWallpaperSettings", "Speed Value after setting " + customSharedPreference.getString("Speed", ""));
}



@Override
protected void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    // Unregister the listener whenever a key changes
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
于 2012-10-16T06:36:30.150 に答える
0

いくつかのこと:XMLはキーが「listPref」であると言っているので、設定から値を読み取るときに、このキーをチェックする必要があります(速度は単なる表示タイトルです)

プリファレンス変更リスナーが役立つとは思いません...私が提案する方法は、onResume()でプリファレンスから新しい値を読み取り、この値を使用することです。設定を変更した後にアプリに戻るたびに、onResume()を呼び出す必要があるため、これは正常に機能するはずです。

于 2012-10-15T05:55:40.973 に答える