# eine Methode einer anderen Activity aufrufen



## Gast2 (10. Dez 2012)

Hallo,

Ich habe eine OptionsActivity und möchte dass die Einstellungen, die ich dort treffe, in einer anderen MacheActivity benutzt werden. Nun überlege ich, wie ich die Daten von A nach B bekommen (zeitnah, also innherhalb von 1/10 Sec). Ich denke mir ich erstelle in MacheActivity eine Methode adjust(int a, bool b) und schicke die Einstellungen von und aus OptionsActivity in diese Klasse.

Meine Frage: *Wie rufe ich die Klasse adjust() einer anderen laufenden Activity auf???*


----------



## Tomate_Salat (10. Dez 2012)

Ich würde das über Preferences lösen:

Settings | Android Developers

Deine SharedPreferences kannst du von überall in deiner Abrufen+Verändern. Für den Benutzer würde ich dann eine PreferenceActivity nutzen. Diese passt sich (richtig eingesetzt) auch Tablets an.


----------



## schlingel (10. Dez 2012)

Würde ich auch so machen, alternativ funktioniert das auch über (Local)Broadcasts und BroadcastReceivers.


----------



## Gast2 (10. Dez 2012)

Ich dachte auch schon an Preferences.
Aber die MacheActivity müsste dann bis ca. 10 Werte pro Sekunde abfragen.
Ich fand das viel, schliesslich liegen die Preferences auf der SD-card, das kostet Ressourcen (Prozessor, Zeit). Es wird auf jeden Fall die einfachste Variante sein.


----------



## Tomate_Salat (10. Dez 2012)

frankmehlhop hat gesagt.:


> Aber die MacheActivity müsste dann bis ca. 10 Werte pro Sekunde abfragen.



Wieso immer abfragen? Lass dich doch einfach Informieren:

PreferenceChangeListener | Android Developers


----------



## Gast2 (11. Dez 2012)

Das ist ja eine super Sache! 

Beim Implementieren habe ich allerdings noch ein *Problem*.
Wie bekomme ich den *Namen / Key des Preference* heraus?

(siehe Abbild)






Die Fehlermeldung sagt, dass ich das Projekt in JDK Comiler Level 1.7 laufen lassen soll, aber dies ist bereits eingestellt in meinen Preferences in Eclipse (Preferences / Java / Compiler).


----------



## schlingel (11. Dez 2012)

Dann änder das wieder auf Java 6 

Auch wenn Java SE schon bei 7 ist, Google ist es beim unterstützen Android noch nicht. (Die haben auch noch lange Java 5 verwendet ...) invokedynamic, ein Feature das mit Java 7 hinzugekommen ist unterstützt dx nicht. Siehe auch die System-Anforderungen auf der Android Developer-Startseite.

Dein Problem hier ist, dass das Switch nicht mit Strings funktioniert. (Was es in Java7 tut, deswegen die Empfehlung) Mach das mit einem if/else-Konstrukt und es haut hin.


----------



## Gast2 (11. Dez 2012)

So weit so gut und wunderbar.

Aber wenn ich nun in einen Activity eine Preference überschreibe, dann *kommt *in der anderen Aktivity unter 

```
preferenceChange(PreferenceChangeEvent pce) {
        Toast toast = Toast.makeText(this, "Da ist was gechanched!", Toast.LENGTH_LONG);  
        toast.show(); 
        final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
        tg.startTone(ToneGenerator.TONE_PROP_BEEP);
}
```
*nichts an!*

(Kein Ton, kein Toast.)

Natürlich habe ich die Klasse mit _implements PreferenceChangeListener_,
aber muss ich evtl. noch irgendwo angeben, dass der Listener was zum listen bekommt?!?


----------



## schlingel (11. Dez 2012)

Rufst du denn irgendwo die addPreferencesChangedListener Methode auf?


----------



## Gast2 (11. Dez 2012)

Hatte ich nicht. 
Aber jetzt habe ich sie implementiert:

```
editor = sharedPreferences.edit();
			if (ckb_id.isChecked()) {		// wird aktiviert
				ckb_id.setChecked(true);
				editor.putBoolean("bool_ckb_id", true);
			} else {						// wird deaktiviert
				ckb_id.setChecked(false);
				editor.putBoolean("bool_ckb_id", false);
			}
			editor.commit();
			Preferences.userNodeForPackage(ModusCActivity.class).addPreferenceChangeListener(this);
```

Aber leider *kommt *in der MeasureActivity in preferenceChange() immer noch *nichts an*. 

(Selbst in der selben Activity unter preferenceChange() kommt nix an.)

Muss die Methode addPreferenceChangeListener() irgendwie anders oder an einer anderen Stelle aufgerufen werden?

Einen Listener rufe ich normalerweise (also was ich kenne) auf Objekten wie Buttons und so auf. Gibt es ein bestimmtes Objekt, auf welches ich den Listener setze?


----------

