Android Development, Java Einstieg

Ich möchte mir dieses Thema gerne näher bringen. Das Problem ist/war das ich kein Java kann. Hatte zwar viel Erfahrung mit C und Python, aber um da nicht total ins kalte Wasser zu fallen, habe ich mir teilweise dieses Turoial Galileo Computing :: Java ist auch eine Insel –
durchgelesen, da ich das bei C schon sehr gut fande.

Mein Problem ist nun das ich mit diesem Codebeispiel trotzdem noch nicht so zurecht komme:

Code:
package net.learn2develop.HelloMobiForge;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
public class HelloMobiForge extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        //---the button is wired to an event handler---
        Button btn1 = (Button)findViewById(R.id.btnClickMe);
        btn1.setOnClickListener(btnListener);
    }
 
    //---create an anonymous class to act as a button click listener---
    private OnClickListener btnListener = new OnClickListener()
    {
        public void onClick(View v)
        {                        
            Toast.makeText(getBaseContext(), 
                    "Hello, readers of MobiForge!", 
                    Toast.LENGTH_LONG).show();
        }
    };    
}

Alles muss ich auch nicht wissen. Aber was ich nicht verstehe und gerne verstehen würde sind folgende Punkte:

Code:
(Button)findViewById(R.id.btnClickMe);

Was bedeutet es wenn Button in Klammer davor steht?
Was ist "R"? Es handelt sich wohl dabei um ein Objekt, welches die id's beinhaltet, aber warum heißt es "R"?



Code:
//---create an anonymous class to act as a button click listener---
    private OnClickListener btnListener = new OnClickListener()
    {

Was entsteht hier? Eine Klasse? Warum steht dann nicht "private class" oder nur "class" davor? Was passiert hier?
 
zu 1

Button ist eine Klasse ... da die besagte funktion nicht immer ein objekt der klasse Button zurück liefert, muss man dem compiler sagen: das was da raus kommt bitte als Button behandeln ... nennt man "casten" ....

zu 2

R ist eine klasse im namespace android

zu 3

OnClickListener ist ein Interface ... um es "mal eben" zu implementieren braucht man keine normale klasse ... eine anonyme klasse reicht ... (man will nur eine methode angeben die das besagte ereignis behandeln soll ... diese anonyme klasse hat keine weitere aufgabe)
 
Zuletzt bearbeitet:
Zu 1

Aber wenn ich genau weiß dass unter dieser ID ein Button liegt, könnte ich theoretisch das "(Button)" auch weg lassen, oder? Wenn ja, warum macht man das nicht?

edit: hm, ne kann ich irgendwie nicht. Aber warum?^^

Zu 3

Ich glaube ich verstehe das. Das heißt "btnListener" ist dann eine Reference die eine "OnClickListener" Methode beinhaltet?


Bei "btn1.setOnClickListener" ist doch "setOnClickListener" eine Methode in der Klasse "Button" oder? Wenn ja, müsste ich dann nicht in dieser Reference Button | Android Developers
diese Methode und auch andere finden?
 
Zuletzt bearbeitet:
In diesem Beispiel:

Code:
package test.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class HelloActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //Widgets
        Button ok_button = (Button)findViewById(R.id.my_button);
        EditText text1 = (EditText)findViewById(R.id.test1);
        EditText text2 = (EditText)findViewById(R.id.test2);
        
        ok_button.setOnClickListener(klick_listener);
        
    }
    
    private OnClickListener klick_listener = new OnClickListener() {
		
		public void onClick(View v) {
			//text1 Variable???
			
		}
	};
    
}

Komme ich hier überhaupt so einfach an die text1 Variable?
Oder muss ich diese mit
Code:
EditText text1 = (EditText)findViewById(R.id.test1);
Noch mal neu auslesen?
 
zu 1
Gerade weil du weißt daß es ein Button ist machst du das casting. Du willst ja im Anschluß auch die Methoden der Klasse Button benutzen. Mit der Methode findViewById könnte man genauso eine CheckBox finden.

zu 3
Nein, btnListener ist ein Objekt von
OnClickListener welches die Methode onClick implementiert hat.

Jein, die Klasse Button erweitert wiederum andere Klassen welche eine davon die Methode setOnClickListener implementiert hat.
 
Komme ich hier überhaupt so einfach an die text1 Variable?
Oder muss ich diese mit
Code:
EditText text1 = (EditText)findViewById(R.id.test1);
Noch mal neu auslesen?

Natürlich musst das EditText-Objekt nochmal neu holen. Die Variable text1 ist in der Methode der anonymen Klasse nicht sichtbar. Das sind aber schon Java-Basics.
 
Zu 1

Aber wenn ich genau weiß dass unter dieser ID ein Button liegt, könnte ich theoretisch das "(Button)" auch weg lassen, oder? Wenn ja, warum macht man das nicht?

edit: hm, ne kann ich irgendwie nicht. Aber warum?^^
Du weißt dass es ein Button ist, aber Java kann das nicht wissen. findViewById liefert ja wieder Name schon sagt ein View Objekt zurück. Das hat den Sinn dass du diese Methode auf alle Untertypen von View anwenden kannst und nicht nur speziell für Buttons. Hast du das View Objekt bekommen musst du es zu Button casten, damit du auch die Button Methoden verwenden kannst. Wenn du das nicht machst stehen dir nur die View Methoden zur Verfügung.

Komme ich hier überhaupt so einfach an die text1 Variable?
Oder muss ich diese mit

EditText text1 = (EditText)findViewById(R.id.test1);
Noch mal neu auslesen?
test1 kann die Activity gar nicht kennen. Woher denn auch? Du verwendest es im XML File, wenn die Activity darauf zugreifen soll musst du es erst mit findViewById "suchen".

Bei "btn1.setOnClickListener" ist doch "setOnClickListener" eine Methode in der Klasse "Button" oder? Wenn ja, müsste ich dann nicht in dieser Reference Button | Android Developers
diese Methode und auch andere finden?
Die Methode ist in View. Button erbt von View und deshalb hat auch Button diese Methode. Ausgeführt wird sie aber in View.
 
Zurück
Oben