Intent in Viewer Klasse nutzen

  • Antworten:7
  • OffenNicht stickyNicht beantwortet

14.09.2010 14:03:55 via Website

Guten Tag,

ich hätte mal ein Problem = ) , ich hab eine Viewer Klasse in der ich AlertDialog habe, beim Klicken auf einem bestimmten Button des AlertDialoges
möchte ich eine neue Activity öffnen. Wenn ich ein Intent an die OnClick methode fügen möchte, wirft mir Eclipse Fehler vor.

Zuerst initialisiere ich ein Intent, das klappt noch ohne Probleme.

Wenn ich hab eine Klasse setzen möchte, bekomme ich folgenden Fehler "The Method set'Class(context, Class ) in the Type Intent is not applicable
for the arguments (MotionPathView, LevelAnzeige)"

Und bei start Activity(intent) "The Method ist undefined for the Type New DialogInterface"

Ich hoffe mal das ihr mir Helfen könnt, so wie es immer ist = )

Gruß
max

1builder.setMessage("Was möchte Sie mit Ihrer Gurke tun?").setPositiveButton("Save", new DialogInterface.OnClickListener() {
2 public void onClick(DialogInterface dialog, int which) {
3 savePoints(points);
4 }
5 }).setNegativeButton("New", new DialogInterface.OnClickListener() {
6 public void onClick(DialogInterface dialog, int which) {
7 points.clear();
8 lineCanvas.drawColor(Color.BLACK);
9 }
10 }).setNeutralButton("Finish", new DialogInterface.OnClickListener() {
11 public void onClick(DialogInterface dialog, int which) {
12
13 /*Intent levelintent = new Intent();
14 levelintent.setClass(MotionPathView.class, LevelAnzeige.class);
15 startActivity(levelintent);*/
16
17 Intent intent = new Intent();
18
19 intent.setClass(MotionPathTest.this, LevelAnzeige.class);
20 startActivity(intent);
21 }
22
23
24 });
25
26
27 AlertDialog alert = builder.create();
28 alert.show();

18.09.2010 12:43:43 via Website

max theis
Guten Tag,

ich hätte mal ein Problem = ) , ich hab eine Viewer Klasse in der ich AlertDialog habe, beim Klicken auf einem bestimmten Button des AlertDialoges
möchte ich eine neue Activity öffnen. Wenn ich ein Intent an die OnClick methode fügen möchte, wirft mir Eclipse Fehler vor.

Zuerst initialisiere ich ein Intent, das klappt noch ohne Probleme.

Wenn ich hab eine Klasse setzen möchte, bekomme ich folgenden Fehler "The Method set'Class(context, Class ) in the Type Intent is not applicable
for the arguments (MotionPathView, LevelAnzeige)"

Und bei start Activity(intent) "The Method ist undefined for the Type New DialogInterface"

Ich hoffe mal das ihr mir Helfen könnt, so wie es immer ist = )


java grundlagen.
"The Method ist undefined for the Type New DialogInterface"

wenn du einen listener erzeugst und dich in dem befindest, bist du eben nicht mehr im activity context.

swordiApps Blog - Website

18.09.2010 13:03:47 via Website

Diese Listener die auf irgendwas reagieren sind Interfaces, diese werden wenn du Sie Implementierst zu vollständigen Klassen, Sie haben nur eine Besonderheit da sie keinen Namen haben nennt man Sie Anonyme Klassen:

1builder.setMessage("Was möchte Sie mit Ihrer Gurke tun?").setPositiveButton("Save",
2new DialogInterface.OnClickListener() { // Hier erzeugst du die Anonyme Klasse, Sie hat keinen Namen!
3public void onClick(DialogInterface dialog, int which) {
4 savePoints(points);
5 // Du bist hier nicht mehr in der Klasse die die Anonyme erzeugt hat!
6 // Da alle Objekte in Java von Objekt erben ist die Methode nicht bekannt die du aufrufen willst!
7 }

Java kennt hier aber folgenden Konstrukt:

Activity.this.dieMethodeDerWahl();


Über eine "this referenz" wird hier auf die Instanz der äußeren Klasse verwiesen. Es ist recht einfach sich das zu merken indem du auf das "new" achtes.


hth,
Mac

Windmate HD, See you @ IO 14 , Wundercar, Glass V3, LG G Watch

Gelöschter Account

18.09.2010 13:20:49 via Website

Hi Leute,

Komisch, ich kann in meinen anonymen inneren Klassen immer auf so ziemlich alles zugreifen, was Bestandteil der Klasse ist, in der ich die innere deklariert habe - das ist doch gerade der Gag an einer inner class... Ich vermute den Kern des Pudels mal hier: Da hier von einer Viewer-Klasse gesprochen wird und auch die Namensgebung darauf hinweist, gehe ich (die Frage ist zwar noch unbeantwortet) davon aus, das wir uns hier in einer Klasse befinden, die von android.view.View erbt. Also nicht von android.app.Activity und somit auch nicht von android.content.Context.
Somit existieren zwei Probleme:

1.) Intent.setClass erwartet als Parameter einen Context und eine Class, wenn wir hier aber offensichtlich nicht von android.content.Context erben, dann wird das mit dem Aufruf wohl nichts. Lösung: der View den Context der Activity als Property mitgeben, in der er angezeigt wird, das wäre dann wohl die Activity selbst.
2.) startActivity ist natürlich eine Methode, die wir über die Vererbung von android.app.Activity erhalten würden, uns aber hier aus android.view.View bzw. MotionPathView nicht zur Vefügung steht. Auch hier könnte die Activity als Property wohl helfen.

Beide Lösungen sind aber wohl schlechter OOP-Stil, eigentlich hat die Steuerung des Anwendungsflusses ja wohl nichts in einer View verloren...

Beste Grüße,

Thomas

— geändert am 18.09.2010 13:21:47

18.09.2010 13:56:02 via Website

Beide Lösungen sind aber wohl schlechter OOP-Stil, eigentlich hat die Steuerung des Anwendungsflusses ja wohl nichts in einer View verloren...

Da hast du erst mal recht, es ist aber durchaus gängige Praxis das z.b in Swing oder AWT oder anderen UI Frameworks so zu lösen. Fängst du an alle Listener Auszulagern wird es sehr schnell recht unübersichtlich. Sicher sollte man sich überlegen nicht zu viel im View aufzurufen, wird es zu groß sollte halt refactored werden um das ganze auszulagern. Fakt ist auch das Android hier erstmal nichts bietet um den Code auszulagern, es bedarf also einiger Erfahrung das ganze "sauber" zu schreiben. Wobei man immer den Kosten/Nutzen Faktor beachten sollte. Ich halte es für legitim in einem View etwas zu implementieren wenn es nur dort Sinn macht. Brauche ich das ganze mehrfach wird es ausgelagert.


- mac

Windmate HD, See you @ IO 14 , Wundercar, Glass V3, LG G Watch

Gelöschter Account

18.09.2010 14:06:02 via Website

Hi,

ich wollte hier wohl auch nicht die Listener auslagern, das ist in der Tat nicht gut für die Übersichtlichkeit. Ganz im Gegenteil, ich finde Listener als anonyme Klassen in den GUI-Klassen toll.

Aber: Eine Methode eines Listeners sollte IMHO auch unter Android wenn möglich keine Logik enthalten, die den Fluss der Applikation steuert. Dazu lässt sich auch hier wunderbar eine Controller-Klasse deklarieren. Bei einer Activity würde ich es wohl noch zulassen (bin ja auch Swing-geschädigt), aber in einer View? Wer würde denn unter Swing/AWT in einer Bean Anwendungslogik unterbringen?

Gruß,

Thomas