Android-Programmierung mit Scala

Scala und Android

Als kleines Beispiel für diesen Artikel nehmen wir an, wir müssten einen Log-in Screen für eine Anwendung implementieren.

Abb. 2: Ein einfacher Log-in Screen

Der in Abbildung 2 gezeigte Log-in Screen besteht aus zwei Textfeldern vom Typ android.widget.EditText und einem Log-in-Button vom Typ android.widget.Button.

Listing 2
public class LoginActivity extends Activity {
 
private EditText usernameEditText;
private EditText passwordEditText;
private Button   loginButton;

public void onCreate(Bundle savedState)  {
  super.onCreate(savedState);
  setContentView(R.layout.login);
 
  usernameEditText = (EditText) findViewById(R.id.usernameEditText);
  passwordEditText = (EditText) findViewById(R.id.passwordEditText);
  loginButton = (Button) findViewById(R.id.loginButton);

  loginButton.setOnClickListener(new View.OnClickListener()  {

    public void onClick(View v)  {
     String username = usernameEditText.getEditableText().toString();
      String password = passwordEditText.getEditableText().toString();
       // Authentifizierung geschieht hier!

     if (authenticated)  {
       startActivity(new Intent(LoginActivity.this, HomeActivity.class));
      } else {
       finish();
      }
    }
  });
  }

Wie in Listing 2 zu sehen ist, benötigen wir nicht unbedingt wenig Java-Code, um Referenzen auf die drei beteiligten Widgets zu erhalten. Zusätzlich muss der View.OnClickListener mit einer anonymen Klasse implementiert und instanziiert werden. Dabei haben wir die eigentliche Authentifizierung noch nicht implementiert. Der gezeigte Code in Listing 2 dient nur dazu, Referenzen auf Widgets zu erhalten und den Button Listener zu definieren. Sehen wir uns nun die Implementierung der LoginActivity mit Scala an.

Mit der Generierung der Projektstruktur durch das Giter8 Template wurden bereits eine leere Scala-Standard-Activity sowie die Datei TR.scala erzeugt. Die in der TR.scala definierten Typen und Konstanten werden verwendet, um die im XML-Layout definierten UI Widgets typsicher ohne Cast referenzieren zu können. Im Unterscheid zu dem in der Klasse android.app.Activity verwendeten Mechanismus über die findViewById(int id)- Methode können unter Verwendung der Basisklasse TR.TypedActivity die Widgets ohne den obligatorischen Typcast referenziert werden.

Listing 3
class LoginActivity extends Activity with TypedActivity {

   override def onCreate(savedState: Bundle) {
      super.onCreate(savedState)
      setContentView(R.layout.login)
 
      val usernameEditText = findView(TR.usernameEditText)
      val passwordEditText = findView(TR.passwordEditText)
      val loginButton = findView(TR.loginButton)
 
      // ...
   }
}

In Listing 3 ist eine erste Implementierung der LoginActivity in Scala zu sehen. Für den in Java eingearbeiteten Leser sollten die Unterschiede in der Syntax sofort ersichtlich und leicht zu interpretieren sein. Die in der Activity aufgerufene findView-Methode wurde von der Klasse TypedActivity definiert. Wie zu sehen ist, wird in der Implementierung der Activity auf die Deklaration der statischen Typen verzichtet, da der Scala Compiler aufgrund der Typinformationen der TR-Klasse den Typ der Variablen usernameEditText, passwordEditText und loginButton über Typinferenz herleiten kann. Die Scala LoginActivity weicht jedoch, abgesehen von den Typcasts, bis jetzt kaum von der Java-Implementierung ab (was genau with TypedActivity bedeutet, wird im Abschnitt über Traits klar – es geht um Vererbung). Sehen wir uns weitere Scala-Mechanismen an, um den unsere Scala LoginActivity der Java-basierten Version anzugleichen.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.