Einige Probleme...

  • Antworten:28
  • Bentwortet
Imagine Box
  • Forum-Beiträge: 346

20.12.2013, 20:29:57 via Website

Hi Leute,

ich habe einige kleine Probleme in meiner App.


1) Ich habe einen Hilfe Screen erstellt, die App prüft ob es der erste Start ist. Und das folgendermaßen:
1// here goes standard code
2
3 SharedPreferences pref = getSharedPreferences("mypref", MODE_PRIVATE);
4
5 if (pref.getBoolean("firststart", true)) {
6 // update sharedpreference - another start wont be the first
7 SharedPreferences.Editor editor = pref.edit();
8 editor.putBoolean("firststart", false);
9 editor.commit(); // apply changes
10
11 // first start, show your dialog | first-run code goes here
12 .....

Wie bekomme ich es nun hin, dass die Nutzer den Hilfe Screen auch nach einem Update zu sehen bekommen und nicht nur beim ersten Start? Momentan muss man immer die App Daten in Android löschen.

2)
In der ersten Hilfe wird auch der Name abgefragt. Leider können Nutzer der Eingabe "entwischen" indem sie einfach den zurück Knopf drücken. Ich habe diesen nämlich in der gesamten App so eingestellt, dass dieser den Nutzer immer wieder zurück ins Hauptmenü bringt. Sieht so aus:
1@Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3 if (keyCode == KeyEvent.KEYCODE_BACK && mainisopen == false) {
4 mainisopen = true;
5 setContentView(R.layout.activity_main);
6 com.actionbarsherlock.app.ActionBar bar = getSupportActionBar();
7 bar.setTitle("");
8 return true;
9 }
10 return super.onKeyDown(keyCode, event);

Wie kann ich den zurück Button nur für die wenigen Layouts sperren?

3)
Ich speichere den abgefragten Namen via Shared Preferences. Ich gebe einen kurzen Toast aus, wenn alles geklappt hat. Er soll ungefähr so lauten wie "Schön dich zu sehen XY". Mein Code dafür sieht so aus:
1Toast.makeText(getApplicationContext(),
2 R.string.welcome + " " + name,
3 Toast.LENGTH_LONG).show();

Leider kommt da so etwas raus wie "2131492940 Henrik". Woran liegt das? Was habe ich falsch gemacht? Sonst funktioniert die Abfrage tadellos!


Mit freundlichen Grüßen,

Henrik

— geändert am 20.12.2013, 20:33:51

Antworten
impjor
  • Forum-Beiträge: 1.793

20.12.2013, 22:30:10 via App

2) Benutze besser Activities statt mehreren Layouts. Dann löst sich dein Problem auch in Luft aus.

3)R.string.welcome ist nur ein int-Wert zur Referenzierung, nicht der wirkliche String. Nutze dafür getResources().getString(R.string.welcome)

LG

— geändert am 20.12.2013, 22:31:12

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Imagine Box
  • Forum-Beiträge: 346

20.12.2013, 23:26:13 via Website

Danke, hat geklappt! Gibt es noch eine einfachere Möglichkeit den zurück Button kurzfristig zu deaktivieren? Und weiß noch jemand Antwort auf Frage 1?

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

21.12.2013, 00:43:25 via Website

Wie bekomme ich es nun hin, dass die Nutzer den Hilfe Screen auch nach einem Update zu sehen bekommen und nicht nur beim ersten Start?

Wie wäre es damit, statt true/false die Versionsnummer der App zu speichern und mit der aktuellen zu vergleichen?

Antworten
Imagine Box
  • Forum-Beiträge: 346

21.12.2013, 12:12:04 via Website

Hmmm, okay. Ich komme nicht wirklich weiter. Ich habe das hier gemacht:

1public class MainActivity extends Activity {
2
3 boolean Updated = true;

1@Override
2 protected void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4
5 PackageInfo packageInfo = this.getPackageManager()
6 .getPackageInfo(this.getPackageName(), 0);
7 int versionCode = packageInfo.versionCode;
8
9 SharedPreferences pref = getSharedPreferences("mypref", MODE_PRIVATE);
10
11 if (pref.getBoolean("Updated", true)) {
12 SharedPreferences.Editor editor = pref.edit();
13 editor.putBoolean("Updated", false);
14 editor.commit();
15
16 setContentView(R.layout.first_start_help);

Funktionieren wird das wohl nicht :) Wie bekomme ich es hin die aktuelle Version mit der letzten zu vergleichen?

— geändert am 21.12.2013, 12:15:48

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

21.12.2013, 12:32:39 via Website

Wenn du deinen (offenbar kopierten) "pref" Code nicht anpasst: gar nicht :-)

Was genau ist denn gerade dein Problem?
Verstehst du die Logik nicht oder weißt du nicht wie du die umsetzen kannst?

Antworten
Imagine Box
  • Forum-Beiträge: 346

21.12.2013, 12:37:18 via Website

Nein, die Logik ist mir schon klar aber die Umsetzung ist mir schleierhaft. Ja, der Code ist kopiert denn ich habe mich ja im Internet schlau gemacht :)

Also: ich will die aktuelle Versionsnummer bekommen und zwar mit

1PackageInfo packageInfo = this.getPackageManager()
2.getPackageInfo(this.getPackageName(), 0);
3 int versionCode = packageInfo.versionCode;

Jetzt habe ich die aktuelle Version als Integer bekommen. Soll ich den jetzt in shared Preferences speichern? Und wie erfahre ich jetzt ob die Version höher liegt als die Alte?

— geändert am 21.12.2013, 12:46:20

Antworten
Imagine Box
  • Forum-Beiträge: 346

21.12.2013, 13:03:43 via Website

Ich habe Problem 2 jetzt gelöst. Ich frage einfach bei jedem Start ab, ob der Name vorhanden ist. Wenn ja, läuft die App normal weiter. Wenn nicht, wird der Hilfe Bildschirm wieder angezeigt. Man muss sich ja etwas einfallen lassen :-)

— geändert am 21.12.2013, 13:04:04

Antworten
impjor
  • Forum-Beiträge: 1.793

21.12.2013, 14:55:57 via App

Du hättest einfach geprüft, ob ein Versions-Int in den SharedPreferences schon gibt. Nein = erster Start
Ja: Dann jetzigen int und int aus SharedPreferences vergleichen, wenn jetziger gröser = Update
gleich = kein Update

Am Ende jetzigen int in SharedPreferences speichern.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

21.12.2013, 18:12:54 via Website

Nein, die Logik ist mir schon klar
...
Jetzt habe ich die aktuelle Version als Integer bekommen. Soll ich den jetzt in shared Preferences speichern?

So klar war dir die Logik dann wohl doch nicht ;-)

@impjor: nicht immer gleich vorsagen, da lernt er ja nix :-P

Antworten
Imagine Box
  • Forum-Beiträge: 346

21.12.2013, 18:42:07 via Website

Kommt darauf an, wie du "Logik" definierst :grin:
Aber danke euch beiden. Ich werde mir das nochmal überlegen!

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

21.12.2013, 18:47:01 via Website

die Versionsnummer der App zu speichern und mit der aktuellen zu vergleichen

Soll ich den jetzt in shared Preferences speichern?

Kommt darauf an, wie du "Logik" definierst

Gibts da (siehe oben) noch viel Interpretations-Spielraum? :P

Antworten
Imagine Box
  • Forum-Beiträge: 346

21.12.2013, 19:36:26 via Website

So, ich habe es mal versucht aber glaube nicht das da wirklich viel bei raus gekommen ist. Die vorletzte Klammer wird mir als falsch angezeigt :(

1int version = 0;
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6
7 PackageManager manager = this.getPackageManager();
8 try {
9 PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
10 int version = info.versionCode;
11 SharedPreferences sharedPref = getSharedPreferences("Updatepref", 0);
12 SharedPreferences.Editor editor = sharedPref.edit();
13 editor.putInt("ver", version);
14 editor.commit();
15 Integer ver = sharedPref.getInt("ver", version);
16 if (ver == null) {
17
18 //dies ist erster Start
19 setContentView(R.layout.first_start);
20 } else if
21 (ver > sharedPref.getInt("ver", version)) {
22
23 //Jetziger Wert größer als vorher = Update
24 setContentView(R.layout.first_start);
25 }else if
26 (ver < sharedPref.getInt("ver", version)) {
27
28 //Jetziger Wert kleiner als vorher = kein Update
29 setContentView(R.layout.activity_main);
30 }
31 }

Zunächst habe ich die Versionsnummer angefordert. Die soll in dem Integer "version" gespeichert werden. Dieser wiederum wird in den Shared Preferences "sharedPref " gesichert werden.
Anschließend versuche ich herauszufinden ob der neue Integer vorhanden ist bzw. größer oder kleiner ist. Danach richtet sich dann, wo der Nutzer landet.

Wo ist da der Fehler? Nochmal danke für eure Geduld ;)

— geändert am 21.12.2013, 19:37:51

Antworten
impjor
  • Forum-Beiträge: 1.793

21.12.2013, 20:37:03 via Website

Du machst zwei entscheidene Fehler: 1. Du speicherst zuerst die Version in den SharedPreference, 2. Was passiert, wenn die Version in den SharedPreferences genausogroß ist wie die gespeicherte?
Was soll das try?

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Imagine Box
  • Forum-Beiträge: 346

21.12.2013, 20:47:32 via Website

Okay, ich habe versucht es zu lösen doch es klappt immer noch nicht :(

1int version = 0;
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6
7 PackageManager manager = this.getPackageManager();
8 PackageInfo info = null;
9 try {
10 info = manager.getPackageInfo(this.getPackageName(), 0);
11 } catch (NameNotFoundException e) {
12 // TODO Auto-generated catch block
13 e.printStackTrace();
14 }
15
16 int version = info.versionCode;
17 SharedPreferences sharedPref = getSharedPreferences("Updatepref", 0);
18 Integer ver = sharedPref.getInt("ver", version);
19 if (ver == null) {
20 //dies ist erster Start
21 setContentView(R.layout.first_start);
22 } else if
23 (ver > sharedPref.getInt("ver", version)) {
24 //Jetziger Wert größer als vorher = Update
25 setContentView(R.layout.first_start);
26 }else if
27 (ver < sharedPref.getInt("ver", version)) {
28 //Jetziger Wert kleiner als vorher = kein Update
29 setContentView(R.layout.activity_main);
30 }
31 }

Das try wollte Eclipse so.

Antworten
impjor
  • Forum-Beiträge: 1.793

21.12.2013, 20:50:26 via Website

impjor
Du machst zwei entscheidene Fehler: 1. Du speicherst zuerst die Version in den SharedPreference Jetzt seicherst du gar nicht mehr, 2. Was passiert, wenn die Version in den SharedPreferences genausogroß ist wie die gespeicherte?

— geändert am 21.12.2013, 20:50:38

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Imagine Box
  • Forum-Beiträge: 346

21.12.2013, 21:17:32 via Website

Wann sollte ich denn speichern? So besser?

1int version = 0;
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6
7 PackageManager manager = this.getPackageManager();
8 PackageInfo info = null;
9 try {
10 info = manager.getPackageInfo(this.getPackageName(), 0);
11 } catch (NameNotFoundException e) {
12 // TODO Auto-generated catch block
13 e.printStackTrace();
14 }
15
16 int version = info.versionCode;
17 SharedPreferences sharedPref = getSharedPreferences("Updatepref", 0);
18 SharedPreferences.Editor editor = sharedPref.edit();
19 Integer ver = sharedPref.getInt("ver", version);
20 editor.commit();
21 if (ver == null) {
22
23 // dies ist erster Start
24 setContentView(R.layout.first_start);
25 } else if (ver > sharedPref.getInt("ver", version)) {
26
27 // Jetziger Wert größer als vorher = Update
28 setContentView(R.layout.first_start);
29 } else if (ver < sharedPref.getInt("ver", version)) {
30
31 // Jetziger Wert kleiner als vorher = kein Update
32 setContentView(R.layout.activity_main);
33 } else if (ver == sharedPref.getInt("ver", version)) {
34
35 // Jetziger Wert genauso groß wie vorher = kein Update
36 setContentView(R.layout.activity_main);
37 }

Es scheint immer noch nicht zu funktionieren :/
Ich werd´ echt noch wahnsinnig!

— geändert am 21.12.2013, 21:21:02

Antworten
Imagine Box
  • Forum-Beiträge: 346

22.12.2013, 12:53:25 via Website

Jetzt speichere ich etwas, aber es funktioniert trotzdem nicht:

1int version = 0;
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6
7 PackageManager manager = this.getPackageManager();
8 PackageInfo info = null;
9 try {
10 info = manager.getPackageInfo(this.getPackageName(), 0);
11 } catch (NameNotFoundException e) {
12 // TODO Auto-generated catch block
13 e.printStackTrace();
14 }
15
16 int version = info.versionCode;
17 SharedPreferences sharedPref = getSharedPreferences("Updatepref", 0);
18 SharedPreferences.Editor editor = sharedPref.edit();
19 Integer ver = sharedPref.getInt("ver", version);
20 editor.commit();
21 if (ver == null) {
22 // dies ist erster Start
23 setContentView(R.layout.first_start);
24 editor.putInt("ver", version);
25 editor.commit();
26 } else if (ver > sharedPref.getInt("ver", version)) {
27 // Jetziger Wert größer als vorher = Update
28 setContentView(R.layout.first_start);
29 } else if (ver < sharedPref.getInt("ver", version)) {
30 // Jetziger Wert kleiner als vorher = kein Update
31 setContentView(R.layout.activity_main);
32 } else if (ver == sharedPref.getInt("ver", version)) {
33 // Jetziger Wert genauso groß wie vorher = kein Update
34 setContentView(R.layout.activity_main);
35 }
36 }

Antworten
impjor
  • Forum-Beiträge: 1.793

22.12.2013, 15:29:06 via App

Mal abgesehen davon, dass der Code sehr unübersichtlich ist, speicherst du immer noch falsch.
Mach am besten zwei Funktionen. Die erste prüft, ob erster Start o. Update und zeigt deine Meldung an, die zweite speichert die aktuelle Version in SharedPreferences.
Dann wird alles übersichtlicher und du erkennst den Fehler.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

22.12.2013, 15:34:02 via App

impjor
Mal abgesehen davon, dass der Code sehr unübersichtlich ist, speicherst du immer noch falsch.
Mach am besten zwei Funktionen. Die erste prüft, ob erster Start o. Update und zeigt deine Meldung an, die zweite speichert die aktuelle Version in SharedPreferences.
Dann wird alles übersichtlicher und du erkennst den Fehler.

LG

Da kann ich dir nur zustimmen. ist aber typischer Anfänger fehler alles in ein. spreche aus Erfahrung. :-)

Gruß Ludy

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Imagine Box
  • Forum-Beiträge: 346

22.12.2013, 20:01:11 via Website

Was meint ihr mit "alles in ein"? Sorry, wenn ich mich jetzt doof anstelle :)

So etwa:

1int version = 0;
2
3 @Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6
7 PackageManager manager = this.getPackageManager();
8 PackageInfo info = null;
9 try {
10 info = manager.getPackageInfo(this.getPackageName(), 0);
11 } catch (NameNotFoundException e) {
12 // TODO Auto-generated catch block
13 e.printStackTrace();
14 }
15
16 int version = info.versionCode;
17 SharedPreferences sharedPref = getSharedPreferences("Updatepref", 0);
18 SharedPreferences.Editor editor = sharedPref.edit();
19 Integer ver = sharedPref.getInt("ver", version);
20 editor.commit();
21 if (ver == null) {
22 // dies ist erster Start
23
24 setContentView(R.layout.first_start);
25 } else if (ver > sharedPref.getInt("ver", version)) {
26
27 // Jetziger Wert größer als vorher = Update
28 setContentView(R.layout.first_start);
29
30 }
31 editor.putInt("ver", version);
32 editor.commit();
33
34 if (ver < sharedPref.getInt("ver", version)) {
35 // Jetziger Wert kleiner als vorher = kein Update
36
37 setContentView(R.layout.activity_main);
38 } else if (ver == sharedPref.getInt("ver", version)) {
39 // Jetziger Wert genauso groß wie vorher = kein Update
40
41 setContentView(R.layout.activity_main);
42 }
43 }

Ich werde wirklich noch irre! Es kann doch wohl nicht so schwierig sein!!!!

Also:

In jedem Fall brauche ich den Package Manager zu Anfang um den Versions Code herauszufinden. Und ich muss in den Shared Preferences nachsehen, ob ein Wert überhaupt vorhanden ist.
Wenn nicht wird geprüft ob die aktuelle höher liegt als die aus den Shared Preferences.

Danach weiß ich nicht mehr, was zu tun ist :/

— geändert am 22.12.2013, 20:39:27

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

22.12.2013, 21:20:32 via App

Alles in ein heißt das du alles in der onCreate definierst und keine Methode erstellst für jede Aufgabe. Du wirst das früher oder später mitbekommen spreche aus Erfahrung.

Edit: für was brauchst du die Version Update abfrage???

Hier nen kleines Beispiel:
1private SharedPreferences sharedPref;
2 private Editor editor;
3
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7
8 setContentView(R.layout.activity_main);
9
10 sharedPref = getSharedPreferences("Einstellungen", Context.MODE_PRIVATE);
11 editor = sharedPref.edit();
12
13 if (sharedPref.getInt("firstStart", -1) < 0) {
14 // starte Dialog mit allen EinstellungenParametern und prüfe ob alle Angaben gemacht wurden sind.
15 // Danach dann mit:
16// editor.putInt("firstStart", 0);
17// editor.putString("Vorname", "Max");
18// editor.putString("Nachname", "Mustermann");
19// editor.putInt("Alter", 18);
20// und dann ->>>>>> editor.commit();
21 } else {
22 // starte Activity normal
23 }
24 }

Gruß Ludy

— geändert am 22.12.2013, 22:03:41

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Imagine Box
  • Forum-Beiträge: 346

22.12.2013, 22:26:32 via Website

Okay.

für was brauchst du die Version Update abfrage???

Falls du meinst warum ich das ganze mache: Ich möchte den Nutzern beim ersten Start oder nach einem Update eine Hilfe zeigen.

Ich soll also sozusagen in der oncreate Platz sparen?

Leider weiß ich trotzdem nicht mehr weiter :(

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.958

22.12.2013, 23:48:06 via Website

1try {
2 aktuelleAppVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
3 } catch (NameNotFoundException e) {
4 aktuelleAppVersion = -1;
5 e.printStackTrace();
6 }
7
8 sharedPref = getSharedPreferences("Einstellungen", Context.MODE_PRIVATE);
9 editor = sharedPref.edit();
10
11 if (sharedPref.getInt("firstStart", -1) < 0 || sharedPref.getInt("appVersion", -1) < aktuelleAppVersion) {
12 // starte Dialog mit Hilfe und prüfe ob alle
13
14 // Danach dann mit wenn im Dialog okay geklickt dann:
15 // editor.putInt("appVersion", aktuelleAppVersion);
16 // editor.putInt("firstStart", 0);
17 // editor.commit();
18 } else {
19 // starte Activity normal
20 }
21 }

Gruß Ludy

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Imagine Box
  • Forum-Beiträge: 346

23.12.2013, 13:55:15 via Website

Danke, hat nach einigen Anpassungen funktioniert. Einen Teil habe ich jedoch noch nicht verstanden:

1if (sharedPref.getInt("firstStart", -1) < 0 || sharedPref.getInt("appVersion", -1) <

Wofür steht da das "||"?

Antworten
Imagine Box
  • Forum-Beiträge: 346

23.12.2013, 14:36:51 via Website

Achso, okay. Vielen Dank!

Antworten