Android - Neue Activity: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:
 
=== Beispiel 1===
 
=== Beispiel 1===
 
Neue Activity wird mit Klick gestartet, je nachdem welcher Knopf gedrückt wurde werden andere Daten übergeben
 
Neue Activity wird mit Klick gestartet, je nachdem welcher Knopf gedrückt wurde werden andere Daten übergeben
 +
 
'''MainActivity.java'''
 
'''MainActivity.java'''
 
<pre>
 
<pre>
Zeile 47: Zeile 48:
 
'''SecondActivity.java'''
 
'''SecondActivity.java'''
 
<pre>
 
<pre>
 +
...
 +
Button bReceiver;
 +
TextView tv;
 +
@Override
 +
protected void onCreate(Bundle savedInstanceState) {
 +
super.onCreate(savedInstanceState);
 +
setContentView(R.layout.activity_receive);
 +
bReceiver = (Button) findViewById(R.id.bReceiver);
 +
bReceiver.setOnClickListener(this);
 +
tv = (TextView) findViewById(R.id.tvReceiver);
 +
 +
Intent i = getIntent(); // get Intent which opened the Activity
 +
String msg = i.getStringExtra("intentData");
 +
tv.setText(msg);
 +
 +
}
 +
 
@Override
 
@Override
 
public void onClick(View v) {
 
public void onClick(View v) {
Zeile 145: Zeile 163:
 
// ...
 
// ...
 
</pre>
 
</pre>
 +
 +
Hinweis oft kann man sich den intent-filter sparen. Man braucht ihn wenn man von anderen apps auf die activity zugreifen will. Läßt man ihn weg kann man einfach die activity mit dem Klassennamen aufrufen:
 +
 +
// Aufruf über Klassenname
 +
startActivity(new Intent("Page2Activity.class"));
 +
// Aufruf über intent-filter name
 +
startActivity(new Intent("de.webmynet.buttonstartsactivity.PAGE2"));
  
 
=== Button in Hauptansicht erstellen ===
 
=== Button in Hauptansicht erstellen ===

Aktuelle Version vom 2. März 2013, 13:46 Uhr

Neue Activity mit Datenrückgabe[Bearbeiten]

Stichworte[Bearbeiten]

Beispiel 1[Bearbeiten]

Neue Activity wird mit Klick gestartet, je nachdem welcher Knopf gedrückt wurde werden andere Daten übergeben

MainActivity.java

...
	@Override
	public void onClick(View v) {
		// v holds the clicked view ie a button 
		
		// Get a Intent to connect the actual context (this) to Second Activity
		Intent i = new Intent(this,SecondActivity.class);
		
		// Switch to find out which Button has been clicked
		switch (v.getId()) {
		case R.id.button1:
			/* Use intent to transport data. 
			 In this case we use a data package named myData 
			 it holds only a string */
			i.putExtra("myData","hello from button1");
			/* special startActivity type because we're awaiting data back - 
			 this way we can give the new activity a back channel */ 
			startActivityForResult(i,1);
			break;
		case R.id.button2:
			i.putExtra("myData","hello from button2");
			startActivityForResult(i,1);
			break;
		default:
			break;
		}
	}

	// Cause we used startActivityForResult we get a onActivityResult Event if the NumbersActivity sends us data back
	// Here we can catch it and send it i.e. to a textField 
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
                // now we can use the returned data
		if(data.getExtras().containsKey("backInfo")){
			myTextField.setText(data.getStringExtra("backInfo"));
		}
	}

SecondActivity.java

...
	Button bReceiver;
	TextView tv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_receive);
		bReceiver = (Button) findViewById(R.id.bReceiver);
		bReceiver.setOnClickListener(this);
		tv = (TextView) findViewById(R.id.tvReceiver);
		
		Intent i = getIntent(); // get Intent which opened the Activity
		String msg = i.getStringExtra("intentData");
		tv.setText(msg);
		
	}

	@Override
	public void onClick(View v) {
                // get Text i.e. from a input field
		String s = input.getText().toString();
                String s2 = "Gruss zurück";
		// Grab the intent which has called the activity 
		Intent i = getIntent();
		// Get the Extra Data from the intent which we stored in myData (Imagine a basket labelled myData)
		String msg = i.getStringExtra("myData");
		if(msg.contentEquals("hello from button1")){
			// OK got it - should send back width information - so put it in a package
			i.putExtra("backInfo",s);
			// and send it back
			setResult(RESULT_OK, i);
			// and finish this activity
			finish();
		}
		if(msg.contentEquals("hello from button 2")){
			i.putExtra("backInfo",s2);
			setResult(RESULT_OK, i);
			finish();
		}
	}

Neue Activity starten[Bearbeiten]

Z.B. über Button Klick

Du brauchst:

  • Neue Activity
    • Evtl. neues Layout anlegen
    • Neue Java Klasse für Activity anlegen
    • Neue Activity im Manifest eintragen
  • Button in der Haupt Activity
  • onClick Event Handler
  • Intent als Verbindung
  • Ressourcen wie Strings etc.

Neues Layout für die Activity[Bearbeiten]

Layout Ordner > Rechtsklick > New > Android Layout File > Name in Lowercase(z.b. page_2)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/page2_title"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

Neue Activity Klasse erzeugen[Bearbeiten]

Package > Rechtsklick > New > Class > Name mit FirstLetterUppercase (z.B. Page2Activity)

  • extends Activity
  • Activity importieren
  • mind. onCreate(bundle) -> am Besten über Rechtsklick > Source > Override
  • setcontentView(R.layout.id)

page2Activity.class

package com.example.buttonstartsactivity;

import android.app.Activity;
import android.os.Bundle;

public class Page2Activity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.page2);
	}
}

Manifest Eintrag[Bearbeiten]

// ...
        <activity
            android:name="com.example.buttonstartsactivity.Page2Activity"
            android:label="@string/app_name" 
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.PAGE2" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
// ...

Hinweis oft kann man sich den intent-filter sparen. Man braucht ihn wenn man von anderen apps auf die activity zugreifen will. Läßt man ihn weg kann man einfach die activity mit dem Klassennamen aufrufen:

// Aufruf über Klassenname
startActivity(new Intent("Page2Activity.class"));
// Aufruf über intent-filter name
startActivity(new Intent("de.webmynet.buttonstartsactivity.PAGE2"));

Button in Hauptansicht erstellen[Bearbeiten]

z.B.

main_activtiy.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="@string/button" />

</RelativeLayout>

Button verbinden[Bearbeiten]

MainActivity.java

package de.webmynet.buttonstartsactivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button button1 = (Button) findViewById(R.id.button1);
		button1.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				//btw v is the view where the button is pressed - you can use it to retrieve data
				startActivity(new Intent("de.webmynet.buttonstartsactivity.PAGE2"));
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

Variante onClick Event im Layout File[Bearbeiten]

Anstatt der onClick Funktion kann man auch eine Funktion im Layout definieren. Dann kann man in der .java Datei einfach die Funktion implementieren. activity_main.xml


...
<Button 
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="@string/button"
	    android:onClick="buttonPressed" />
...

MainActivity.java

	/** Called when the user clicks the send button **/
	public void buttonPressed(View view) {
		Intent intent = new Intent(this, Page2Activity.class);
		EditText editText = (EditText) findViewById(R.id.button);
		startActivity(intent);
	}