# Daten von einer Activity zur nächsten übergeben



## Gast2 (8. Okt 2012)

Hallo,

Ich habe eine App mit gewissen Voreinstellungen, z.B.
	
	
	
	





```
int alpha 12;
```
Von jeder einzelnen Activity kann man ein Menü aufrufen und diesen Wert verstellen (mittels SeekBar).
Von jeder Activity muss auf diesen Wert zugegriffen werden können.

*Nun, wie übergibt man günstig diese Werte am geschmeidigsten?*

z.B. 

Intent
extra Klasse mit getter und setter
oder ?

Zu bedenken ist auch, dass ich gelegentlich die StartActivity aufrufen muss. Darin habe ich die Voreinstellungen gesetzt. Beim wiederholten Aufruf sollen sie aber nicht neu gesetzt werden wie nach dem Start der App, sondern die geänderten Werte sollen gelten. 

Frank


----------



## Sen (8. Okt 2012)

Ich würde eine Klasse für statische Werte erstellen und diese Variable dort erstellen. Dann kannst von von jeder anderen Klasse darauf zugreifen.


----------



## schlingel (8. Okt 2012)

Vergiss die statische Klasse. So wie du das beschreibst, hört sich das nach Einstellungen an. Und das schöne von Einstellungen in Android ist, dass sie so leicht zu programmieren sind.

Erstell dir eine Klasse, die deine Properties besitzt und sie standardmäßig auf deine Default-Values setzt. Und dann lass diese Klasse jedes Mal im onResume oder onCreate deiner Activities die Werte aus den Preferences auslesen.


----------



## Sen (9. Okt 2012)

Was spricht gegen static? ^^


----------



## Gast2 (9. Okt 2012)

Die Technologie mit Preferences ist super!!!

Frank


----------



## schlingel (9. Okt 2012)

Sen hat gesagt.:
			
		

> Was spricht eigentlich gegen static? ^^


Da hat man mal aus der "Theorie" das Problem, dass solche Objekte - ähnlich wie Singletons - eine enge Kopplung bewirken und dass dies schnell nervig werden kann wenn man die App ausbauen muss.

Zudem sich praktisch die Frage stellt, ob das so klug ist bei einem System dass dir - wenn es die Resourcen benötigt - einfach die App abdrehen kann und sie für dich neu startet wenn du zu einer deiner Activities zurück kommst. Denn in so einem Fall wären wieder die Standardwerte anstatt der eingestellten Werte eingestellt. Das ist erstens nervig für den Benutzer und zweitens für dich nicht anders lösbar.

Mit einer eigenen Klasse die auf die SharedPreferences zugreift, hättest du den Vorteil, dass so die Einstellungen auch über eine Sitzung hinweg vorhanden sind. Schwer zu programmieren ist das auch nicht. Z.B.: für eine kleine RSS-Reader App habe ich so eine Klasse geschrieben, die sieht so aus:

```
package at.fundev.android.soupchecker.utils;

import android.R;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.preference.PreferenceManager;

/**
 * Helper class. Abstraction for fetching and storing credentials.
 */
public final class CredsHelper {
	private static final String SOUP_DEF_URL = "http://www.soup.io/";

	private static final String CREDS_URL_NAME = "credRSSUrl";

	private static final String CREDS_FETCH_IMAGES = "credFetchImages";

	private static final String CREDS_DISPLAY_HEADER = "credDisplayUserHeader";

	private static final boolean DEF_FETCH_IMAGES_VALUE = true;

	private static final boolean DEF_CREDS_DISPLAY_HEADER_VALUE = true;

	private static String soupUrl = "";

	private static Boolean fetchImages = null;

	private static Boolean displayHeader = null;

	/**
	 * The activity context. Needed for fetching the preferences.
	 */
	private Context cont;

	/**
	 * Preferences object for fetching/storing credentials.
	 */
	private SharedPreferences prefs;

	/**
	 * Initializes the creds helper with the given context.
	 * @param cont Activity context
	 */
	public CredsHelper(Context cont) {
		this.cont = cont;
		prefs = PreferenceManager.getDefaultSharedPreferences(cont);
		fetchPreferences();
	}

	/**
	 * Fetches the credentials from the preferences and writes it to the member variable.
	 */
	private void fetchPreferences() {
			soupUrl = prefs.getString(CREDS_URL_NAME, SOUP_DEF_URL);
			fetchImages = prefs.getBoolean(CREDS_FETCH_IMAGES, DEF_FETCH_IMAGES_VALUE);
			displayHeader = prefs.getBoolean(CREDS_DISPLAY_HEADER, DEF_CREDS_DISPLAY_HEADER_VALUE);
	}

	/**
	 * Returns the soup url.
	 */
	public String getURL() {
			return soupUrl;
	}

	/**
	 * Writes the given url to the preferences.
	 */
	public void setUrl(String url) {
			soupUrl = url;

			SharedPreferences.Editor editor = prefs.edit();
			editor.putString(CREDS_URL_NAME, url);
			editor.commit();
	}

	/**
	 * If true a non default value is set.
	 * @return True if user set the URL, false otherwise
	 */
	public boolean isSoupUrlSet() {
		String value = getURL();
		return value != null && !SOUP_DEF_URL.equals(value);
	}

	/**
	 * Sets the fetch images value. Needed to determine wether the soup user images should 
	 * be loaded or not.
	 * @param fetchImages
	 */
	public void setFetchImagesActive(boolean fetchImages) {
		this.fetchImages = fetchImages;

		SharedPreferences.Editor editor = prefs.edit();
		editor.putBoolean(CREDS_FETCH_IMAGES, fetchImages);
		editor.commit();
	}

	/**
	 * Returns a boolean value wether the user images should be downloaded from soup or not.
	 * @return
	 */
	public boolean isFetchImagesActive() {
		return fetchImages;
	}

	/** Checks wether the header should be displayed or not. */
	public boolean isHeaderDisplayActive() {
		return displayHeader;
	}

	/** Sets the value wether the header should be displayed or not. */
	public void setHeaderDisplayActive(boolean value) {
		displayHeader = value;

		SharedPreferences.Editor editor = prefs.edit();
		editor.putBoolean(CREDS_DISPLAY_HEADER, value);
		editor.commit();
	}
}
```


----------



## Gast2 (9. Okt 2012)

sehr übersichtlicher Quellcode auch hier:
SharedPreferences in Android - Java EE, Android und Core Java Blog


----------

