Bei mehreren Activities nur eine zurück über Hardwaretaste Return

  • Antworten:8
Markus Graf
  • Forum-Beiträge: 12

09.02.2014, 14:20:02 via Website

Hi,
ich habe eine kleine App geschrieben mit mehreren Activities. Funktioniert alles soweit ganz gut. Nur habe ich ein Problem mit dem Hardware Return.
Ich habe einen Button in der MainActivity über welchen ich in Activity2 komme und von dort aus über einen weiteren Button zu Activity3. Funktioniert walles bestens.
Nur wenn ich in Activity3 bin und auf den Hardware Return vom Handy drücke bin ich wieder in der MainActivity und nicht in der Activity2 wie ich es eigentlich gerne hätte.

Mein Code zum zurückgehen schaut so aus:

1@Override
2 public void onClick(View v) {
3 finish();
4 }

Kann mir da jemand evtl weiterhelfen?

Antworten
Markus Graf
  • Forum-Beiträge: 12

09.02.2014, 15:00:13 via Website

Im ganzen Projekt?

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 15:06:46 via Website

Im gesamten Projekt musst du immer die nächste Activity nur mit startActivity(...) ohne finish() starten. Die entsprechenden onBackPressed() müssen entfernt werden, damit die vorherige Activity geöffnet wird.

LG

Liebe Grüße impjor.

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

Antworten
Markus Graf
  • Forum-Beiträge: 12

09.02.2014, 18:15:19 via Website

Wie meinst Du das?

Mein Code schaut momentan so aus:

1public class MainActivity extends Activity implements OnClickListener{
2
3 private ImageButton nextBtn1;
4 private ImageButton nextBtn2;
5 private ImageButton nextBtn3;
6
7 @Override
8 protected void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.activity_main);
11
12 nextBtn1 = (ImageButton) findViewById(R.id.buttontheorie);
13 nextBtn1.setOnClickListener(this);
14
15 nextBtn2 = (ImageButton) findViewById(R.id.buttonteacher);
16 nextBtn2.setOnClickListener(this);
17
18 nextBtn3 = (ImageButton) findViewById(R.id.buttonmap);
19 nextBtn3.setOnClickListener(this);
20 }
21
22
23 @Override
24 public void onClick(View v)
25 {
26
27 Intent intent = new Intent();
28
29 switch (v.getId())
30 {
31
32 case R.id.buttontheorie:
33 intent.setClass(MainActivity.this, theorie.class);
34 startActivity(intent);
35 break;
36
37 case R.id.buttonteacher:
38 intent.setClass(MainActivity.this, teacher.class);
39 startActivity(intent);
40 break;
41
42 case R.id.buttonmap:
43 intent.setClass(MainActivity.this, map.class);
44 startActivity(intent);
45 break;
46 }
47
48 }

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.02.2014, 18:33:47 via Website

Bisher noch gut. Den Fehler sollte da nicht Auftreten. Wie sieht dein Code für Activity2 aus?

LG Pascal //It's not a bug, it's a feature. :) ;)

impjor

Antworten
Markus Graf
  • Forum-Beiträge: 12

09.02.2014, 19:24:17 via Website

Hier mal die map.class

1public class map extends Activity implements OnClickListener {
2
3 private ImageButton buro;
4 private ImageButton rothenbach;
5 private ImageButton johannis;
6 private ImageButton sudstadt;
7 private ImageButton gartenstadt;
8
9
10 @Override
11 protected void onCreate(Bundle savedInstanceState) {
12 super.onCreate(savedInstanceState);
13 setContentView(R.layout.map);
14
15 final Activity teacherActivity = this;
16 teacherActivity.setTitle(R.string.titelmap);
17
18 buro = (ImageButton) findViewById(R.id.buttonbuero);
19 buro.setOnClickListener(this);
20
21 rothenbach= (ImageButton) findViewById(R.id.buttonroethenbach);
22 rothenbach.setOnClickListener(this);
23
24 johannis = (ImageButton) findViewById(R.id.buttonjohannis);
25 johannis.setOnClickListener(this);
26
27 sudstadt = (ImageButton) findViewById(R.id.buttonsudstadt);
28 sudstadt.setOnClickListener(this);
29
30 gartenstadt = (ImageButton) findViewById(R.id.buttongartenstadt);
31 gartenstadt.setOnClickListener(this);
32
33
34 }
35
36 @Override
37 public void onClick(View v)
38 {
39
40 Intent intent = new Intent();
41
42 switch (v.getId())
43 {
44
45 case R.id.buttonbuero:
46 intent.setClass(map.this, filialebuero.class);
47 startActivity(intent);
48 break;
49
50 case R.id.buttonroethenbach:
51 intent.setClass(map.this, filialeroethenbach.class);
52 startActivity(intent);
53 break;
54
55 case R.id.buttonjohannis:
56 intent.setClass(map.this, filialeschniegling.class);
57 startActivity(intent);
58 break;
59
60 case R.id.buttonsudstadt:
61 intent.setClass(map.this, filialesudstadt.class);
62 startActivity(intent);
63 break;
64
65 case R.id.buttongartenstadt:
66 intent.setClass(map.this, filialegartenstadt.class);
67 startActivity(intent);
68 break;
69
70
71 }
72
73 finish();
74 }
75
76}

welche dann auf z.B. die

1public class filialeschniegling extends map implements OnClickListener {
2
3 final Context context = this;
4 private Button phonebtn;
5
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.filialejohannis);
10
11 phonebtn = (Button) findViewById(R.id.callfilialeburo);
12
13 PhoneCallListener phoneCallListener = new PhoneCallListener();
14 TelephonyManager telManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
15 telManager.listen(phoneCallListener, PhoneStateListener.LISTEN_CALL_STATE);
16
17 phonebtn.setOnClickListener(new OnClickListener() {
18
19 @Override
20 public void onClick(View view) {
21
22 Intent phoneCallIntent = new Intent(Intent.ACTION_CALL);
23 phoneCallIntent.setData(Uri.parse("tel:123456789"));
24 startActivity(phoneCallIntent);
25
26 }
27 });
28
29
30 }
31
32 @Override
33 public void onClick(View v) {
34 finish();
35 }
36
37 private class PhoneCallListener extends PhoneStateListener {
38
39 String TAG = "LOGGING PHONE CALL";
40 private boolean phoneCalling = false;
41
42 @Override
43 public void onCallStateChanged(int state, String incomingNumber) {
44
45 if (TelephonyManager.CALL_STATE_RINGING == state) {
46
47 Log.i(TAG, "RINGING, number: " + incomingNumber);
48 }
49
50 if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
51
52 Log.i(TAG, "OFFHOOK");
53
54 phoneCalling = true;
55 }
56
57 if (TelephonyManager.CALL_STATE_IDLE == state) {
58 Log.i(TAG, "IDLE");
59 if (phoneCalling) {
60 Log.i(TAG, "restart app");
61
62 Intent i = getBaseContext().getPackageManager()
63 .getLaunchIntentForPackage(
64 getBaseContext().getPackageName());
65
66 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
67 startActivity(i);
68
69 phoneCalling = false;
70 }
71 }
72 }
73 }
74
75}

weiter geht.

Antworten
impjor
  • Forum-Beiträge: 1.793

09.02.2014, 19:41:38 via Website

Klassennamen bitte immer mit großem Anfangsbuchstaben schreiben.
Warum erbt FilaleSchniegling von Map? Eventuell ist es auch besser eine Activity FilialeAnzeigen zu haben und ihr bsp. eine Filial-ID mitzugeben. Die FilialeAnzeigenActivity ließt dann die Daten der Filiale z.B. aus einer DB oder Datei. So musst du für 10 Filialen nicht 10 Activities machen, die das selbe Layout etc. verwenden.
Wie gesagt musst du das finish() in der MapActivity entfernen. Android hat einen Activity-Stack: Darauf kann man Activities legen und entfernen.
Wenn deine MainActivity gestartet wird, wird sie auf den Stack gelegt. Dann wird MapActivity gestartet, der Stack hat nun beide Activities: MainActivity>Map. Nun wird FilialeSchieling gestartet und der Stack sieht so aus: MainActivity>Map>FilialeSchniegling. Wenn du jetzt in der MapActivity finish() aufrufts, wird sie vom Stack entfernt: MainActivity>FilialeSchniegling. Wenn man jetzt auf den Zurück-Harwarebutton klickt, wird von Android finish() aufgerufen, sodass der Stack nun so aussieht: MainActivity. Dementsprechend wird MainActivity angezeigt.

LG

Liebe Grüße impjor.

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

Antworten
Markus Graf
  • Forum-Beiträge: 12

09.02.2014, 21:02:04 via Website

Ja ja, sauberer Programmierstiel :-) da war mal was.
Schon mal Dankeschön dafür.
Hab das jetzt schon ausgebessert.

Und ohne finish() funktioniert es auch!

Vielen vielen Dank und LG

Antworten