Mittwoch, 2. Januar 2013

Kleinigkeiten: Zugriff auf „R“ für altmodische Klassen

Ich hoffe das neue Jahr hat gut begonnen!
Und damit es so bleibt, will ich aus einem kurzen Urlaub einmal einen ganz spannenden Beitrag an den Anfang des Jahres stellen: Der Zugriff auf Texte aus "R" für Java-Klassen, die nicht zu einer Activity gehören!

Gut, spannend ist das nicht, aber es kann doch ganz hilfreich sein.

Damit eine Activity und die ihr zugehörige Java-Klasse nicht so einsam sind empfiehlt es sich entweder weitere Acitivities in die App zu integrieren oder wenigstens andere, zusätzliche Java-Klassen zu verwenden, die unserer Activity zuarbeiten.

Wer Letzteres macht, merkt recht schnell, dass diese „normalen“ Java-Klassen gewisse Probleme haben auf die Ressourcen zuzugreifen. Während ein „R.string.ich_bin_dann_mal_ein_text“ in einer Activity das erwartete Ergebnis in der Form „Hallo Welt“ liefert, schafft es eine normale Klasse nicht einmal mit einer vernünftigen Fehlermeldung darauf hinzuweisen, dass etwas nicht stimmt. Anstelle des erwarteten Textes wird lediglich eine längere Zahl zurückgegeben.

Nun kann man versucht sein auf die zusätzliche Klasse zu verzichten und wieder alles in die Activity zu verlagern. Alternativ könnte man notwendigen Texte auch statisch in die Klasse integrieren. Beide Möglichkeiten sind aber trotz eines gewissen Erfolges unsauber: Man baut sich unnötig große Klassen auf oder muss statische Texte unnötig im Quellcode pflegen, von den Nachteilen statischer Texte in Android einmal ganz zu schweigen.

Was macht man also?


Unsere Activity muss der neuen Klasse lediglich den eigenen Context mitteilen und wir müssen der neuen Klasse noch das nötige Rüstzeug mitgeben und damit auch umgehen zu können.

public class meineActivity extends Activity implements ...{
 
  /*
  * Vorsicht: Hier kann der Context noch nicht uebergeben werden.
  * Er existiert zu diesem Zeitpunkt noch nicht. Die App stuerzt bei
  * der Ausfuehrung ab.
  */
  AltmodischeKlasse meinObjekt = new AltmodischeKlasse();
 
  @Override
  protected void onCreate( ...) {
  super.onCreate(...);

    //entweder den Context direkt in eine entsprechende Variable uebergeben...
    meinObjekt.derContext = getBaseContext();
                             
    //oder in eine Methode, die unseren Wert entgegen nimmt
    meinObjekt.uebergibContext(getBaseContext());

  }
}

In unserer altmodischen Klasse müssen jetzt wir nur noch einen Import der Android-Klasse „Context“ machen und brauchen nur noch eine passende Variable, die den noch zu übergebenden Context aufnehmen kann.

import android.content.Context;

public class AltmodischeKlasse {
               
  public Context meinContext;

  public uebergibContext(Context hierKommtDerContext) {
  meinContext = hierKommtDerContext;

Und schon können wir auf unsere Texte zugreifen und damit arbeiten:

einText = meinContext.getString(R.string.ich_bin_dann_mal_ein_text);

Zeit für einen Kaffee!

Keine Kommentare:

Kommentar veröffentlichen