PreferenceListener, aber wie?

G

Gast2

Gast
Hallo Leute,

ich möchte in einer Activity eine Meldung bekommen, wenn in einer anderen eine Preference gesetzt wird. Leider gelingt mir dies nicht und ich weiß nicht warum.
Zum Testen und Veranschaulichen habe ich zwei Activitys geschrieben, die ich hier abbilden will.

StartActivity: (das Layout enthält einen Button "Start")
Java:
package de.praeferenzentest;

import java.util.prefs.PreferenceChangeEvent;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.preference.Preference;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class StartActivity extends Activity implements OnClickListener, OnPreferenceChangeListener {
	private Button btn_start;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.start_layout);

		btn_start = (Button) findViewById(R.id.btn_go);
		btn_start.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		Intent intent = new Intent(this, ZweiteActivity.class);
		startActivity(intent);
	}

	public void preferenceChange(PreferenceChangeEvent pce) {
		final ToneGenerator tg = new ToneGenerator(
				AudioManager.STREAM_NOTIFICATION, 100);
		tg.startTone(ToneGenerator.TONE_PROP_BEEP);
	}

	public boolean onPreferenceChange(Preference preference, Object newValue) {
		final ToneGenerator tg = new ToneGenerator(
				AudioManager.STREAM_NOTIFICATION, 100);
		tg.startTone(ToneGenerator.TONE_PROP_BEEP);
		return false;
	}

	public boolean onPreferenceClick(Preference preference) {
		final ToneGenerator tg = new ToneGenerator(
				AudioManager.STREAM_NOTIFICATION, 100);
		tg.startTone(ToneGenerator.TONE_PROP_BEEP);
		return false;
	}

	public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) {
		final ToneGenerator tg = new ToneGenerator(
				AudioManager.STREAM_NOTIFICATION, 100);
		tg.startTone(ToneGenerator.TONE_PROP_BEEP);
	}
}

ZweiteActivity: (das Layout enthält einen Button Save Preference")
Java:
package de.praeferenzentest;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ZweiteActivity extends Activity implements OnClickListener {

	private int value;
	private Button btn_save_preference;
	private SharedPreferences sharedPreferences;
	private Editor editor;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_zweite);

		sharedPreferences = getSharedPreferences("SharedValues", 0);		
		btn_save_preference = (Button) findViewById(R.id.btn_setPreference);
		btn_save_preference.setOnClickListener(this);
		value = 10;
	}

	@Override
	public void onClick(View arg0) {
		editor = sharedPreferences.edit();
		editor.putInt("value", value);
		editor.commit();
	}
}

Leider gibt es beim setzen der Preference keinen Beep.
Warum funktioniert keiner der Listener?
Hat jemand eine Lösung?

Frank
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
mh,...
habe einiges versucht, leider hat es nicht geklappt.
z.B.
Java:
	private Preference preference;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.start_layout);

		btn_start = (Button) findViewById(R.id.btn_go);
		btn_start.setOnClickListener(this);
		
		preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
			
			@Override
			public boolean onPreferenceChange(Preference preference, Object newValue) {
	    		final ToneGenerator tg = new ToneGenerator(
	    				AudioManager.STREAM_NOTIFICATION, 100);
	    		tg.startTone(ToneGenerator.TONE_PROP_BEEP);
				return false;
			}
		});		
	}

oder einfach:
Java:
	private Preference preference;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.start_layout);

		btn_start = (Button) findViewById(R.id.btn_go);
		btn_start.setOnClickListener(this);
		
		preference.setOnPreferenceChangeListener(this);
	}
wirft beides eine NPE. ???:L

Ich gehe mal davon aus, dass ich den Listener in der StartActivity setzen muss?!
@fastjack: Hattest Du das so gedacht?
Was mache ich falsch?
(Sorry, bin Anfänger) :rtfm:
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Wo wirft es eine NPE? Der Klassiker vielleicht, View wird nicht gefunden?

Die NPE kommt aus
Java:
        preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                final ToneGenerator tg = new ToneGenerator(
                        AudioManager.STREAM_NOTIFICATION, 100);
                tg.startTone(ToneGenerator.TONE_PROP_BEEP);
                return false;
            }
        });
bzw.
Java:
        preference.setOnPreferenceChangeListener(this);

Wenn ich dies auskommentiere, dann funktioniert der Rest (zB. die View).
Nur eben nicht der PreferenceListener. :(

Falls jemand selber basteln möchte,
hier meine Testversion wie oben beschrieben; komplettes Package:
http://mehlhop.com/data/PraeferenzenTest.zip

hier die LogCat-Meldungen:
http://mehlhop.com/data/log.txt
 
G

Gast2

Gast
Du initialisierst preference auch nicht.

stimmt. Aber jetzt...
Java:
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.start_layout);

		btn_start = (Button) findViewById(R.id.btn_go);
		btn_start.setOnClickListener(this);
		
		preference = new Preference(this);		
		preference.setOnPreferenceChangeListener(this);
	}
Der Konstruktor fordert mindestens einen Parameter: das Object Context
Ich gehe davon aus, dass es sich um das Objekt der eigenen Klasse handelt und habe this übergeben.

Die NPE ist wech. :)

Aber in
Java:
	public boolean onPreferenceChange(Preference preference, Object newValue) {
		final ToneGenerator tg = new ToneGenerator(
				AudioManager.STREAM_NOTIFICATION, 100);
		tg.startTone(ToneGenerator.TONE_PROP_BEEP);
		return false;
	}
piepst es immer noch nicht, wenn ich eine Änderung der SharedPreferences vornehme. ???:L

Ansonsten fällt mir auf, dass ich obwohl ich das Interface OnPreferenceChangeListener implementiere die zugehörige Methode onPreferenceChange keine @Override - Notation hat. Das ist ungewohnt.
 

schlingel

Gesperrter Benutzer
Warum verwendest du den Konstruktor vom Preference anstatt getSharedPreferences vom Context-Objekt? Ich glaub das Problem ist einfach, dass du mit dem new ein neues Objekt erzeugst was nichts mit den SharedPreferences zu tun hat, die du dann veränderst.
 
G

Gast2

Gast
Ja richtig, SharePreferences statt Preferences.

Habe viel probiert und getestet und bin zu keinen brauchbaren Ergebnis gekommen.
Im Moment denke ich, dass
Java:
		sharedPreferences.registerOnSharedPreferenceChangeListener(this);
weiterhelfen könnte. Nur tuts das nich. Ob es am Parameter liegt?

registerOnSharedPreferenceChangeListener() ist das Vernünftigste, was sich auf sharedPreferneces aufrufen läßt.

siehe auch SharedPreferences | Android Developers oder SharedPreferences.OnSharedPreferenceChangeListener | Android Developers

???:L

PS: aktuelle Version auf http://www.mehlhop.com/data/PraeferenzenTest.zip
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Java Themen

Neue Themen


Oben