Der flexibelste Weg, einen Dialog zu erstellen, ist nicht die Verwendung der Klasse andorid.app.Dialog
, sondern die Verwendung der Klasse DialogFragment
. Dadurch erhalten Sie die volle Fragment
-Fähigkeit, einschließlich der Fähigkeit, den Lebenszyklus des Dialogs zu beobachten und ViewModels zu verwenden.
Was ist ein DialogFragment
?
Ein DialogFragment
ist ein Fragment
, das ein Dialogfenster anzeigt, das über dem Fenster seiner Aktivität
schwebt. Dieses Fragment
enthält ein Dialog-Objekt, das es je nach Zustand des Fragments
anzeigt.
In dieser Klasse verwenden wir die Unterstützung dialogfragment, da das Framework android.app.dialogFragment in API Level 28 veraltet ist.
Unsere Implementierung wird diese Klasse außer Kraft setzen und
onCreateView(LayoutInflater, ViewGroup, Bundle), um den Inhalt des Dialogs bereitzustellen. Alternativ können wir onCreateDialog(Bundle) überschreiben, um ein völlig benutzerdefiniertes Dialogfeld, z. B. ein AlertDialog, mit eigenem Inhalt zu erstellen.
In diesem Artikel werden wir das Folgende lernen:
- Erstellen eines Dialogs mit ListView in kotlin.
- Die Verwendung von
DialogFragment
, um Dialoge mit benutzerdefiniertem Layout zu erstellen, wie z.B. AlertDialoge, Eingabedialoge etc. - Erstellen von Popup-Menüs
(a). Kotlin Android DialogFragment
mit ListView
Kotlin Android DialogFragment
mit ListView tutorial.
Wir wollen sehen, wie man ein DialogFragment
öffnet, wenn ein einfacher Button angeklickt wird. Das DialogFragment wird aus einem Titel und einer Listenansicht bestehen.
Wir füllen es mit Hilfe der Klasse LayoutInflater aus einer Xml-Layout-Spezifikation auf.
Wenn der Benutzer auf ein ListView-Element klickt, zeigen wir es in einem Toast an. Wenn der Benutzer außerhalb des DialogFragments
klickt, schließen wir es (das DialogFragment
).
Los geht's.
Video-Tutorial
Nun, wir haben ein Video-Tutorial als Alternative zu diesem hier. Wenn Sie Tutorials wie dieses bevorzugen, wäre es gut, wenn Sie unseren YouTube-Kanal abonnieren. Im Grunde haben wir ein TV für Programmierung, wo wir täglich Tutorials speziell für Android machen.
Kotlin Android DialogFragment
mit einfacher ListView
Schauen wir uns ein komplettes Beispiel an.
Werkzeuge
- IDE: [Android Studio] (https://camposha.info/android/android-studio) - Androids offizielle Android-IDE, unterstützt von Jetbrains und Google.
- Sprache: Kotlin -Statically Typed Language, zuerst von Jetbrains entwickelt.
- Emulator : Nox Player - Ein Emulator, der schnell genug für meinen langsamen Rechner ist.
Gradle-Skripte
Wir beginnen mit der Erforschung unserer Gradle-Skripte.
(a). build.gradle(App)
Hier ist unsere Anwendungsebene build.gradle
Datei. Wir haben die Abhängigkeiten-DSL, wo wir unsere Abhängigkeiten hinzufügen.
Diese Datei wird app level build.gradle
genannt, da sie sich im app Ordner des Projekts befindet.
Wenn Sie Android Studio Version 3 und höher verwenden, benutzen Sie das Schlüsselwort implementation
, wenn Sie eine Version unter 3 verwenden, benutzen Sie das Schlüsselwort compile
.
Sobald Sie diese Datei build.gradle
geändert haben, müssen Sie Ihr Projekt synchronisieren. Android Studio wird Sie tatsächlich dazu auffordern.
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "info.camposha.kotlindialogfragment"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
}
Sie können auch sehen, dass wir damit begonnen haben, zwei kotlin-spezifische Plugins in unserer build.gradle-Datei anzuwenden:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
Das sind kotlin-android
und kotlin-android-extensions
.
Kotlin-Code
Android-Apps können hauptsächlich in Java oder Kotlin geschrieben werden. Heutzutage gibt es jedoch viele Frameworks wie Flutter, die auch Sprachen wie Dart verwenden.
In diesem Kurs verwenden wir die Programmiersprache Kotlin.
Wir werden diese Klassen in unserem Projekt verwenden.
(a). PioneersFragment.kt
Stellt unseren FragmentDialog dar und wird in der Tat von ihm abgeleitet.
1. Erstellen eines DialogFragments
Wir beginnen mit der Erstellung einer Kotlin-Klasse, die von android.support.v4.app.DialogFragment
ableitet. Wir verwenden die Support-Bibliothek fragment
, da android.app.DialogFragment
veraltet ist.
class PioneersFragment : DialogFragment() {..}
Beachten Sie, dass die obige Anweisung einen leeren Standardkonstruktor für unser DialogFragment
enthält. Wir tun dies unter Verwendung der Klammern (()
) in Kotlin.
2. OnCreateView() von DialogFragment
überschreiben
Anschließend überschreiben wir die Methode onCreateView()
der Klasse Fragment.
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {..}
Wir haben drei Parameter übergeben:
- LayoutInflater-Objekt.
- ViewGroup-Objekt.
- Bundle-Objekt.
3. Aufblasen eines Layouts in ein DialogFragment
Innerhalb der Methode blasen wir zunächst das R.layout.fraglayout
-Layout über die Methode inflate
auf, indem wir die Instanz LayoutInflater
verwenden.
val rootView = inflater.inflate(R.layout.fraglayout, container)
4. Erstellen eines Kotlin-Arrays
Anschließend erstellen wir ein Kotlin-Array mit der Methode arrayOf()
. Dieses wird als unsere Datenquelle für die Pioniere dienen. Dies werden wir an die ListView binden, die wir in unserem DialogFragment
anzeigen werden.
var pioneers = arrayOf("Dennis Ritchie", "Rodney Brooks", "Sergey Brin", "Larry Page", "Cynthia Breazeal", "Jeffrey Bezos", "Berners-Lee Tim", "Centaurus A", "Virgo Stellar Stream")
5. Binden einer ListView an ein Kotlin Array mittels ArrayAdapter
Dann verweisen wir auf unsere ListView und setzen ihren Adapter. Wir werden arrayadapter verwenden.
val myListView = rootView.findViewById(R.id.myListView) as ListView
myListView!!.adapter = ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, pioneers)
6. Setzen eines DialogFragment
Titels
Wir setzen den Titel des DialogFragments
mit der Methode setTitle()
, Sie übergeben einen String an diese Methode.
this.dialog.setTitle("Tech Pioneers")
7. Listening to ListView's Click events in Kotlin
Nehmen wir an, wir wollen eine Toast-Nachricht anzeigen, wenn eine ListView angeklickt wird, die das angeklickte Element anzeigt:
myListView.setOnItemClickListener {
adapterView,
view,
position,
l
-> Toast.makeText(activity, pioneers[position], Toast.LENGTH_SHORT).show()
}
Hier ist der vollständige Code der Klasse PioneersFragment
:
package info.camposha.kotlindialogfragment
import android.os.Bundle
import android.support.v4.app.DialogFragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.Toast
class PioneersFragment : DialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val rootView = inflater.inflate(R.layout.fraglayout, container)
var pioneers = arrayOf("Dennis Ritchie", "Rodney Brooks", "Sergey Brin", "Larry Page", "Cynthia Breazeal", "Jeffrey Bezos", "Berners-Lee Tim", "Centaurus A", "Virgo Stellar Stream")
val myListView = rootView.findViewById(R.id.myListView) as ListView
//with arrayadapter you have to pass a textview as a resource, and that is simple_list_item_1
myListView!!.adapter = ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, pioneers)
this.dialog.setTitle("Tech Pioneers")
myListView.setOnItemClickListener {
adapterView,
view,
position,
l
-> Toast.makeText(activity, pioneers[position], Toast.LENGTH_SHORT).show()
}
return rootView
}
}
(c). MainActivity.kt
Dies ist unsere MainActivity. Sie wird eine Schaltfläche enthalten, die, wenn sie angeklickt wird, unser DialogFragment
zeigt oder öffnet.
1. Erstellen einer Activity in Kotlin
Du erstellst einfach eine Klasse, gibst ihr einen Bezeichner und lässt sie von android.support.v7.app.AppCompatActivity
ableiten:
class MainActivity : AppCompatActivity() {..}
2. Überschreiben Sie die onCreate()-Methode der Activity
Die Methode "onCreate()" ist eine Methode, die ausgelöst wird, wenn unsere Aktivität erstellt wird.
Hier rufen wir die Methode onCreate()
der super class
auf. Dann verwenden wir die Methode setContentView()
, um unsere activity_main.xml
aufzublasen:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
3. Widgets in Kotlin referenzieren
Man kann Widgets aus ihrem jeweiligen Layout referenzieren, indem man die Methode findViewById()
der activity verwendet.
So wie wir es mit unserem Button machen.
val openFragmentBtn = findViewById(R.id.openFragmentID) as Button
4. Abrufen des FragmentManagers einer Activity
Fragmente werden von Aktivitäten gehostet. Daher unterhält eine Activity
einen supportFragmentManager
als Eigenschaft.
Wir können ihn auf diese Weise erhalten:
val fm = supportFragmentManager
5. Öffnen/Anzeigen eines Fragments
Wir können ein Fragment
öffnen oder es anzeigen. Aber zuerst müssen wir das Fragment
instanziieren:
val pioneersFragment = PioneersFragment()
Dann können wir es öffnen, wenn der Benutzer auf eine Schaltfläche klickt, indem wir die Methode show()
der Klasse Fragment
aufrufen:
openFragmentBtn.setOnClickListener(object : View.OnClickListener {
override fun onClick(view: View) {
pioneersFragment.show(fm, "PioneersFragment_tag")
}
})
Hier ist der vollständige Code der MainActivity
:
package info.camposha.kotlindialogfragment
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val openFragmentBtn = findViewById(R.id.openFragmentID) as Button
val fm = supportFragmentManager
val pioneersFragment = PioneersFragment()
openFragmentBtn.setOnClickListener(object : View.OnClickListener {
override fun onClick(view: View) {
pioneersFragment.show(fm, "PioneersFragment_tag")
}
})
}
}
//end
Layout-Ressourcen
(a). activity_main.xml
Dies ist das Layout unserer Hauptaktivität
. Es wird unseren Button enthalten, der, wenn er angeklickt wird, unser DialogFragment
öffnet.
Dieses Layout wird in die Benutzeroberfläche der Hauptaktivität aufgeblasen. Dies geschieht über die Methode setContentView()
der Activity, die es erfordert, dass wir das Layout übergeben.
Wir werden dies innerhalb der onCreate()
Methode von Activity tun.
Wir verwenden die folgenden Elemente:
- RelativeLayout
- Schaltfläche
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
tools_context=".MainActivity">
<Button
android_id="@+id/openFragmentID"
android_text="Open Fragment"
android_background="@color/colorAccent"
android_layout_centerInParent="true"
android_layout_width="wrap_content"
android_layout_height="wrap_content" />
</RelativeLayout>
(b). fraglayout.xml
Unser DialogFragment
-Layout. Dieses Layout wird in die Benutzeroberfläche für unser Dialog Fragment
aufgeblasen.
Es wird eine einfache ListView enthalten.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android_orientation="vertical" android_layout_width="match_parent"
android_layout_height="match_parent">
<ListView
android_id="@+id/myListView"
android_layout_width="match_parent"
android_layout_height="wrap_content"/>
</LinearLayout>
Wert-Ressourcen
(a). colors.xml
Unsere Material Design Farben:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="material_amber_700">#ffffa000</color>
<color name="material_amber_800">#ffff8f00</color>
<color name="material_amber_900">#ffff6f00</color>
<color name="material_amber_A100">#ffffe57f</color>
<color name="material_amber_A200">#ffffd740</color>
<color name="material_amber_A400">#ffffc400</color>
</resources>
(b). styles.xml
Der Stil unserer Anwendung.
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/material_amber_A400</item>
<item name="colorPrimaryDark">@color/material_amber_900</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
(b). Android DialogFragment
- RecyclerView anzeigen
Dieses Beispiel zeigt eine RecyclerView in diaogfragment.
Wenn der Benutzer auf einen Show-Button klickt, öffnen wir ein Dialogfragment und zeigen eine RecyclerView darin an.
Projektzusammenfassung
Nr. | Datei | Hauptverantwortung |
---|---|---|
1. | MyHolder.java | RecyclerView ViewHolder Klasse. |
2. | MyAdapter.java | RecyclerView Datenadapterklasse |
3. | TVShowFragment.java | DialogFragment Klasse |
4. | MainActivity.java | Aktivitätsklasse |
5. | activity_layout.xml | Soll auf MainActivity aufgeblasen werden |
6. | content_main.xml | Wird in die activity_main.xml eingefügt. Hier fügen wir unsere Vektoren und Widgets ein. |
7. | fraglayout.xml | Das Layout, das in unser benutzerdefiniertes DialogFragment aufgeblasen wird. |
8. | model.xml | Um zu modellieren, wie jedes Recyclerview-Element erscheinen wird |
1. Basic Activity Projekt erstellen
- Erstellen Sie zunächst ein leeres Projekt in android studio. Gehen Sie zu File --> New Project.
- Geben Sie den Anwendungsnamen ein und wählen Sie den Firmennamen.
- Wählen Sie Minimum SDK.
- Wählen Sie Basic
Aktivität
. - Klicken Sie auf Fertigstellen.
Basic activity
hat bereits eine Symbolleiste und eine schwebende Aktionsschaltfläche im Layout hinzugefügt
Normalerweise werden mit dieser Option zwei Layouts erstellt:
Nr. | Name | Typ | Beschreibung |
---|---|---|---|
1. activity_main.xml | XML-Layout | Wird in das MainActivity-Layout aufgeblasen, das typischerweise ein Appbar-Layout mit einer Symbolleiste und einem schwebenden Aktionsbutton enthält. | |
2. | content_main.xml | XML-Layout | Wird in activity_main.xml eingebunden.Hier fügen Sie Ihre Ansichten und Widgets hinzu. |
3. | MainActivity.java | Klasse | Hauptaktivität. |
In diesem Beispiel habe ich eine einfache Activity
verwendet.
Die "Activity" wird automatisch in der android_manifest.xml registriert. Android Activities sind Komponenten und müssen normalerweise als Anwendungskomponente registriert werden.
Wenn Sie Ihre manuell erstellt haben, dann registrieren Sie sie innerhalb der <Anwendung>...<Anwendung>
wie folgt, wobei Sie die MainActivity
durch Ihren Activity
-Namen ersetzen:
<activity android_name=".MainActivity">
<intent-filter>
<action android_name="android.intent.action.MAIN" />
<category android_name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Sie können sehen, dass eine Aktion und eine Kategorie als Absichtsfilter angegeben sind. Die Kategorie macht unsere MainActivity zu einer Launcher-Activity. Launcher-Aktivitäten werden zuerst ausgeführt, wenn die Android-App gestartet wird.
3. Benutzeroberfläche erstellen
Hier sind unsere Layouts für dieses Projekt:
activity_main.xml
- Dieses Layout wird in die 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 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. |
<?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.dialogfragmentrecyclerview.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"
android_src="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
content_main.xml
Dieses Layout wird in Ihre activity_main.xml aufgenommen.
Du definierst deine UI-Widgets genau hier.
<?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.dialogfragmentrecyclerview.MainActivity"
tools_showIn="@layout/activity_main">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_text="Hello World!" />
</RelativeLayout>
fraglayout.xml
Dieses Layout wird zu unserem DialogFragment
aufgeblasen.
Es wird unsere RecyclerView als unsere Adapterview enthalten:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android_orientation="vertical" android_layout_width="match_parent"
android_layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android_id="@+id/mRecyerID"
android_layout_width="match_parent"
android_layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</LinearLayout>
model.xml
Dieses Layout wird zu den View-Elementen für unseren RecyclerView aufgeblasen.
Im Grunde genommen eine CardView für jedes RecyclerView Element.
Enthält einen einfachen TextView:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
android_id="@+id/mCard"
android_orientation="horizontal"
android_layout_width="match_parent"
android_layout_margin="10dp"
card_view_cardCornerRadius="10dp"
card_view_cardElevation="10dp"
android_layout_height="wrap_content">
<RelativeLayout
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="Name"
android_id="@+id/nameTxt"
android_padding="10dp"
android_layout_alignParentLeft="true"
/>
</RelativeLayout>
</android.support.v7.widget.CardView>
4. Java-Klassen erstellen
Android-Apps werden in der Programmiersprache Java geschrieben, also erstellen wir einige Klassen.
1. MyHolder.java
Unsere ViewHolder-Klasse.
package com.tutorials.hp.dialogfragmentrecyclerview.mRecycler;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import com.tutorials.hp.dialogfragmentrecyclerview.R;
public class MyHolder extends RecyclerView.ViewHolder {
TextView nameTxt;
public MyHolder(View itemView) {
super(itemView);
nameTxt= (TextView) itemView.findViewById(R.id.nameTxt);
}
}
2. MyAdapter.java
Unsere Recyclerview-Adapterklasse:
package com.tutorials.hp.dialogfragmentrecyclerview.mRecycler;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.tutorials.hp.dialogfragmentrecyclerview.R;
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
Context c;
String[] tvshows;
public MyAdapter(Context c, String[] tvshows) {
this.c = c;
this.tvshows = tvshows;
}
//INITIALIE VH
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,parent,false);
MyHolder holder=new MyHolder(v);
return holder;
}
//BIND DATA
@Override
public void onBindViewHolder(MyHolder holder, int position) {
holder.nameTxt.setText(tvshows[position]);
}
@Override
public int getItemCount() {
return tvshows.length;
}
}
TVShowFragment.java
Dies ist unser DialogFragment
. Es leitet sich von android.app.DiloagFragment ab.
Diese Klasse wird unser RecyclerView anzeigen:
package com.tutorials.hp.dialogfragmentrecyclerview;
import android.app.DialogFragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.tutorials.hp.dialogfragmentrecyclerview.mRecycler.MyAdapter;
public class TVShowFragment extends DialogFragment {
String[] tvshows={"Crisis","Blindspot","BlackList","Game of Thrones","Gotham","Banshee"};
RecyclerView rv;
MyAdapter adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView=inflater.inflate(R.layout.fraglayout,container);
//RECYCER
rv= (RecyclerView) rootView.findViewById(R.id.mRecyerID);
rv.setLayoutManager(new LinearLayoutManager(this.getActivity()));
//ADAPTER
adapter=new MyAdapter(this.getActivity(),tvshows);
rv.setAdapter(adapter);
this.getDialog().setTitle("TV Shows");
return rootView;
}
}
4. MainActivity.java
Unsere MainActivity.
Sie wird eine Schaltfläche enthalten, die, wenn sie angeklickt wird, unser DialogFragment
zeigt:
package com.tutorials.hp.dialogfragmentrecyclerview;
import android.app.FragmentManager;
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;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
final FragmentManager fm=getFragmentManager();
final TVShowFragment tv=new TVShowFragment();
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv.show(fm,"TV_tag");
}
});
}
}
Beispiel 2 - Android DialogFragment
- ListView Suche/Filter
Die Idee der Dialoge ist großartig, weil wir sie aus dem Nichts auftauchen lassen können. Der Benutzer kann dann sein Ding machen und den Dialog wieder schließen.
In diesem Beispiel erstellen wir ein Dialogfragment, das angezeigt wird, wenn eine einfache Schaltfläche in unserer Haupt-[Aktivität] (https://camposha.info/android/activity) angeklickt wird.
Unser Dialogfragment wird eine einfache ListView und eine SearchView enthalten. Die ListView wird eine Liste der Spieler enthalten.
Die Suchansicht kann dann verwendet werden, um die Spieler in der Liste zu suchen.
1. Unsere MainActivity-Klasse
Dies ist unsere Hauptaktivität.
Als Klasse ist sie eine activity, da sie sich von android.app.Activity
ableitet.
No. | Verantwortung |
---|---|
1. | Es ist unser Launcher und die einzige Activity . |
2. | Sie enthält eine Schaltfläche, die, wenn sie angeklickt wird, ein Dialogfragment anzeigt. |
3. | Sie verwaltet einen FragmentManager, der bei der Anzeige unseres Dialogfragments hilft. |
package com.tutorials.dialogfragmenter;
import android.app.Activity;
import android.app.FragmentManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final FragmentManager fm=getFragmentManager();
final PlayersFragment p=new PlayersFragment();
btn=(Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
p.show(fm, "Best Players");
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
2. Unsere PlayerFragment-Klasse.
Dies ist unsere PlayerFragment-Klasse.
Nr. | Verantwortung |
---|---|
1. | Leitet sich von android.app.DialogFragment ab und ist somit ein DialogFragment . |
2. | Wir referenzieren hier eine ListView und eine SearchView. ListView wird unsere Adapterview sein, während wir eine Searchview für die Eingabe unserer Suchbegriffe verwenden werden. |
3. | Wir werden unser Dialogfragment schließen, wenn die Schaltfläche "Schließen" angeklickt wird. |
package com.tutorials.dialogfragmenter;
import android.app.DialogFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
public class PlayersFragment extends DialogFragment {
Button btn;
ListView lv;
SearchView sv;
ArrayAdapter<String> adapter;
String[] players={"Lionel Messi","Christiano Ronaldo","Neymar","Gareth Bale"};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View rootView=inflater.inflate(R.layout.sports, null);
//SET TITLE DIALOG TITLE
getDialog().setTitle("Best Players In The World");
//BUTTON,LISTVIEW,SEARCHVIEW INITIALIZATIONS
lv=(ListView) rootView.findViewById(R.id.listView1);
sv=(SearchView) rootView.findViewById(R.id.searchView1);
btn=(Button) rootView.findViewById(R.id.dismiss);
//CREATE AND SET ADAPTER TO LISTVIEW
adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,players);
lv.setAdapter(adapter);
//SEARCH
sv.setQueryHint("Search..");
sv.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String txt) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onQueryTextChange(String txt) {
// TODO Auto-generated method stub
adapter.getFilter().filter(txt);
return false;
}
});
//BUTTON
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
dismiss();
}
});
return rootView;
}
}
3. Unser MainActivity-Layout
Dies ist unser Hauptlayout für die "Aktivität".
No. | Verantwortung |
---|---|
1. | Enthält eine Schaltfläche, die, wenn sie angeklickt wird, unser Dialogfragment öffnet. |
<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"
tools_context=".MainActivity" >
<Button
android_id="@+id/button1"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_alignParentLeft="true"
android_layout_alignParentTop="true"
android_layout_marginLeft="97dp"
android_layout_marginTop="163dp"
android_text="Show" />
</RelativeLayout>
4. UNSER PlayerFragment-Layout
Dies ist das Layout unseres DialogFragments
.
Hier sind seine Rollen:
No. | Verantwortung |
---|---|
1. | Definieren Sie eine ListView, die eine Liste von Elementen anzeigt. |
2. | Definieren Sie eine SearchView zum Suchen/Filtern unserer Daten. |
3. | Definieren Sie eine Schaltfläche zum Verlassen unseres Dialogfragments. |
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_orientation="vertical" >
<SearchView
android_id="@+id/searchView1"
android_layout_width="match_parent"
android_layout_height="wrap_content" >
</SearchView>
<ListView
android_id="@+id/listView1"
android_layout_width="match_parent"
android_layout_height="326dp" >
</ListView>
<Button
android_id="@+id/dismiss"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_text="Dismiss" />
</LinearLayout>
Unser Manifest
Unser android manifest.xml. Hier wird unsere Aktivität
registriert.
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="com.tutorials.dialogfragmenter"
android_versionCode="1"
android_versionName="1.0" >
<uses-sdk
android_minSdkVersion="19"
android_targetSdkVersion="19" />
<application
android_allowBackup="true"
android_icon="@drawable/ic_launcher"
android_label="@string/app_name"
android_theme="@style/AppTheme" >
<activity
android_name="com.tutorials.dialogfragmenter.MainActivity"
android_label="@string/app_name" >
<intent-filter>
<action android_name="android.intent.action.MAIN" />
<category android_name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>