# Kann nicht in TextView einer anderen Klasse schreiben - wieso?



## aquarium1974 (5. Mai 2012)

Hallo zusammen,

wieder mal viel gelesen und gegooglt, aber ich finde keine Lösung:

Aber ich denke ganz einfach...

Klasse Test1Activity:
Von hier will ich auf ein Objekt der Klasse Mail zugreifen (Mailversand vorbereiten etc.)
Anschließend will ich das Ergebnis dann in den Textviews darstellen, die in dem View zu Test1Activity existieren....

```
class Test1Activity() {
public mail() {
               Mail mail = new Mail();
}

public void machNochWas() {
                String strMail = mail.vorbereitenEMail(a, b, c);
		sendenEMail(strMail);
                Textview textviewOrdnungsamt
                textviewOrdnungsamt = (TextView) findViewById(R.id.textviewOrdnungsamt);

...
                if (strPLZ != strPLZOld) {
				mail.setzeEmailadresseOrdnungsamt(strPLZ, strOrt, strStrasse);}
...
}
```


Klasse Mail

```
public class Mail{

public void mail(Context context) {
                //ab hier beginnt mein rumprobiere...
		int resID = getResources().getIdentifier("textviewOrdnungsamt", 
						"id", getPackageName());
		int id = this.getResources().getIdentifier(NameDerVariablen, "Drawable", NameDeinesPackages);
		img.setImageResource(id);
                //bis hier ist alles Testerei ohne Erfolg... :-(
	}


String vorbereitenEMail(String a, String b, String c) {...}

//weitere Methoden...
//und hier die Methode mit der ich versuche den textview aus Test1Activity zu füllen/beschreiben...
public void setzeEmailadresseOrdnungsamt(String d, String e) {
      textviewOrdnungsamt = (TextView) findViewById(R.id.textviewOrdnungsamt);
}
```

Problem ist jetzt, daß ich die Textviews in der Klasse Mail nicht direkt ansprechen kann. Ich will also das irgendwie klassenübergreifend machen. Also was in einem Objekt von Mail vorbereiten und dann im Textview von Test1Activity darstellen.

Das ist doch gängige Praxis denke ich? Kann doch so schwer nicht sein?!?!
Eine andere Methode macht nix mit Darstellung, da klappt die Kommuniktion zwischen den beiden Klassen prima...


Wie mache ich das?
getResources() ??
Intents und alle Klassen zu Activities machen?

Klitzekleines Codebeispiel wäre nett, dann hat das rätseln ein Ende...


btw: Muss in einer Adroid App immer jede Klasse eine Activity sein, oder kann es auch Klassen geben, die keine Activity sind? Sprich so wie ich das gemacht hab (Klasse Mail --> erbt nicht von Activity!)


----------



## schlingel (5. Mai 2012)

Es ist wie in jedem anderen UI-Framework auch. Wenn du UI-Klassen erstellen willst, musst du von den im Framework enthaltenen Klassen erben (View, Activity, Window, etc.)

Wenn du das nicht willst, dann eben nicht. Also ja, es kann auch normale Klassen geben.

Punkto Mail-Klasse:
Wenn die Klasse dazu dient die UI richtig zu setzen, wie z.B. ein ViewModel in einem MVVM-Framework, dann benenne die Klasse richtig um und gib ihr auch die entsprechenden View-Objekte anstatt dir dort noch einmal neu einzulesen. Dann ist klarer was Mail tun soll und du hast auch dein genanntes Problem nicht.


----------



## aquarium1974 (5. Mai 2012)

schlingel hat gesagt.:


> ... dann benenne die Klasse richtig um und gib ihr auch die entsprechenden View-Objekte


Was ist denn richtig? Wie soll sie denn dann heißen?



> ... anstatt dir dort noch einmal neu einzulesen. Dann ist klarer was Mail tun soll und du hast auch dein genanntes Problem nicht.


 
Wieso? ich stehe jetzt auf dem Schlauch. Kannst du das näher erläutern? 


Vielen Dank.

Aquiarum1974


----------



## schlingel (5. Mai 2012)

> Was ist denn richtig? Wie soll sie denn dann heißen?


Ha, gute Frage ... Aber auf jeden Fall nicht Mail, da erwarte ich mir, dass ich damit Mails versenden kann und nicht nur irgendwelche Views setzen kann.


```
public class MailViewModel {
  private TextView lblSender;

  private TextView lblEmailOrdnungsAmt;

  // und so weiter

  public MailViewHelper(Context context, TextView lblSender /* und deine anderen Views */) {
    // hier setzt du sie auf die Instanzvariablen
  }

  public void setEmailOrdnungsamt(String email) {
    /* Code um Daten in einer Model-Klasse zu ändern wenn du so was möchtest */
    lblEmailOrdnungsAmt.setText(email);
  }

}
```


----------



## aquarium1974 (5. Mai 2012)

schlingel hat gesagt.:


> Ha, gute Frage ... Aber auf jeden Fall nicht Mail, da erwarte ich mir, dass ich damit Mails versenden kann und nicht nur irgendwelche Views setzen kann.



... na ja, ...
ich will ja nicht nur Views belegen, sondern es gibt 3 Methoden die auch was machen, sowas wie
eine Liste durchsuchen und mit nem Vergleichswert abgleichen usw....


----------



## aquarium1974 (5. Mai 2012)

```
public class MailViewModel {
  private TextView lblSender;

  private TextView lblEmailOrdnungsAmt;

  // und so weiter

  public MailViewHelper // <--- schreibt man Methodennamen nicht immer klein? Warum groß?
           //oder soll das eine Methode mit Rückgabwert sein?!?!?

(Context context, TextView lblSender /* und deine anderen Views */) {
    // hier setzt du sie auf die Instanzvariablen
  }

  public void setEmailOrdnungsamt(String email) {
    /* Code um Daten in einer Model-Klasse zu ändern wenn du so was möchtest */
    lblEmailOrdnungsAmt.setText(email);
  }

}
```


----------



## Marcinek (5. Mai 2012)

Das ist ein Konstruktor??


----------



## aquarium1974 (5. Mai 2012)

Marcinek hat gesagt.:


> Das ist ein Konstruktor??



Ich dachte der Konstruktor würde immer so heißen wie die Klasse selbst?
Und das man Konstruktoren mit unterschiedlichen Parametern erstellen kann das kenn ich auch.

Aber die können auch anders heißen als die Klasse selbst?


```
public class Test123 {
	public void Test123() {
	}

	public void Test123(String a) {
	}

	public void DasIstMirNeuKonstruktor() {
		// das hier geht auch als Konstruktor, ja?
	}
	
}
```

Java ist auch eine Insel, S. 343:
Konstruktoren tragen immer den selben Namen wie die Klasse.


----------



## Marcinek (5. Mai 2012)

Eventuell ein Tippfehler von schlingel.


----------



## schlingel (6. Mai 2012)

Jepp, Tippfehler. Den meisten Beispiel-Code den ich hier runter tippe teste ich vorher nicht. Soll ja auch mehr eine Idee als ein funktionierendes Stück Code vermitteln.

Prinzipiell halte ich es für klug wenn man UI und sonstige Logik so weit trennt wie möglich. Wenn deine Klasse irgendetwas macht, dann lass sie das abgekapselt machen und verwende die Ergebnisse außerhalb weiter um die UI zu setzen.


----------

