Die Übergabe von Daten zwischen Activities
oder Fragmenten
ist eines der grundlegenden Konzepte, die man lernen muss, wenn man mit der Android-Entwicklung beginnt. Obwohl Activities
und Fragments
nichts anderes als Klassen sind, werden sie in Android als spezielle Klassen betrachtet, da sie grundlegend dafür sind, wie die Benutzeroberfläche von Android funktioniert. Daher übergeben wir ihnen Daten nicht einfach über Konstruktoren, sondern auf eine der folgenden drei Arten:
- Intent
Bundle
- ViewModel
In dieser Lektion werden wir uns alle diese Elemente anhand praktischer Beispiele ansehen. Lassen Sie uns beginnen.
Beispiel 1: Android Datenübergabe - Fragment
an Activity
über Intent
Wir haben uns angesehen, wie man Daten von Activity
an Fragment
übergibt und wie man sowohl eine Liste/Objekt von Activity
an Activity
als auch einfache primitive Datentypen übergibt.
Heute schauen wir uns an, wie man einfache Datentypen vom Fragment
an Activity
weitergibt. Wir übergeben Daten über das Intent
Objekt.
Was ist ein Fragment
?
Ein Fragment
ist eine Unteraktivität mit eigenem Lebenszyklus. Fragmente werden von Activities
beherbergt. Eine Activity
kann mehrere Fragmente
beherbergen.
Warum Daten von Fragment
an Activity
weitergeben?
Nr. | Grund |
---|---|
1. Fragmente sind Unteraktivitäten und ermöglichen es uns, verschiedene Bildschirme zu haben, ohne notwendigerweise viele "Aktivitäten" erstellen zu müssen. Daher muessen wir wissen, wie wir Daten von einem "Fragment" an eine "Aktivitaet" uebergeben. | |
(2) Fragmente wie Activities sind spezielle UI-Klassen, die ein Fenster repräsentieren und daher können wir Daten nicht direkt übergeben, wie wir es mit normalen Klassen tun. |
Einführung
- Wir haben zwei Klassen: eine unsere
MainActivity
und eine andere eineMyFragment
Klasse. - Wenn wir die FAB (Floating Action Button) Taste drücken, öffnen wir das MyFragment über die
Fragment
Transaktion und fügen es an ein FrameLayout an, das wir definieren werden. - Das "Fragment" enthält einen Editiertext und einen Spinner.
- Der Benutzer gibt den Namen des Raumfahrzeugs ein und wählt das Startjahr in der Drehscheibe aus.
- Wir übergeben dann diese beiden Daten an MainActivity.
- Anschließend werden die empfangenen Daten in Textviews angezeigt.
- Wir haben Android Studio als unsere IDE verwendet.
- Der Code ist zum besseren Verständnis gut kommentiert.
Allgemeine Fragen, die wir beantworten
Mit diesem einfachen Beispiel erforschen wir die folgenden Fragen:
- Wie übergibt man Daten von
Fragment
an eineAktivität
. - Wie übergebe ich Daten zwischen
Fragment
undActivity
mit Hilfe von Intents. - Wie führe ich FragmentTransaction durch.
- Überschreiben von onResume() und Empfangen von Daten in android.
- Wie kann ich sowohl mit
Fragment
als auch mitAktivität
.
Verwendete Tools
- IDE: Android Studio
- OS : Windows 8.1
- PLATTFORM: Android
- SPRACHE: Java
- THEMA :
Intent
,Datenübergabe,Fragment
Los geht's.
Werfen wir einen Blick auf den Quellcode.
1. Build.gradle
- Keine externen Abhängigkeiten erforderlich.
2. MainActivity.java
- Unsere
MainActivity
,launcheractivity
. - Zuerst referenzieren wir hier Views, in diesem Fall einfache Textviews, um unsere empfangenen Daten anzuzeigen.
- Wir haben eine Methode: receiveData(), die für den Empfang und das Entpacken der Daten, die wir von der Klasse
MyFragment
erhalten, verantwortlich ist. - Wir werden die Daten in der Methode onResume() empfangen.
- Da die Methode nicht nur aufgerufen wird, wenn wir das
Fragment
wieder aufnehmen, sondern auch, nachdem dieAktivität
erstellt und gestartet wurde, müssen wir den Aufrufer mit einem einfachen Sender-String identifizieren, den wir jedes Mal senden, wenn wir Daten vomFragment
senden. - Wenn der Absender
MeinFragment
ist, dann machen wir weiter und entpacken unsere Daten.
package com.tutorials.hp.datafragment_activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private TextView nameTxt,yearTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//REFERENCE VIEWS
nameTxt= (TextView) findViewById(R.id.nameTxt);
yearTxt= (TextView) findViewById(R.id.yearTxt);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openFragment();
}
});
}
/*
WHEN ACTIVITY RESUMES
*/
@Override
protected void onResume() {
super.onResume();
//DETERMINE WHO STARTED THIS ACTIVITY
final String sender=this.getIntent().getExtras().getString("SENDER_KEY");
//IF ITS THE FRAGMENT THEN RECEIVE DATA
if(sender != null)
{
this.receiveData();
Toast.makeText(this, "Received", Toast.LENGTH_SHORT).show();
}
}
/*
OPEN FRAGMENT
*/
private void openFragment()
{
//PASS OVER THE BUNDLE TO OUR FRAGMENT
MyFragment myFragment = new MyFragment();
//THEN NOW SHOW OUR FRAGMENT
getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();
}
/*
RECEIVE DATA FROM FRAGMENT
*/
private void receiveData()
{
//RECEIVE DATA VIA INTENT
Intent i = getIntent();
String name = i.getStringExtra("NAME_KEY");
int year = i.getIntExtra("YEAR_KEY",0);
//SET DATA TO TEXTVIEWS
nameTxt.setText(name);
yearTxt.setText(String.valueOf(year));
}
}
3. MyFragment.java
- Unsere
Fragment
-Klasse. - Wir verwenden die Support-Bibliothek
Fragment
, also erweitern wirandroid.support.v4.app.
Fragment``. - Hier haben wir einen Text, eine Schaltfläche und einen Spinner.
- Der Benutzer gibt den Namen des Raumfahrzeugs in den Text ein, wählt das Startjahr aus und klickt auf die Schaltfläche "Senden", um die Daten an MainActivity zu senden.
- Wir senden und verpacken die Daten in einem "Intent".
- Wir senden auch eine Variable, die wir sender nennen, um den Absender dieser Daten als dieses
Fragment
zu identifizieren.
package com.tutorials.hp.datafragment_activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
/
* A simple Fragment subclass.
*/
public class MyFragment extends Fragment {
private EditText nameFragTxt;
private Spinner launchYearSpinner;
private Button sendBtn;
public MyFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView=inflater.inflate(R.layout.fragment_my, container, false);
//INITIALIZE VIEWS
nameFragTxt = (EditText)rootView.findViewById(R.id.nameEditTxt);
launchYearSpinner = (Spinner)rootView.findViewById(R.id.sp);
sendBtn = (Button) rootView.findViewById(R.id.sendBtn);
fillYears();
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendData();
}
});
return rootView;
}
/*
FILL YEARS IN OUR SPINNER
*/
private void fillYears() {
ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1);
adapter.add("2017");
adapter.add("2018");
adapter.add("2019");
adapter.add("2020");
adapter.add("2021");
adapter.add("2022");
//SET ADAPTER INSTANCE TO OUR SPINNER
launchYearSpinner.setAdapter(adapter);
}
private void sendData()
{
//INTENT OBJ
Intent i = new Intent(getActivity().getBaseContext(),
MainActivity.class);
//PACK DATA
i.putExtra("SENDER_KEY", "MyFragment");
i.putExtra("NAME_KEY", nameFragTxt.getText().toString());
i.putExtra("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));
//RESET WIDGETS
nameFragTxt.setText("");
launchYearSpinner.setSelection(0);
//START ACTIVITY
getActivity().startActivity(i);
}
}
4. Benutzerschnittstellen erstellen
Benutzeroberflächen werden in Android typischerweise mit XML-Layouts erstellt, im Gegensatz zu direkter Java-Codierung.
Dies ist ein Beispiel für deklarative Programmierung.
Vorteile der Verwendung von XML gegenüber Java
Nr. | Vorteil |
---|---|
1. | Die deklarative Erstellung von Widgets und Ansichten ermöglicht uns die Verwendung einer deklarativen Sprache XML, was die Arbeit erleichtert. |
2. | Es ist leicht wartbar, da die Benutzeroberfläche von der Java-Logik entkoppelt ist. |
3. | Es ist einfacher, Code weiterzugeben oder herunterzuladen und ihn vor der Laufzeit sicher zu testen. |
4. | Sie können XML-Generierungstools verwenden, um XML zu generieren |
Hier sind unsere Layouts für dieses Projekt:
(a). activity_main.xml
- Dieses Layout wird in die MainActivity-Benutzeroberfläche aufgeblasen.
- Es enthält die content_main.xml.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_fitsSystemWindows="true"
tools_context="com.tutorials.hp.datafragment_activity.MainActivity">
<android.support.design.widget.AppBarLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android_id="@+id/toolbar"
android_layout_width="match_parent"
android_layout_height="?attr/actionBarSize"
android_background="?attr/colorPrimary"
app_popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android_id="@+id/fab"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="bottom|end"
android_layout_margin="@dimen/fab_margin"
app_srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
Hier sind einige der Widgets, Ansichten und Ansichtsgruppen, die verwendet werden"
No. | View/ViewGroup | Package | Role |
---|---|---|---|
1. | CordinatorLayout | android.support.design.widget |
Super-powered framelayout, das unsere Anwendung auf oberster Ebene dekoriert und auch die Interaktionen und Verhaltensweisen aller seiner Kinder festlegt. |
2. | AppBarLayout | android.support.design.widget |
Ein untergeordnetes LinearLayout, das seine Kinder vertikal anordnet und Material Design App Bar-Konzepte wie Scroll-Gesten bereitstellt. |
3. | ToolBar | <android.support.v7.widget |
Eine ViewGroup, die Actionbar-Funktionen bietet und dennoch innerhalb von Anwendungslayouts verwendet werden kann. |
4. | FloatingActionButton | android.support.design.widget |
Eine kreisförmige Bildansicht, die über der Benutzeroberfläche schwebt und als Schaltfläche verwendet werden kann. |
(b). content_main.xml
Dieses Layout wird in Ihre activity_main.xml aufgenommen.
Hier definieren wir unsere UI-Widgets.
- Hauptlayout.
- Wir spezifizieren hier Views und Widgets xml-Code.
- Dieses Layout wird in unsere MainActivity-Schnittstelle aufgeblasen.
- Ist das contentmain.xml Layout in unserem Projekt.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_id="@+id/content_main"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.datafragment_activity.MainActivity"
tools_showIn="@layout/activity_main">
<LinearLayout
android_layout_width="match_parent"
android_orientation="vertical"
android_layout_height="match_parent">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Received Data"
android_id="@+id/activityTitle"
android_textStyle="bold"
android_textColor="@color/colorAccent"
android_layout_gravity="center_horizontal"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Name"
android_id="@+id/nameTxt"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Year"
android_id="@+id/yearTxt"
android_padding="5dp"
/>
<FrameLayout
android_id="@+id/container"
android_layout_width="match_parent"
android_layout_height="wrap_content">
</FrameLayout>
</LinearLayout>
</RelativeLayout>
(c). MyFragment Layout
- Layout für unsere Klasse
Fragment
. - Enthält eine CardView mit einem Edittext und einem Spinner.
- Ist das fragment_my.xml Layout in unserem Projekt.
<FrameLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
tools_context="com.tutorials.hp.datafragment_activity.MyFragment">
<android.support.v7.widget.CardView
android_orientation="horizontal"
android_layout_width="match_parent"
android_layout_margin="5dp"
card_view_cardCornerRadius="10dp"
card_view_cardElevation="5dp"
android_layout_height="300dp">
<LinearLayout
android_orientation="vertical"
android_layout_width="match_parent"
android_layout_height="match_parent">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="FRAGMENT ONE"
android_id="@+id/fragTitle"
android_textStyle="bold"
android_textColor="@color/colorAccent"
android_layout_gravity="center_horizontal"
android_padding="5dp"
/>
<android.support.design.widget.TextInputLayout
android_id="@+id/nameLayout"
android_layout_width="match_parent"
android_layout_height="wrap_content">
<EditText
android_id="@+id/nameEditTxt"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_singleLine="true"
android_hint= "Name" />
</android.support.design.widget.TextInputLayout>
<LinearLayout
android_layout_width="match_parent"
android_orientation="horizontal"
android_layout_height="wrap_content">
<TextView
android_text="LAUNCH YEAR : "
android_textColor="@color/colorAccent"
android_layout_width="wrap_content"
android_layout_height="wrap_content" />
<Spinner
android_id="@+id/sp"
android_layout_width="match_parent"
android_layout_height="wrap_content"
/>
</LinearLayout>
<Button
android_id="@+id/sendBtn"
android_text="Send"
android_layout_width="wrap_content"
android_layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
</FrameLayout>
How To Run
- Laden Sie das obige Projekt herunter.
- Sie erhalten eine gezippte Datei, entpacken Sie diese.
- Öffnen Sie das Android Studio.
- Schließen Sie nun ein bereits geöffnetes Projekt.
- Klicken Sie in der Menüleiste auf Datei >Neu> Projekt importieren.
- Wählen Sie nun einen Zielordner, aus dem Sie das Projekt importieren möchten.
- Wählen Sie ein Android-Projekt aus.
- Klicken Sie nun auf "OK".
- Fertig, Sie haben das Projekt importiert und können es jetzt bearbeiten.
Ergebnis
Sie erhalten folgendes Ergebnis:
Weitere Ressourcen
Ressource | Link |
---|---|
GitHub Browse | Browse |
GitHub Download Link | Download |
Beispiel 2: Android Data Passing - Von Activity
zu Fragment
via Bundle
Wenn man eine Anwendung entwickelt, die keine Hello World ist, dann ist die Wahrscheinlichkeit groß, dass man mehr als eine Activity
oder Fragmente braucht.Fragmente sind im Grunde genommen Unteraktivitäten.
Die meisten Neulinge kommen mit der Übergabe von Daten zwischen Activities
oder zwischen Fragmenten
durcheinander.
Heute wollen wir sehen, wie man Daten von einer Activity
an ein Fragment
weitergibt. Wir verwenden ein Bundle
Objekt, packen Daten in unsere Activity
und entpacken diese Daten dann in der onCreateView() Methode unseres Fragments
.
STEP 1 : Projekt erstellen
- Erstellen Sie zunächst ein neues Projekt in android studio. Gehe zu File --> New Project.
- Geben Sie den Anwendungsnamen ein und wählen Sie den Firmennamen.
- Wählen Sie Minimum SDK.
- Wählen Sie Empty oder Basic
Activity
. - Klicken Sie auf Finish.
SCHRITT 2: Unsere Build.gradle
- Wir werden eine CardView in unserem
Fragment
verwenden. Es werden keine externen Abhängigkeiten benötigt.
SCHRITT 3: Unser Fragment
- soll aus unserem
Fragment
-Layout aufgeblasen werden. - Wir empfangen einfach die von MainActivity gesendeten Daten und zeigen sie in unseren Ansichten innerhalb unseres "Fragments".
- Wir entpacken die Daten in unserer onCreateView() Methode.
package com.tutorials.hp.dataactivity_fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyFragment extends Fragment {
private TextView nameFragTxt,yearFragTxt;
public MyFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView=inflater.inflate(R.layout.fragment_my, container, false);
nameFragTxt= (TextView) rootView.findViewById(R.id.nameTxt);
yearFragTxt= (TextView) rootView.findViewById(R.id.yearTxt);
//UNPACK OUR DATA FROM OUR BUNDLE
String name=this.getArguments().getString("NAME_KEY").toString();
int year=this.getArguments().getInt("YEAR_KEY");
nameFragTxt.setText("NAME : "+name);
yearFragTxt.setText("YEAR : "+String.valueOf(year));
return rootView;
}
}
STEP 4 : Unsere MainActivity
- Wird von unserer contentmain.xml aufgeblasen.
- Wenn der Benutzer auf den Floating Action Button klickt, packen wir die Daten, die der Benutzer in edittext und spinner eingegeben hat, in ein
Bundle
Objekt. - Wir führen dann unsere "Fragment"-Transaktion durch und ersetzen unseren Framelayout-Container durch unser aufgeblasenes "Fragment".
- Wir senden das Bundle an das
Fragment
.
package com.tutorials.hp.dataactivity_fragment;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
public class MainActivity extends AppCompatActivity {
private EditText nameTxt;
private Spinner launchYearSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//INITIALIZE VIEWS
nameTxt = (EditText) findViewById(R.id.nameEditTxt);
launchYearSpinner = (Spinner) findViewById(R.id.sp);
fillYears();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendData();
}
});
}
/*
SEND DATA TO FRAGMENT
*/
private void sendData() {
//PACK DATA IN A BUNDLE
Bundle bundle = new Bundle();
bundle.putString("NAME_KEY", nameTxt.getText().toString());
bundle.putInt("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));
//PASS OVER THE BUNDLE TO OUR FRAGMENT
MyFragment myFragment = new MyFragment();
myFragment.setArguments(bundle);
nameTxt.setText("");
launchYearSpinner.setSelection(0);
//THEN NOW SHOW OUR FRAGMENT
getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();
}
/*
FILL YEARS IN OUR SPINNER
*/
private void fillYears() {
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
adapter.add("2017");
adapter.add("2018");
adapter.add("2019");
adapter.add("2020");
adapter.add("2021");
adapter.add("2022");
//SET ADAPTER INSTANCE TO OUR SPINNER
launchYearSpinner.setAdapter(adapter);
}
}
SCHRITT 5. Benutzeroberfläche Activity
erstellen
Benutzeroberflächen werden in Android typischerweise mit XML-Layouts erstellt, im Gegensatz zu direkter Java-Codierung.
Dies ist ein Beispiel für deklarative Programmierung.
Vorteile der Verwendung von XML gegenüber Java
Nr. | Vorteil |
---|---|
1. die deklarative Erstellung von Widgets und Ansichten ermöglicht uns die Verwendung einer deklarativen Sprache, XML, die es einfacher macht. | |
2. | Es ist leicht wartbar, da die Benutzeroberfläche von der Java-Logik entkoppelt ist. |
3. | Es ist einfacher, Code weiterzugeben oder herunterzuladen und ihn vor der Laufzeit sicher zu testen. |
4. | Sie können Tools zur XML-Generierung verwenden, um XML zu generieren. |
Hier sind unsere Layouts für dieses Projekt:
(a). activity_main.xml
- Dieses Layout wird zur MainActivity-Benutzeroberfläche aufgeblasen.
- Es enthält die Datei content_main.xml.
Hier sind einige der Widgets, Ansichten und Viewgroups, die verwendet werden"
No. | View/ViewGroup | Package | Role |
---|---|---|---|
1. | CordinatorLayout |
android.support.design.widget |
Super-powered framelayout , das die oberste Ebene unserer Anwendung dekoriert und auch die Interaktionen und das Verhalten aller seiner Kinder festlegt. |
2. | AppBarLayout |
android.support.design.widget |
Ein LinearLayout-Kind, das seine Kinder vertikal anordnet und Material Design App Bar-Konzepte wie Scroll-Gesten bietet. |
3. | ToolBar |
<android.support.v7.widget |
Eine ViewGroup, die Actionbar-Funktionen bietet und dennoch innerhalb von Anwendungslayouts verwendet werden kann. |
4. | FloatingActionButton |
android.support.design.widget |
Eine kreisförmige Bildansicht, die über der Benutzeroberfläche schwebt und als Schaltfläche verwendet werden kann. |
(b). content_main.xml
Dieses Layout wird in Ihre activity_main.xml aufgenommen.
Hier definieren wir unsere UI-Widgets.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.dataactivity_fragment.MainActivity"
tools_showIn="@layout/activity_main">
<LinearLayout
android_layout_width="match_parent"
android_orientation="vertical"
android_layout_height="match_parent">
<android.support.design.widget.TextInputLayout
android_id="@+id/nameLayout"
android_layout_width="match_parent"
android_layout_height="wrap_content">
<EditText
android_id="@+id/nameEditTxt"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_singleLine="true"
android_hint= "Name" />
</android.support.design.widget.TextInputLayout>
<LinearLayout
android_layout_width="match_parent"
android_orientation="horizontal"
android_layout_height="wrap_content">
<TextView
android_text="LAUNCH YEAR : "
android_textColor="@color/colorAccent"
android_layout_width="wrap_content"
android_layout_height="wrap_content" />
<Spinner
android_id="@+id/sp"
android_layout_width="match_parent"
android_layout_height="wrap_content"
/>
</LinearLayout>
<FrameLayout
android_id="@+id/container"
android_layout_width="match_parent"
android_layout_height="wrap_content">
</FrameLayout>
</LinearLayout>
</RelativeLayout>
SCHRITT 6: Unser Fragment
xml
- Unser
Fragment
Layout. - Soll eine CardView mit Textviews enthalten.
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
tools_context="com.tutorials.hp.dataactivity_fragment.MyFragment">
<android.support.v7.widget.CardView
android_orientation="horizontal"
android_layout_width="match_parent"
android_layout_margin="5dp"
card_view_cardCornerRadius="10dp"
card_view_cardElevation="5dp"
android_layout_height="300dp">
<LinearLayout
android_orientation="vertical"
android_layout_width="match_parent"
android_layout_height="match_parent">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="FRAGMENT ONE"
android_id="@+id/fragTitle"
android_textStyle="bold"
android_textColor="@color/colorAccent"
android_layout_gravity="center_horizontal"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Name"
android_id="@+id/nameTxt"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Year"
android_id="@+id/yearTxt"
android_padding="5dp"
/>
</LinearLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
SCHRITT 7 : Wie man es ausführt
- Laden Sie das Projekt herunter.
- Du erhältst eine gezippte Datei, entpacke sie.
- Öffnen Sie das Android Studio.
- Schließen Sie nun ein bereits geöffnetes Projekt.
- Klicken Sie in der Menüleiste auf Datei >Neu> Projekt importieren.
- Wählen Sie nun einen Zielordner, aus dem Sie das Projekt importieren möchten.
- Wählen Sie ein Android-Projekt aus.
- Klicken Sie nun auf "OK".
- Fertig, jetzt bearbeiten.
Ergebnis
Sie erhalten folgendes Ergebnis:
SCHRITT 8: Mehr
Ressource | Link |
---|---|
GitHub Durchsuchen | Durchsuchen |
GitHub Download Link | Download |
Android Datenübergabe: ListView zu ListView
Manchmal möchte man Daten von einem ListView in Activity A an einen ListView in Activity B übergeben. Das ist der Zweck dieses Tutorials.
Wir werden zwei Activities haben, jede mit einer ListView. Wir klicken auf einen Button und übergeben Daten von der ersten Activity
an die zweite Activity
, die erste Listenansicht an die zweite Listenansicht.
Gradle-Skripte
Ändern wir unsere build.gradle
Datei auf App-Ebene.
1. Build.gradle
- Wir spezifizieren Abhängigkeiten unter der dependencies closure.
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.tutorials.hp.listviewdatapassing"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support:design:25.2.0'
testCompile 'junit:junit:4.12'
}
LAYOUTS
Wir werden drei Layouts haben:
1. activity_main.xml
- Dieses Layout wird in die Benutzeroberfläche für unsere Hauptaktivität eingefügt.
- Es enthält das Layout
content_main.xml
. - Es enthält unsere Definitionen für die Anwendungsleiste und die Symbolleiste.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_fitsSystemWindows="true"
tools_context="com.tutorials.hp.listviewdatapassing.MainActivity">
<android.support.design.widget.AppBarLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android_id="@+id/toolbar"
android_layout_width="match_parent"
android_layout_height="?attr/actionBarSize"
android_background="?attr/colorPrimary"
app_popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android_id="@+id/fab"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="bottom|end"
android_layout_margin="@dimen/fab_margin"
app_srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
2. content_main.xml
- Dies wird unsere erste ListView enthalten.
- Dieses Layout wird in die
activity_main.xml
eingebunden.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_id="@+id/content_main"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.listviewdatapassing.MainActivity"
tools_showIn="@layout/activity_main">
<ListView
android_id="@+id/firstLV"
android_layout_width="match_parent"
android_layout_height="wrap_content" />
</RelativeLayout>
3. activity_second.xml
- Dieses Layout wird in die Benutzeroberfläche für unsere zweite
Activity
eingefügt. - Es wird die zweite
Aktivität
enthalten.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_id="@+id/activity_second"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
tools_context="com.tutorials.hp.listviewdatapassing.SecondActivity">
<ListView
android_id="@+id/secondLV"
android_layout_width="match_parent"
android_layout_height="wrap_content"
/>
</RelativeLayout>
JAVA-KLASSEN
Hier sind unsere JAVA-Klassen:
1. SpacecraftsCollection
- Diese Klasse wird uns helfen, unsere ArrayList von der ersten zur zweiten
Activity
zu transferieren. Diese Klasse wird serialisiert, übertragen und dann in der zweitenActivity
deserialisiert
package com.tutorials.hp.listviewdatapassing;
import java.io.Serializable;
import java.util.ArrayList;
public class SpacecraftsCollection implements Serializable {
private ArrayList<String> spacecrafts;
public ArrayList<String> getSpacecrafts() {
return spacecrafts;
}
public void setSpacecrafts(ArrayList<String> spacecrafts) {
this.spacecrafts = spacecrafts;
}
}
2. SecondActivity.java
- Dies ist unsere zweite
Activity
-Klasse. - Sie empfängt eine serialisierte Arrayliste mit unseren Raumschiffen, deserialisiert sie und zeigt sie in der zweiten Listenansicht an.
package com.tutorials.hp.listviewdatapassing;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class SecondActivity extends AppCompatActivity {
//SECOND LISTVIEW
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv= (ListView) findViewById(R.id.secondLV);
receiveData();
}
/*
RECEIVE DATA FROM FIRST ACTIVITY
*/
private void receiveData()
{
Intent i=this.getIntent();
SpacecraftsCollection spacecraftsCollection= (SpacecraftsCollection) i.getSerializableExtra("SPACECRAFTS");
lv.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,spacecraftsCollection.getSpacecrafts()));
}
}
3. MainActivity.java
- Unsere MainActivity-Klasse.
- Unsere Arraylistendaten werden von hier aus an die zweite
Activity
übertragen, wenn der schwebende Aktionsknopf angeklickt wird.
package com.tutorials.hp.listviewdatapassing;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
//FIRST LISTVIEW
ListView lv;
ArrayList spacecrafts=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
lv= (ListView) findViewById(R.id.firstLV);
populateData();
lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,spacecrafts));
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>()));
sendData();
}
});
}
//POPULATE SPACECRAFTS ARRAYLIST
private void populateData()
{
spacecrafts.add("Casini");
spacecrafts.add("Enterprise");
spacecrafts.add("Spitzer");
spacecrafts.add("Huygens");
spacecrafts.add("WMAP");
spacecrafts.add("Juno");
spacecrafts.add("Kepler");
spacecrafts.add("Apollo 15");
spacecrafts.add("Challenger");
spacecrafts.add("Discovery");
}
/*
SET ARRAYLIST TO SPACECRAFTS COLLECTION CLASS
*/
private SpacecraftsCollection getData()
{
SpacecraftsCollection spacecraftsCollection=new SpacecraftsCollection();
spacecraftsCollection.setSpacecrafts(spacecrafts);
return spacecraftsCollection;
}
/*
SEND DATA TO SECOND ACTIVITY
*/
private void sendData()
{
Intent i=new Intent(this,SecondActivity.class);
i.putExtra("SPACECRAFTS",this.getData());
startActivity(i);
}
}
Ergebnis
Das ist das Ergebnis, wenn Sie das Projekt ausführen:
Download
Code herunterladen hier.