If Abfrage über mehrere Seiten

  • Antworten:10
hopsi
  • Forum-Beiträge: 5

24.09.2012, 20:11:33 via Website

Hi,
bin neu hier und habe erst vor ein paar Tagen mit der Android-App Programmierung angefagen. Meine erste App, soll mir eine Durchschnittsnote ausrechnen.
Dazu habe ich 4 .xml Seiten angefertigt, die nacheinander aufgerufen werden, das funktioniert auch schon. Auf jeder Seite sind Fächer angegeben, dort kann man die Noten in ein Textfeld eintragen. Auf der letzten Seite ist ein Button, mit dem man seine Durchschnittsnote berechnen kann.
Die Berechnung funktioniert auch, wenn man überall eine Note eingetragen hat. Jetzt habe ich allerdings ein Problem damit, wenn jemand eine Klausur nicht mitgeschrieben hat und das Feld freilassen möchte.
Diesen Fall möchte ich dann mit einer IF-Abfrage von meiner Berechnung ausschließen und habe es wie im angezeigten Code versucht. Dort Frage ich nach der Länge des eingegebenen Textes, dieser müsste ja Null sein, wenn nix eingegeben wurde (im Hint Feld steht allerdings etwas, aber das dürfte ja keine Auswirkung haben). Leider stürzt mein Programm ab und ich weiß nicht, wie ich das ganze besser bewerkstelligen soll.
Ich würde mich sehr freuen, wenn mir jemand weiter helfen kann.

Danke und Grüße,
hopsi


1package durchschnittsnote.elektrotechnik;
2
3import android.os.Bundle;
4import android.app.Activity;
5import android.view.Menu;
6import android.view.View;
7import android.widget.EditText;
8
9public class MainActivity extends Activity {
10
11 @Override
12 public void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 setContentView(R.layout.activity_main);
15 }
16
17
18 float et1, mathe1, kon, et2, mathe2, digi, prog, wet, physik;
19 int div=17;
20
21
22 public void semester1klick (View view) {
23 setContentView(R.layout.semester1);
24
25 }
26
27
28
29 public void semester2klick (View view) {
30
31
32
33
34 EditText Feld1 = (EditText)findViewById(R.id.et1);
35 EditText Feld2 = (EditText)findViewById(R.id.mathe1);
36 EditText Feld3 = (EditText)findViewById(R.id.kon);
37
38
39 if (Feld1.getText().toString().length() == 0){
40 div=div-2;
41
42 }
43 if (Feld2.getText().toString().length() == 0){
44 div=div-2;
45
46
47 }
48 if (Feld3.getText().toString().length() == 0){
49 div=div-1;
50
51
52 }
53
54 et1 = Float.parseFloat(Feld1.getText().toString());
55 mathe1 = Float.parseFloat(Feld2.getText().toString());
56 kon = Float.parseFloat(Feld3.getText().toString());
57
58
59 setContentView(R.layout.semester2);
60
61
62
63
64 }
65
66 public void semester3klick (View view) {
67
68 EditText Feld4 = (EditText)findViewById(R.id.et2);
69 EditText Feld5 = (EditText)findViewById(R.id.mathe2);
70 EditText Feld6 = (EditText)findViewById(R.id.digi);
71 EditText Feld7 = (EditText)findViewById(R.id.prog);
72 EditText Feld8 = (EditText)findViewById(R.id.wet);
73 EditText Feld9 = (EditText)findViewById(R.id.physik);
74
75
76
77
78 if (Feld4.getText().toString().length() == 0){
79 div=div-1;
80
81 }
82 if (Feld5.getText().toString().length() == 0){
83 div=div-1;
84
85 }
86 if (Feld6.getText().toString().length() == 0){
87 div=div-1;
88
89 }
90 if (Feld7.getText().toString().length() == 0){
91 div=div-1;
92
93 }
94 if (Feld8.getText().toString().length() == 0){
95 div=div-1;
96
97 }
98 if (Feld9.getText().toString().length() == 0){
99 div=div-2;
100
101 }
102
103
104 et2 = Float.parseFloat(Feld4.getText().toString());
105 mathe2 = Float.parseFloat(Feld5.getText().toString());
106 digi = Float.parseFloat(Feld6.getText().toString());
107 prog = Float.parseFloat(Feld7.getText().toString());
108 wet = Float.parseFloat(Feld8.getText().toString());
109 physik = Float.parseFloat(Feld9.getText().toString());
110
111
112
113 setContentView(R.layout.semester3);
114 }
115
116 public void BerechnenKlick (View view){
117 float tele, disi, eg3, mess, energie;
118 float ergebnis;
119
120
121 EditText Feld10 = (EditText)findViewById(R.id.tele);
122 EditText Feld11 = (EditText)findViewById(R.id.disi);
123 EditText Feld12 = (EditText)findViewById(R.id.eg3);
124 EditText Feld13 = (EditText)findViewById(R.id.mess);
125 EditText Feld14 = (EditText)findViewById(R.id.energie);
126
127
128 tele = Float.parseFloat(Feld10.getText().toString());
129 disi = Float.parseFloat(Feld11.getText().toString());
130 eg3 = Float.parseFloat(Feld12.getText().toString());
131 mess = Float.parseFloat(Feld13.getText().toString());
132 energie = Float.parseFloat(Feld14.getText().toString());
133
134 if (Feld10.getText().toString().length() == 0){
135 div=div-1;
136
137 }
138 if (Feld11.getText().toString().length() == 0){
139 div=div-1;
140
141 }
142 if (Feld12.getText().toString().length() == 0){
143 div=div-1;
144
145 }
146 if (Feld13.getText().toString().length() == 0){
147 div=div-1;
148
149 }
150 if (Feld14.getText().toString().length() == 0){
151 div=div-1;
152
153 }
154 EditText FeldErgebnis = (EditText)findViewById(R.id.etErgebnis);
155
156
157
158 ergebnis = (((et1*2) + (mathe1*2) + kon + et2 + mathe2 + digi + prog + wet + (physik*2) + tele + disi + eg3 + mess + energie)/div);
159
160 FeldErgebnis.setText(String.valueOf(ergebnis));
161
162
163 }
164 @Override
165 public boolean onCreateOptionsMenu(Menu menu) {
166 getMenuInflater().inflate(R.menu.activity_main, menu);
167 return true;
168 }
169}

— geändert am 24.09.2012, 20:48:11

Antworten
Florian B.
  • Forum-Beiträge: 284

24.09.2012, 20:39:23 via Website

Also die If-Abfrage stimmt nicht wirklich.

1if (Feld6.getText().toString() == "0")

Den Wert holst du richtig aus dem Textfeld, aber du verlgeichst ihn mit einem String in dem eine 0 steht. Wenn das Textfeld aber leer ist, dann kann da ja auch keine 0 drin stehen. Du hast jetzt zwei Möglichkeiten das abzufragen.

1. Du vergleichst den Inhalt nicht mit "0" sondern mit einem leeren String "".
1if (Feld6.getText().toString() == "")

2. Oder du holst die die Länge des Textfeldes und vergleichst den mit 0.

1if (Feld6.getText().toString().length() == 0)

— geändert am 24.09.2012, 20:39:38

Antworten
hopsi
  • Forum-Beiträge: 5

24.09.2012, 20:50:33 via Website

Florian B.
Also die If-Abfrage stimmt nicht wirklich.

1if (Feld6.getText().toString() == "0")

Den Wert holst du richtig aus dem Textfeld, aber du verlgeichst ihn mit einem String in dem eine 0 steht. Wenn das Textfeld aber leer ist, dann kann da ja auch keine 0 drin stehen. Du hast jetzt zwei Möglichkeiten das abzufragen.

1. Du vergleichst den Inhalt nicht mit "0" sondern mit einem leeren String "".
1if (Feld6.getText().toString() == "")

2. Oder du holst die die Länge des Textfeldes und vergleichst den mit 0.

1if (Feld6.getText().toString().length() == 0)
Hallo,
Vielen Dank schonmal für die Antwort. Ich habe leider vergessen dazuzuschreiben, dass ich die 3 Versionen schon ausprobiert habe...also am sinnvolsten erschien mir mit .length zu arbeiten, aber das hat auch nicht funktioniert...
Ich hab leider keine Idee, wo ich weiter arbeiten muss, um den Fehler zu beseitigen.

Antworten
Maximilian O
  • Forum-Beiträge: 990

24.09.2012, 21:34:25 via App

Hi,
2 Strings vergleicht man nie mit ==, bitte immer .equals("") nehmen.
Wenn das Feld leer ist, bekommst du auch einen leeren String (nicht null) zurück. Den kannst du mit text.equals("") auf Gültigkeit überprüfen.

Lg Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Florian B.
  • Forum-Beiträge: 284

24.09.2012, 21:39:58 via Website

Poste mal die Fehlermeldung die du bekommst. Dann kann man dir vielleicht besser helfen.

Antworten
Florian B.
  • Forum-Beiträge: 284

24.09.2012, 21:53:17 via Website

Maximilian O
Hi,
2 Strings vergleicht man nie mit ==, bitte immer .equals("") nehmen.
Wenn das Feld leer ist, bekommst du auch einen leeren String (nicht null) zurück. Den kannst du mit text.equals("") auf Gültigkeit überprüfen.

Lg Maximilian

Oh man, das hab ich total übersehen, da hat Maximilian natürlich Recht.

Antworten
hopsi
  • Forum-Beiträge: 5

24.09.2012, 21:54:14 via Website

Wenn ich den Emulator gestartet habe und die App ausführe kommt nach dem Klick auf den 2. Button (leider auch mit .equals) :
"Unfortunately, DeinNote has stopped."
Wenn Werte eingegeben wurde, kann ich problemlos weitermachen.

so habe ich die equals eingefügt:
1if (Feld1.getText().toString().equals("")){
2 div=div-2;
3
4 }
5 if (Feld2.getText().toString().equals("")){
6 div=div-2;
7
8
9 }
10 if (Feld3.getText().toString().equals("")){
11 div=div-1;

— geändert am 24.09.2012, 21:58:04

Antworten
Ultimate Software
  • Forum-Beiträge: 110

24.09.2012, 23:26:23 via Website

Der Auszug aus dem Logcat würde ungemein helfen.

<td class="alt1"> <!-- google_ad_section_start -->Mehrere WLANs?? Versuch doch mal den <a href="http://goo.gl/7ojEp&quot; target="_blank">SSID Selector</a>: <img src="images/smilies/extra/thumbsup.gif" border="0" alt="" title="Thumbsup" class="inlineimg" /><!-- google_ad_section_end --> </td>

Antworten
hopsi
  • Forum-Beiträge: 5

24.09.2012, 23:59:51 via Website

Danke schonmal für die zahlreichen Anworten und Hilfen!!

Hier der Logcat:
109-24 21:56:22.608: I/ActivityManager(145): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=durchschnittsnote.elektrotechnik/.MainActivity u=0} from pid 411
209-24 21:56:22.676: W/WindowManager(145): Failure taking screenshot for (164x246) to layer 21005
309-24 21:56:22.746: I/Choreographer(411): Skipped 104 frames! The application may be doing too much work on its main thread.
409-24 21:56:23.018: D/dalvikvm(971): Not late-enabling CheckJNI (already on)
509-24 21:56:23.056: I/ActivityManager(145): Start proc durchschnittsnote.elektrotechnik for activity durchschnittsnote.elektrotechnik/.MainActivity: pid=971 uid=10037 gids={1028}
609-24 21:56:23.506: I/Choreographer(145): Skipped 98 frames! The application may be doing too much work on its main thread.
709-24 21:56:23.606: I/ActivityManager(145): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=durchschnittsnote.elektrotechnik/.MainActivity u=0} from pid 411
809-24 21:56:24.376: I/Choreographer(145): Skipped 44 frames! The application may be doing too much work on its main thread.
909-24 21:56:24.436: E/Trace(971): error opening trace file: No such file or directory (2)
1009-24 21:56:24.846: I/Choreographer(145): Skipped 149 frames! The application may be doing too much work on its main thread.
1109-24 21:56:25.066: D/dalvikvm(145): GC_CONCURRENT freed 279K, 52% free 8216K/16967K, paused 224ms+230ms, total 2208ms
1209-24 21:56:26.066: I/Choreographer(971): Skipped 95 frames! The application may be doing too much work on its main thread.
1309-24 21:56:26.136: D/gralloc_goldfish(971): Emulator without GPU emulation detected.
1409-24 21:56:26.437: I/ActivityManager(145): Displayed durchschnittsnote.elektrotechnik/.MainActivity: +3s584ms
1509-24 21:56:26.516: I/Choreographer(145): Skipped 30 frames! The application may be doing too much work on its main thread.
1609-24 21:56:26.856: I/Choreographer(145): Skipped 47 frames! The application may be doing too much work on its main thread.
1709-24 21:56:26.866: I/Choreographer(411): Skipped 410 frames! The application may be doing too much work on its main thread.
1809-24 21:56:30.736: I/Choreographer(971): Skipped 117 frames! The application may be doing too much work on its main thread.
1909-24 21:56:31.246: I/Choreographer(971): Skipped 44 frames! The application may be doing too much work on its main thread.
2009-24 21:56:31.772: I/Choreographer(971): Skipped 44 frames! The application may be doing too much work on its main thread.
2109-24 21:56:32.886: D/AndroidRuntime(971): Shutting down VM
2209-24 21:56:32.886: W/dalvikvm(971): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
2309-24 21:56:32.966: E/AndroidRuntime(971): FATAL EXCEPTION: main
2409-24 21:56:32.966: E/AndroidRuntime(971): java.lang.IllegalStateException: Could not execute method of the activity
2509-24 21:56:32.966: E/AndroidRuntime(971): at android.view.View$1.onClick(View.java:3591)
2609-24 21:56:32.966: E/AndroidRuntime(971): at android.view.View.performClick(View.java:4084)
2709-24 21:56:32.966: E/AndroidRuntime(971): at android.view.View$PerformClick.run(View.java:16966)
2809-24 21:56:32.966: E/AndroidRuntime(971): at android.os.Handler.handleCallback(Handler.java:615)
2909-24 21:56:32.966: E/AndroidRuntime(971): at android.os.Handler.dispatchMessage(Handler.java:92)
3009-24 21:56:32.966: E/AndroidRuntime(971): at android.os.Looper.loop(Looper.java:137)
3109-24 21:56:32.966: E/AndroidRuntime(971): at android.app.ActivityThread.main(ActivityThread.java:4745)
3209-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.reflect.Method.invokeNative(Native Method)
3309-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.reflect.Method.invoke(Method.java:511)
3409-24 21:56:32.966: E/AndroidRuntime(971): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
3509-24 21:56:32.966: E/AndroidRuntime(971): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
3609-24 21:56:32.966: E/AndroidRuntime(971): at dalvik.system.NativeStart.main(Native Method)
3709-24 21:56:32.966: E/AndroidRuntime(971): Caused by: java.lang.reflect.InvocationTargetException
3809-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.reflect.Method.invokeNative(Native Method)
3909-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.reflect.Method.invoke(Method.java:511)
4009-24 21:56:32.966: E/AndroidRuntime(971): at android.view.View$1.onClick(View.java:3586)
4109-24 21:56:32.966: E/AndroidRuntime(971): ... 11 more
4209-24 21:56:32.966: E/AndroidRuntime(971): Caused by: java.lang.NumberFormatException: Invalid float: ""
4309-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.StringToReal.invalidReal(StringToReal.java:63)
4409-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.StringToReal.parseFloat(StringToReal.java:289)
4509-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.Float.parseFloat(Float.java:300)
4609-24 21:56:32.966: E/AndroidRuntime(971): at durchschnittsnote.elektrotechnik.MainActivity.semester2klick(MainActivity.java:54)
4709-24 21:56:32.966: E/AndroidRuntime(971): ... 14 more
4809-24 21:56:33.076: W/ActivityManager(145): Force finishing activity durchschnittsnote.elektrotechnik/.MainActivity
4909-24 21:56:33.116: W/WindowManager(145): Failure taking screenshot for (164x246) to layer 21010
5009-24 21:56:33.636: I/Choreographer(145): Skipped 169 frames! The application may be doing too much work on its main thread.
5109-24 21:56:33.646: W/ActivityManager(145): Activity pause timeout for ActivityRecord{41819498 durchschnittsnote.elektrotechnik/.MainActivity}
5209-24 21:56:34.046: I/Choreographer(411): Skipped 144 frames! The application may be doing too much work on its main thread.
5309-24 21:56:34.497: I/Choreographer(145): Skipped 161 frames! The application may be doing too much work on its main thread.
5409-24 21:56:34.576: I/Choreographer(145): Skipped 51 frames! The application may be doing too much work on its main thread.
5509-24 21:56:34.716: I/Choreographer(145): Skipped 57 frames! The application may be doing too much work on its main thread.
5609-24 21:56:34.856: I/Choreographer(145): Skipped 53 frames! The application may be doing too much work on its main thread.
5709-24 21:56:35.037: I/Choreographer(145): Skipped 31 frames! The application may be doing too much work on its main thread.
5809-24 21:56:35.406: I/Choreographer(145): Skipped 58 frames! The application may be doing too much work on its main thread.
5909-24 21:56:35.936: I/Process(971): Sending signal. PID: 971 SIG: 9
6009-24 21:56:35.957: I/Choreographer(145): Skipped 62 frames! The application may be doing too much work on its main thread.
6109-24 21:56:35.996: I/Choreographer(145): Skipped 61 frames! The application may be doing too much work on its main thread.
6209-24 21:56:36.136: I/ActivityManager(145): Process durchschnittsnote.elektrotechnik (pid 971) has died.
6309-24 21:56:36.146: W/InputDispatcher(145): channel '417dd6b8 durchschnittsnote.elektrotechnik/durchschnittsnote.elektrotechnik.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
6409-24 21:56:36.146: E/InputDispatcher(145): channel '417dd6b8 durchschnittsnote.elektrotechnik/durchschnittsnote.elektrotechnik.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
6509-24 21:56:36.176: I/WindowState(145): WIN DEATH: Window{417dd6b8 durchschnittsnote.elektrotechnik/durchschnittsnote.elektrotechnik.MainActivity paused=false}
6609-24 21:56:36.176: W/InputDispatcher(145): Attempted to unregister already unregistered input channel '417dd6b8 durchschnittsnote.elektrotechnik/durchschnittsnote.elektrotechnik.MainActivity (server)'
6709-24 21:56:36.206: I/Choreographer(145): Skipped 72 frames! The application may be doing too much work on its main thread.
6809-24 21:56:36.266: I/WindowManager(145): WINDOW DIED Window{417dd6b8 durchschnittsnote.elektrotechnik/durchschnittsnote.elektrotechnik.MainActivity paused=false}
6909-24 21:56:36.836: W/InputMethodManagerService(145): Got RemoteException sending setActive(false) notification to pid 971 uid 10037
7009-24 21:56:36.917: I/Choreographer(145): Skipped 87 frames! The application may be doing too much work on its main thread.
7109-24 21:56:45.931: W/ActivityManager(145): Activity destroy timeout for ActivityRecord{41819498 durchschnittsnote.elektrotechnik/.MainActivity}

Grüße,
hopsi

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

25.09.2012, 00:15:32 via Website

Der Fehler wird sein, das parseFloat() eine Exception schmeisst, wenn man einen leeren String als Eingabe liefert.

@TE: wenn deine Apps abschmieren, immer zuerst ins Logcat schauen, da gibts üblicherweise eine hilfreiche Fehlermeldung und die Zeile geliefert, in der das Problem aufgetreten ist.

Edit: da steht es doch:
---
Caused by: java.lang.NumberFormatException: Invalid float: ""
4309-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.StringToReal.invalidReal(StringToReal.java:63)
4409-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.StringToReal.parseFloat(StringToReal.java:289)
4509-24 21:56:32.966: E/AndroidRuntime(971): at java.lang.Float.parseFloat(Float.java:300)
4609-24 21:56:32.966: E/AndroidRuntime(971): at durchschnittsnote.elektrotechnik.MainActivity.semester2klick(MainActivity.java:54)
---

— geändert am 25.09.2012, 00:38:33

Antworten
hopsi
  • Forum-Beiträge: 5

25.09.2012, 22:20:31 via Website

Ah super!
Vielen Dank für eure Hilfe.

Ich habe es jetzt ganz einfach mit try und catch gelöst, ob das die eleganteste Lösung ist, wage ich allerdings zu bezweifeln :D.
Jedenfalls funktioniert gerade alles und ich bin glücklich.

Antworten