Android - Neue Activity

Aus Wikizone
Wechseln zu: Navigation, Suche

Neue Activity mit Datenrückgabe

Stichworte

Beispiel 1

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

	@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

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

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

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

// ...
        <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

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

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

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);
	}