Eclipse speichern von Variablen

  • Antworten:19
Edu
  • Forum-Beiträge: 13

18.10.2012, 10:04:23 via Website

Ich habe eine App erstellt in der etwas gemacht werden soll (z.B. eine Zahl eingeben) und sobald die entsprechende Zahl eingegeben wurde wird der Variabel "int buttonfreigabe = 0;" der Wert 1 zugewiesen. Dann wird überprüft ob buttonfreigabe == 1 ist, und wenn das stimmt wird der button freigegeben.

So jetzt zu meinem Problem:
Ich will nicht das man jedesmal xxx machen soll um den Button freizugeben wenn man die App startet. Also wollte ich Versuchen die Variable zu speichern und ich habe es mit Datenbanken und Internal Storage versucht aber ich weiß nicht genau wie das geht und wie die App z.B. in der Datenbank überprüft ob der Wert 1 ist!

MfG

Antworten
Christian
  • Forum-Beiträge: 307

18.10.2012, 12:47:58 via Website

Hi Edu,


Ich will nicht das man jedesmal xxx machen soll um den Button freizugeben wenn man die App startet. Also wollte ich Versuchen die Variable zu speichern und ich habe es mit Datenbanken und Internal Storage versucht aber ich weiß nicht genau wie das geht und wie die App z.B. in der Datenbank überprüft ob der Wert 1 ist!

also die APP überprüft von sich aus erstmal gar nichts.
Du musst schon die DB, den Internal Storage oder wo auch immer du den Wert hinschreibst abfragen und schauen ob die 1 gesetzt ist.

Ok aber was ist jetzt genau das Problem?
Klappt das Speichern der Daten und das Auslesen geht nicht?
Von wo genau versucht du die Daten zu lesen? DB, interner Speicher (Datei oder Preference) oder Sd-Card ?

Mfg Christian

— geändert am 18.10.2012, 12:49:18

Antworten
Edu
  • Forum-Beiträge: 13

18.10.2012, 13:01:38 via Website

Danke für die schnelle Antwort!

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();



Also ich habe nirgendwo finden können wie ich Internal Storage bneutzen soll (jedenfalls nicht auf deutsch).
Im laufe der Klasse xxx wird buttonfreigabe der Wert 1 zugewiesen. Das wird aber nur beim ersten starten der App gemacht. Also soll die Variable gespeichert werden und beim nächsten Start der App soll überprüft werden ob der Wert 1 ist und falls ja, soll etwas gemacht werden.
Wahrscheinlich geht das auch anders aber ich muss trotzdem wissen wie man Variablen speichert um danach mit ihnen zu arbeiten.

— geändert am 18.10.2012, 13:27:25

Antworten
Andy N.
  • Forum-Beiträge: 3.112

18.10.2012, 13:38:49 via App

Schreib es einfach in die Preference. Dazu solltest du im Internet genügend finden

Antworten
Christian
  • Forum-Beiträge: 307

18.10.2012, 13:42:54 via Website

Hi Edu,

also dein Code(SharedPreferences) ging keine Ahnung wo dein Problem dabei war.

1final SharedPreferences settings;
2 final SharedPreferences.Editor editor;
3 settings = this.getPreferences(MODE_WORLD_WRITEABLE);
4 editor = settings.edit();
5 editor.putString("yyy", "1");
6 editor.commit();
7
8 Log.i("MainActivity", "Wert: " + settings.getString("yyy", "0"));

Ausgabe:
10-18 13:34:31.517: I/MainActivity(7746): Wert: 1

Aber ok.

Was ist jetzt das Problem?

mfg Christian

— geändert am 18.10.2012, 13:44:50

Antworten
Edu
  • Forum-Beiträge: 13

18.10.2012, 13:48:26 via Website

Wenn ich die App schließe, wird das dann nicht wieder zurückgesetzt?

Und wenn es mit SharedPreferences geht, wie kann ich dann zB abfragen ob die Zahl eine eins ist??

Antworten
Andy N.
  • Forum-Beiträge: 3.112

18.10.2012, 14:00:32 via App

Nein die Daten bleiben erhalten, die werden in die zugehörige XML geschrieben.
Lesen geht dann natürliche ähnlich wie man sie beschreibt.

Antworten
Edu
  • Forum-Beiträge: 13

18.10.2012, 14:10:21 via Website

Achso ok danke für die Antwort



final SharedPreferences settings;
final SharedPreferences.Editor editor;
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
editor = settings.edit();
editor.putString("yyy", "1");
editor.commit();



Aber ich hab echt keine Ahnung wie ich jetzt in den Text einfügen soll, dass für buttonfreigabe 1 gespeichert werden soll.
Etwa so?:

final SharedPreferences settings;
final SharedPreferences.Editor editor;
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
editor = settings.edit();
editor.putString("buttonfreigabe", "1");
editor.commit();

Antworten
Christian
  • Forum-Beiträge: 307

18.10.2012, 14:12:27 via Website

Hi Edu,

Wenn ich die App schließe, wird das dann nicht wieder zurückgesetzt?

Nein nur wenn der User dein App deinstalliert oder er unter Einstellung die Daten der App löscht.

Und wenn es mit SharedPreferences geht, wie kann ich dann zB abfragen ob die Zahl eine eins ist??
In dem du den Wert ausliest und mit eins vergleichst.

Also ungefähr so:
1final String WERT_KEY = "meinKeyfuerWert";
2
3final SharedPreferences settings;
4final SharedPreferences.Editor editor;
5settings = this.getPreferences(MODE_WORLD_WRITEABLE);
6editor = settings.edit();
7editor.putInt(WERT_KEY, 1);
8editor.commit();
9
10
11final int wert = settings.getInt(WERT_KEY, 0));
12
13if(wert == 1){
14 //wird der button freigegeben.
15}
16else{
17 //Es wurde keine 1 gespeichert
18}

mfg Christian

Antworten
Edu
  • Forum-Beiträge: 13

18.10.2012, 14:40:47 via Website

Erstmal Vielen Dank!
Ich will ja nicht nerven aber ich komme im Moment garnicht klar!
Mein Problem ist dass der Button in einer anderen Klasse(x) ist. Die Methode die Buttonfreigabe den Wert zuweisen soll ist in Klasse y.
In y gibt es einen Button, welcher sobald buttonfreigabe den wert 1 bekommen hat die Activity wechseln.
Wenn ich jetzt in der Klasse x bin, ist der Button disabled -.-

Ich hoffe es ist verständlich geschrieben

Und da der Code in der Methode vom Button ist steht dort:
The method getPreferences(int) is undefined for the type new View.OnClickListener(){}

— geändert am 18.10.2012, 14:42:52

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

18.10.2012, 15:33:01 via Website

Mach Dir doch eine Tools Klasse mit zwei statischen Methoden. Die sind von überall erreichbar:

1public static void setPreferenceString(Context context, String key, String value) {
2 SharedPreferences sharedPreferences = PreferenceManager
3 .getDefaultSharedPreferences(context);
4 SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
5 sharedPreferencesEditor.putString(key, value);
6 sharedPreferencesEditor.commit();
7}
8
9public static String getPreferenceString(Context context, String key, String defaultValue) {
10 SharedPreferences sharedPreferences = PreferenceManager
11 .getDefaultSharedPreferences(context);
12 return sharedPreferences.getString(key, defaultValue);
13}

— geändert am 18.10.2012, 15:33:11

Antworten
Edu
  • Forum-Beiträge: 13

18.10.2012, 16:03:16 via Website

Danke :) Probiere ich gleich aus !

Antworten
Edu
  • Forum-Beiträge: 13

20.10.2012, 16:18:06 via Website

Ich habe eine Klasse "Preferences" erstellt:
public class Preferences {


public static void setPreferenceString(Context context, String key, String value) {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(context);
SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
sharedPreferencesEditor.putString(key, value);
sharedPreferencesEditor.commit();
}

public static String getPreferenceString(Context context, String key, String defaultValue) {
SharedPreferences sharedPreferences = PreferenceManager
.getDefaultSharedPreferences(context);
return sharedPreferences.getString(key, defaultValue);



}

Und jetzt will ich, dass die eingabe in EditText a gespeichert wird:


EditText a = (EditText) findViewById(R.id.editText1);
String textnachstring = a.getText().toString();
String eingabe = Preferences.putString(eingabe, textnachstring);

Das klappt aber nicht-.-
The method putString(String, String) is undefined for the type Preferences

— geändert am 20.10.2012, 16:35:40

Antworten
Christian
  • Forum-Beiträge: 307

20.10.2012, 20:07:12 via Website

Hi Edu,


EditText a = (EditText) findViewById(R.id.editText1);
String textnachstring = a.getText().toString();
String eingabe = Preferences.putString(eingabe, textnachstring);

Das klappt aber nicht-.-
The method putString(String, String) is undefined for the type Preferences

Bist du dir sicher das du verstehst was du da machst?

Du hast eine Klasse Preferences erstellt diese hat nur die 2 Methoden setPreferenceString und getPreferenceString keine Methode putString.

Wenn du so eine Methode haben möchtest bzw benötigst musst du sie selbst erstellen.

Solltest du den "textnachstring" in der Preference speichern wollen nutze doch setPreferenceString.

Oder möchtest du was ganz anderes?

mfg Christian

Antworten
Edu
  • Forum-Beiträge: 13

21.10.2012, 13:13:46 via Website

Ne sry, es hat jetzt geklappt Christian, aber wenn ich mit einer anderen Activity auf die Variable zugreifen will geht es nicht.

public class Probe extends Activity {
public static SharedPreferences name;
public static String Data;
public static String dataa;

public String getStringValue() {
return dataa;
}

public void setStringValue(String Value) {
dataa = Value;
}


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.probe);
Button speichern = (Button) findViewById(R.id.save);
final TextView TextViewA= (TextView)findViewById(R.id.tVa);
final EditText name= (EditText) findViewById(R.id.editText1);

final SharedPreferences settings;
final SharedPreferences.Editor editor;
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
editor = settings.edit();
editor.putString("sharedString", Data);
editor.commit();



speichern.setOnClickListener(new View.OnClickListener(){
public void onClick(View arg0){


Data = firstplayer.getText().toString();
final String dataa = settings.getString("sharedString", Data);
TextViewA.setText("Name:"+ dataa);

Intent start = new Intent(getApplicationContext(), hauptmenu.class);
startActivity(start);



}

});




}
}

public class hauptmenu extends Activity{


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hauptmenu);




Probe appState = ((Probe)getApplicationContext());
String state = appState.getStringValue();


TextView Name = (TextView)findViewById(R.id.textviewName);
Name.setText(state);


}

}

Wenn ich jetzt auf den Button Speichern drücke wird die App geschlossen

10-21 13:05:19.025: E/AndroidRuntime(14790): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yy.xxx/com.yy.xxx.hauptmenu}: java.lang.ClassCastException: android.app.Application cannot be cast to com.yy.xxx.Probe


MfG

— geändert am 21.10.2012, 13:15:48

Antworten
Christian
  • Forum-Beiträge: 307

21.10.2012, 14:09:40 via Website

Hi Edu,

10-21 13:05:19.025: E/AndroidRuntime(14790): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yy.xxx/com.yy.xxx.hauptmenu}: java.lang.ClassCastException: android.app.Application cannot be cast to com.yy.xxx.Probe

ich vermute mal dein Problem liegt hier:
1Probe appState = ((Probe)getApplicationContext());

Harald Wilhelm hat dir in seinem Post die Lösung für dein Problem gezeigt. Wenn du diese nicht verstehst bzw nicht verstehst wie du sie Einsätzen sollst warum fragst du dann nicht noch mal nach und lässt es dir erklären?

Vielleicht hilft dir ja dieser Code:
Klasse Tools:
1//Klasse Tools sie ermöglicht das Speichern und Ausgeben deiner Werte aus den "Preference"
2public class Tools{
3
4//Speichert die Eingaben
5public static void setPreferenceString(Context context, String key, String value) {
6 SharedPreferences sharedPreferences = PreferenceManager
7 .getDefaultSharedPreferences(context);
8 SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit();
9 sharedPreferencesEditor.putString(key, value);
10 sharedPreferencesEditor.commit();
11}
12
13//Ausgabe der Eingaben
14public static String getPreferenceString(Context context, String key, String defaultValue) {
15 SharedPreferences sharedPreferences = PreferenceManager
16 .getDefaultSharedPreferences(context);
17 return sharedPreferences.getString(key, defaultValue);
18}
19}

Activity Probe:
1public class Probe extends Activity {
2
3@Override
4public void onCreate(Bundle savedInstanceState) {
5super.onCreate(savedInstanceState);
6setContentView(R.layout.probe);
7//UI Elemente
8Button speichern = (Button) findViewById(R.id.save);
9final TextView textViewA= (TextView)findViewById(R.id.tVa);
10final EditText name= (EditText) findViewById(R.id.editText1);
11
12final Context context = getApplicationContext();
13
14//Abspeichern deiner Daten
15Tools.setPreferenceString(context, "dasIstMeinKey", "dasIstderWert");
16
17speichern.setOnClickListener(new View.OnClickListener(){
18
19public void onClick(View arg0){
20
21//Auslesen der Daten
22String dataFromPref = Tools.getPreferenceString(context, "dasIstMeinKey", "dasIstderDefaultWert");
23TextViewA.setText("Daten aus der Preference:"+ dataFromPref);
24
25Intent start = new Intent(getApplicationContext(), Hauptmenu.class);
26startActivity(start);
27}
28
29});

Activity Hauptmenu:
1public class Hauptmenu extends Activity{
2
3@Override
4public void onCreate(Bundle savedInstanceState) {
5super.onCreate(savedInstanceState);
6setContentView(R.layout.hauptmenu);
7
8Final Context context = getApplicationContext();
9TextView name = (TextView)findViewById(R.id.textviewName);
10String state = Tools.getPreferenceString(context, "dasIstMeinKey", "dasIstderDefaultWert");
11name.setText(state);
12
13}
14
15}

Ich würde dir empfehlen, das du bevor du weiter mit Android entwickelst ein paar Java Tuts machst um die Grundlagen zu festigen.

mfg Christian

— geändert am 21.10.2012, 14:12:40

Antworten
Edu
  • Forum-Beiträge: 13

28.10.2012, 15:17:04 via Website

Danke erstmal,
ich will aber, dass das da der Text von Data drin steht, aber so klappt es dann wieder nicht
String Data = a.getText().toString();

Antworten
Christian
  • Forum-Beiträge: 307

28.10.2012, 16:51:50 via Website

Hi Edu,


ich will aber, dass das da der Text von Data drin steht, aber so klappt es dann wieder nicht
String Data = a.getText().toString();

mmhh und was klappt jetzt nicht? Steht in "data" nicht das drin was drin stehen soll? Wird "data" nicht in die Preference geschrieben?

mfg christian

P.s. Instanzen bzw Objekte werden in Java kleingeschrieben

Antworten
Edu
  • Forum-Beiträge: 13

29.10.2012, 17:07:45 via Website

getText().toString()
Ist doch richtig dafür oder?
Wenn ich da jetzt data einsetze, kann ich da von einer anderen Klasse nicht drauf zugreifen

Antworten
Christian
  • Forum-Beiträge: 307

29.10.2012, 17:33:05 via Website

Hi Edu,


getText().toString()
Ist doch richtig dafür oder?

Für was? Das auslesen der Daten aus "a"?

Wenn ich da jetzt data einsetze, kann ich da von einer anderen Klasse nicht drauf zugreifen
Wo setzt du "data" ein?

Für welche Lösung hast du dich jetzt entschieden? Die von Harald Wilhelm oder eine anderen?
Weil so langsam sehe ich nicht mehr durch wo du bist bzw welchen Code du benutzt.

mfg Christian

Antworten