Shared Preferences nur teilweise gespeichert ?

  • Antworten:5
Da Vid
  • Forum-Beiträge: 11

10.07.2012, 23:17:18 via Website

Hi,

ich hab gerade das Problem, dass meine App beim Verlassen (nur über den Back Button, nicht Home... da funktioniert es...) nur den Status des toggle Button 1 speichert... der des toggle button 2 wird ignoriert!

In der App zwischen den einzelnen Activities funktioniert alles!

Hat jemand eine Idee?

Wäre echt dankbar!!



1import android.app.Activity;
2import android.app.AlertDialog;
3import android.content.DialogInterface;
4import android.content.Intent;
5import android.content.SharedPreferences;
6import android.content.SharedPreferences.Editor;
7import android.os.Bundle;
8import android.preference.PreferenceManager;
9import android.view.View;
10import android.view.View.OnClickListener;
11import android.widget.Button;
12import android.widget.CompoundButton;
13import android.widget.CompoundButton.OnCheckedChangeListener;
14import android.widget.ToggleButton;
15
16public class MainActivity extends Activity implements OnCheckedChangeListener,
17 OnClickListener {
18
19
20 ToggleButton toggle1;
21 ToggleButton toggle2;
22
23 public static final String toggle1_pref = "toggleButton1";
24 public static final String toggle2_pref = "toggleButton2";
25
26 public static SharedPreferences savePrefsToggle1;
27 public static SharedPreferences savePrefsToggle2;
28
29 @Override
30 public void onCreate(Bundle savedInstanceState) {
31
32 super.onCreate(savedInstanceState);
33
34 setContentView(R.layout.activity_main);
35
36 loadPrefsToggle1();
37 loadPrefsToggle2();
38
39 ToggleButton toggle1 = (ToggleButton) findViewById(R.id.toggleButton1);
40 ToggleButton toggle2 = (ToggleButton) findViewById(R.id.toggleButton2);
41
42 Button button1 = (Button) findViewById(R.id.button1);
43
44 if (toggle1 != null) {
45 toggle1.setOnCheckedChangeListener(this);
46 }
47
48 if (toggle2 != null) {
49 toggle2.setOnCheckedChangeListener(this);
50 }
51
52 if (button1 != null) {
53 button1.setOnClickListener(this);
54 }
55
56
57
58 }
59
60 private void loadPrefsToggle1() {
61
62 SharedPreferences sp = PreferenceManager
63 .getDefaultSharedPreferences(this);
64 boolean swValue = sp.getBoolean(toggle1_pref, true);
65
66 ToggleButton toggle1 = (ToggleButton) findViewById(R.id.toggleButton1);
67
68 if (swValue) {
69 toggle1.setChecked(true);
70 } else {
71 toggle1.setChecked(false);
72 }
73
74 }
75
76 private void loadPrefsToggle2() {
77
78 SharedPreferences sp = PreferenceManager
79 .getDefaultSharedPreferences(this);
80 boolean swValue = sp.getBoolean(toggle2_pref, true);
81
82 ToggleButton toggle2 = (ToggleButton) findViewById(R.id.toggleButton2);
83
84 if (swValue) {
85 toggle2.setChecked(true);
86 } else {
87 toggle2.setChecked(false);
88 }
89
90 }
91
92 public void onCheckedChanged(CompoundButton toggle1, boolean isChecked) {
93
94 savePrefsToggle1(toggle1_pref, toggle1.isChecked());
95
96 }
97
98 public void onCheckedChanged1(CompoundButton toggle2, boolean isChecked) {
99
100 savePrefsToggle2(toggle2_pref, toggle2.isChecked());
101
102 }
103
104 private void savePrefsToggle1(String key, boolean value) {
105
106 SharedPreferences sp = PreferenceManager
107 .getDefaultSharedPreferences(this);
108 Editor edit = sp.edit();
109 edit.putBoolean(key, value);
110 edit.commit();
111
112 }
113
114 private void savePrefsToggle2(String key, boolean value) {
115
116 SharedPreferences sp = PreferenceManager
117 .getDefaultSharedPreferences(this);
118 Editor edit = sp.edit();
119 edit.putBoolean(key, value);
120 edit.commit();
121
122 }
123
124 public void onClick(View button1) {
125
126 if (button1.isPressed()) {
127 contacts();
128
129 }
130
131 }
132
133 private void contacts() {
134
135 Thread StarteContacts = new Thread() {
136 public void run() {
137
138 try {
139 Intent ContactsIntent = new Intent(
140 "my.own.smsautoresponse.ManageContacs");
141 startActivity(ContactsIntent);
142
143 } finally {
144
145 onPause();
146 }
147
148 }
149
150 };
151 StarteContacts.start();
152 }
153
154 // DO YOU REALLY WANT TO EXIT?
155 public void finish() {
156 AlertDialog.Builder builder = new AlertDialog.Builder(this);
157 builder.setMessage("Do you really want to exit?");
158 builder.setCancelable(false);
159 builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
160 public void onClick(DialogInterface dialog, int id) {
161 quit();
162 }
163 });
164 builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
165 public void onClick(DialogInterface dialog, int id) {
166 dialog.cancel();
167 }
168 });
169 AlertDialog alert = builder.create();
170 alert.show();
171 }
172
173 public void quit() {
174
175
176
177 super.finish();
178 };
179}

Antworten
Michael H
  • Forum-Beiträge: 127

11.07.2012, 10:01:23 via Website

Hallo Da Vid

Du setzt bei beiden ToggleButtons denselben Listener, nämlich "this". Dies bedeutet dass wenn ein registrierter Toggle geändert wird, wird (bei beiden Fällen) die überschriebene Methode onCheckedChanged aufgerufen. Deine onCheckedChanged-Methode wird also nie aufgerufen, da du auch beim toggle 2 den Listener auf this gesetzt hast.

Die onCheckedChanged1 Methode kannst du vergessen. Die Logik dieser, kannst du einfach in onCheckedChanged übernehmen.

Tipp: Mir ist aufgefallen, dass du viel redundanter Code hast. z.B. loadPrefsToggle1 / loadPrefsToggle2. Da beide Methoden beinahe identischen Code besitzen, würde ich in diesem Fall eine einzige Methode schreiben und das zu ladende Toggle mit einem Parameter mitgeben. Dasselbe beim savePrefsToggle1 / savePrefsToggle2...

Hoffe konnte dir weiterhelfen

Gruss Michi

Antworten
Da Vid
  • Forum-Beiträge: 11

11.07.2012, 10:12:38 via App

Super Antwort!!! Danke ich werde das nachher sofort ausprobieren und dann schreiben obs funktioniert ja :)))) vielen Dank!!!!

Antworten
Da Vid
  • Forum-Beiträge: 11

12.07.2012, 21:35:40 via Website

So hatte wenig Zeit - es hat funktioniert!! Danke an dieser Stelle nochmals für den Support!!

Du setzt bei beiden ToggleButtons denselben Listener, nämlich "this"."

eigentlich dachte ich , dass ich dem Listener damit sage "Hey schau mal hier in dieser Activity unter diesem Layout nach" - stimmt das nicht?

so wie ichs jetzt gemacht habe, scheint es zu funktionieren!

1Button button1 = (Button) findViewById(R.id.button1);
2 ToggleButton toggle1 = (ToggleButton) findViewById(R.id.toggleButton1);
3 ToggleButton toggle2 = (ToggleButton) findViewById(R.id.toggleButton2);
4
5 if (toggle1 != null) {
6 toggle1.setOnCheckedChangeListener(this);
7 }
8
9 if (toggle2 != null) {
10 toggle2.setOnCheckedChangeListener(this);
11 }
12
13 if (button1 != null) {
14 button1.setOnClickListener(this);
15 }




1public void onCheckedChanged(CompoundButton toggleButton, boolean isChecked) {
2 switch (toggleButton.getId()) {
3 case R.id.toggleButton1:
4 if (isChecked) {
5 savePrefsToggle1(toggle1_pref,true);
6 System.out.println("Toggle1: true");
7 }
8 else
9 {
10 savePrefsToggle1(toggle1_pref,false);
11 }
12 break;
13
14 case R.id.toggleButton2:
15 if (isChecked) {
16 savePrefsToggle2(toggle2_pref, true);
17 System.out.println("Toggle2: true");
18 }
19 else
20 {
21 savePrefsToggle2(toggle2_pref, false);
22 }
23
24 break;
25 }
26 }


Wenn du noch einen Verbesserungsvorschlag für den oberen Teil hast und wie ich das dann machen soll wäre das natürlich noch ein schöner Abschluss ;)

Antworten
Michael H
  • Forum-Beiträge: 127

13.07.2012, 10:32:08 via Website

Hallo Da Vid

Freut mich wenns geklappt hat! :)
Habe jedoch noch ein paar Verbesserungsvorschläge:

  • Die Überprüfung "if (toggle1 != null) usw..." kannst du dir eigentlich sparen, da die Toggle Buttons ohnehin schon von findViewById() abgeholt und referenziert werden. Deshalb kann toggle1 eigentlich nie null sein.
  • Ich würde aus den Methoden savePrefsToggle1() und savePrefsToggle2() eine gemeinsame Methode z.B. einfach savePrefsToggle() machen. Dieser kannst du ja die ToggleButtons (toggle1, toggle2) sowie den Zustand (true, false) mitgeben.
  • Das ganze "if (isChecked)" kannst du dir auch sparen. Einfach in der savePrefsToggle() statt true oder false reinzuhacken, kannst du direkt savePrefsToggle(IrgendEinToggleButton, isChecked) übergeben. So kannst du dir ne Menge unnötiger Code sparen.

ps. Habe dir bewusst kein DemoCode geschrieben, da du ja auch noch was lernen musst...:)

Gruss Michi

Antworten
Da Vid
  • Forum-Beiträge: 11

14.07.2012, 14:23:42 via Website

Hi Michael,

ja da hast durchaus recht mich das selber machen zu lassen, der Lerneffekt ist da wirklich am größten ;)
danke auch für die anderen Verbesserungsvorschläge! Werde ich definitiv einfließen lassen um unnötige Redundanzen zu verhindern!!
Danke dir nochmals für die super Hilfe!!

Grüße

David

Antworten