A maneira mais flexível de criar um diálogo não é utilizando a classe andorid.app.Dialog
, mas sim a classe DialogFragment
. Através disto, você obtém toda a capacidade do `fragmento', incluindo a capacidade de observar o ciclo de vida do diálogo, bem como de utilizar ViewModels.
O que é um DialogFragment
?
Um DialogFragment
é um fragmento
que exibe uma janela de diálogo, flutuando no topo da janela de sua atividade
. Este 'fragmento' contém um objeto de diálogo, que ele exibe conforme apropriado, baseado no estado do 'fragmento'.
Nesta classe utilizamos o dialogfragment de suporte desde que o framework android.app.dialogFragment foi depreciado no nível 28 da API.
Nossa implementação irá sobrepor-se a esta classe e implementar
o onCreateView(LayoutInflater, ViewGroup, Bundle) para fornecer o conteúdo do diálogo. Alternativamente, podemos substituir o onCreateDialog(Bundle) para criar um diálogo inteiramente personalizado, como um AlertDialog, com seu próprio conteúdo.
Neste artigo, estaremos aprendendo o seguinte:
- Criando um diálogo com a ListView em kotlin.
- Utilizando o `DialogFragment' para criar um diálogo com layoutt personalizado, como alertasdiálogos, diálogos de entrada, etc.
- Criando menus popup
(a). Kotlin Android `DialogFragment' com ListView
Kotlin Android DialogFragment
com ListView tutorial.
Queremos ver como abrir um DialogFragment
quando um simples botão é clicado. O diálogoFragmento será composto por um título e uma visualização de lista.
Nós o inflacionamos através da classe LayoutInflater a partir de uma especificação de layout xml.
Quando o usuário clica em um item ListView, nós o mostramos em um Brinde. Quando o usuário clica fora do DialogFragment', nós o descartamos(o
DialogFragment').
Vamos lá.
Tutorial de Vídeo
Bem, temos um tutorial em vídeo como alternativa a isto. Se você preferir tutoriais como este, então seria bom que você assinasse nosso canal no YouTube. Basicamente temos uma TV para programação onde fazemos tutoriais diários especialmente para andróides.
Kotlin Android `DialogFragment' com o Simple ListView
Vejamos um exemplo completo.
Ferramentas
- IDE: Estúdio Android - andróide oficial andróide IDE apoiado por Jetbrains e Google.
- Idioma : Kotlin -Statically Typed Language desenvolvido primeiramente pela Jetbrains.
- Emulador : Nox Player - Um emulador rápido o suficiente para minha máquina lenta.
Gradle Scripts
Começamos explorando nossos roteiros de graduação.
(a). build.gradle(App)
Aqui está nosso arquivo de nível app build.gradle
. Temos as dependências DSL onde adicionamos nossas dependências.
Este arquivo é chamado de app level build.gradle
, uma vez que está localizado na pasta app do projeto.
Se você estiver utilizando o Android Studio versão 3 e superior, utilize a palavra-chave implementation' enquanto que se estiver utilizando uma versão menor que 3, então ainda utilize a palavra-chave
compile'.
Uma vez que você tenha modificado este arquivo build.gradle
, você tem que sincronizar seu projeto. O Android Studio irá, de fato, incentivá-lo a fazer isso.
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'
}
Você também pode ver que começamos aplicando dois plugins específicos para kotlin em nosso arquivo build.gradle:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
que é "kotlin-android" e "kotlin-android-extensions".
Código Kotlin
Os aplicativos Android podem ser escritos principalmente em Java ou Kotlin. Hoje em dia, porém, existem muitos frameworks como Flutter que também usam linguagens como Dart.
Nesta classe, estamos usando a linguagem de programação Kotlin.
Teremos estas classes em nosso projeto.
(a). PioneersFragment.kt
Representa nosso FragmentDialog e dele derivará de fato.
**1. Criando um DialogFragment
***.
Começamos criando uma classe Kotlin que deriva de android.support.v4.app.DialogFragment
. Utilizamos a biblioteca de suporte android.app.DialogFragment
uma vez que o android.app.DialogFragment
está obsoleto.
class PioneersFragment : DialogFragment() {..}
Observe que a declaração acima incluiu um construtor vazio padrão para nosso DialogFragment'. Fazemos isto utilizando os parênteses(
()`) em Kotlin.
2. Substituindo o DialogFragment
's OnCreateView().
Substituiremos então o método onCreateView()
da classe Fragmento.
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {..}
Passamos três parâmetros:
- Objeto LayoutInflater.
- Objeto ViewGroup.
- Agrupar objeto.
**3. Inflar um Layout em um DialogFragmento
***.
Dentro do método inflamos primeiro o layout "R.layout.fraglayout" através do método "inflate", utilizando a instância "LayoutInflater".
val rootView = inflater.inflate(R.layout.fraglayout, container)
**4. Criando uma Kotlin Array***
Em seguida, crie uma matriz Kotlin utilizando o método arrayOf()
. Isto atuará como nossa fonte de dados para hospedar os pioneiros. Isto é o que vamos ligar à ListView que mostraremos em nosso `DialogFragment'.
var pioneers = arrayOf("Dennis Ritchie", "Rodney Brooks", "Sergey Brin", "Larry Page", "Cynthia Breazeal", "Jeffrey Bezos", "Berners-Lee Tim", "Centaurus A", "Virgo Stellar Stream")
**5. Vinculação de uma listaVisão para Kotlin Array usando o ArrayAdapter***.
Em seguida, referenciamos nossa ListView e definimos o seu adaptador. Usaremos o adaptador arrayadapter.
val myListView = rootView.findViewById(R.id.myListView) as ListView
myListView!!.adapter = ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, pioneers)
**6. Definição de um DialogFragmento
Título***.
Nós definimos o título do DialogFragment' utilizando o método
setTitle()`, você passa uma corda para este método.
this.dialog.setTitle("Tech Pioneers")
**7. Ouvindo os eventos da ListView em Kotlin***.
Digamos que queremos mostrar uma mensagem de brinde quando uma ListView é clicada, mostrando o item clicado:
myListView.setOnItemClickListener {
adapterView,
view,
position,
l
-> Toast.makeText(activity, pioneers[position], Toast.LENGTH_SHORT).show()
}
Aqui está o código completo da classe '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
Esta é nossa MainActivity.kt. Ela conterá um botão que quando clicado mostrará ou abrirá nosso `DialogFragment'.
**1. Criar uma atividade em Kotlin***.
Basta criar uma classe, dar-lhe um identificador e depois fazê-la derivar de android.support.v7.app.AppCompatActivity
:
class MainActivity : AppCompatActivity() {..}
**2. Substituir o método onCreate() da atividade***.
O onCreate()
é um método que se levanta quando nossa atividade é criada.
Aqui chamamos o método onCreate()
da super classe
. Então utilizamos o método setContentView()
para inflar nossa atividade_main.xml
:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
**3. Widgets de referência em Kotlin***.
Você pode consultar widgets a partir de seu respectivo layout utilizando o método findViewById()
da atividade.
Como nós fazemos com nosso botão.
val openFragmentBtn = findViewById(R.id.openFragmentID) as Button
4. Obter o FragmentManager de uma atividade
Fragmentos são hospedados por Atividades. Portanto, uma atividade
mantém um supportFragmentManager
como uma propriedade.
Podemos obtê-lo desta forma:
val fm = supportFragmentManager
**5. Abrir/Mostrar um Fragmento
***.
Podemos abrir um Fragmento
ou mostrá-lo. Mas primeiro temos que instanciar esse "Fragmento":
val pioneersFragment = PioneersFragment()
Então, podemos abri-lo quando o usuário clica em um botão, invocando o método show()
da classe Fragmento
:
openFragmentBtn.setOnClickListener(object : View.OnClickListener {
override fun onClick(view: View) {
pioneersFragment.show(fm, "PioneersFragment_tag")
}
})
Aqui está o código completo da 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
Recursos de layout
(a). activity_main.xml
Este é o layout principal de nossa atividade'. Ele conterá nosso Botão que, quando clicado, abrirá nosso
DialogFragment'.
Este layout será inflado na interface principal da atividade
do usuário. Isto acontecerá através do método "SetContentView()setContentView()
da Atividade, o que exigirá que passemos a ele o layout.
Faremos isso dentro do método onCreate()
do Activity.
Utilizamos os seguintes elementos:
- RelativeLayout
- Botão
<?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
Nosso "layout do 'DiálogoFragmento'. Este layout é inflado na interface do usuário para nosso `Fragmento' de Diálogo.
Ele conterá um simples ListView.
<?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>
Recursos de valor
(a). cores.xml
Nossas cores de design de material:
<?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
O estilo de nossa aplicação.
<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
- Mostrar RecyclerView
Este exemplo mostrará uma visão do reciclador em diaogfragmento.*
Quando o usuário clica em um botão de exibição, abrimos um diálogofragmento, exibindo um RecyclerView nele.
Resumo do projeto
Não. | Arquivo | Responsabilidade principal |
---|---|---|
1. | MyHolder.java | Classe RecyclerView ViewHolder. |
2. | MyAdapter.java | RecyclerView classe adaptador de dados |
3. | TVShowFragment.java | DialogFragment class |
4. | MainActivity.java | Classe de atividade |
5. | activity_layout.xml | Para ser inflado para MainActivity |
6. | content_main.xml | To be included inside the activity_main.xml.Add our veiws and widgets here. |
7. | fraglayout.xml | O layout a ser inflado ao nosso `DialogFragment' personalizado. |
8. | model.xml | Para modelar como cada item de reciclagem aparecerá |
1. Criar Projeto de Atividades Básicas
- Primeiro, criar um projeto vazio no estúdio andróide. Vá para Arquivo --> Novo Projeto.
- Digite o nome do aplicativo e escolha o nome da empresa.
- Escolha o SDK mínimo.
- Escolha a
atividade básica
. - Clique em Finish.
A `atividade' básica terá uma barra de ferramentas e um botão de ação flutuante já adicionados no layout.
Normalmente dois layouts são gerados com esta opção:
Não. | Nome | Tipo | Descrição |
---|---|---|---|
activity_main.xml | XML Layout | Será inflado no MainActivity Layout. Tipicamente contém appbarlayout com barra de ferramentas. | |
2. | content_main.xml | XML Layout | Será incluído na activity_main.xml.Você adiciona suas opiniões e widgets aqui. |
3. | MainActivity.java | Classe | Atividade principal. |
Neste exemplo, utilizei uma `atividade' básica.
A atividade
será automaticamente registrada no android_manifest.xml. As atividades Android são componentes e normalmente precisam ser registradas como um componente de aplicação.
Se você criou a sua manualmente, então registre-a dentro da <aplicação>...<aplicação>
como a seguir, substituindo a MainActivity
pelo seu nome de atividade
:
<activity android_name=".MainActivity">
<intent-filter>
<action android_name="android.intent.action.MAIN" />
<category android_name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Você pode ver que uma ação e categoria são especificadas como filtros de intenção. A categoria torna nossa MainActivity como lançador `atividade'. As atividades do lançador são executadas primeiro quando o aplicativo andróide é executado.
3. Criar interface do usuário
Aqui estão nossos layouts para este projeto:
**activity_main.xml***
- Este layout é inflado para a interface do usuário MainActivity.
- Ele inclui o content_main.xml.
Aqui estão alguns dos widgets, visualizações e grupos de visualização que são empregados".
Não. | View/ViewGroup | Pacote | Role |
---|---|---|---|
1. | CordinatorLayout | android.support.design.widget |
Super-powered framelayout que fornece a decoração de alto nível de nossa aplicação e também especifica interações e comportamentos de todas as suas crianças. |
2. | AppBarLayout | android.support.design.widget |
Uma criança LinearLayout que organiza suas crianças verticalmente e fornece conceitos de barra de aplicação de design material como gestos de rolagem. |
3. | ToolBar | <android.support.v7.widget |
Um ViewGroup que pode fornecer recursos de barra de ação, mas que ainda pode ser utilizado dentro de layouts de aplicação. |
4. | FloatingActionButton | android.support.design.widget |
Uma visão circular da imagem flutuando acima da IU que podemos utilizar como botões. |
<?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***
Este layout é incluído em sua atividade_main.xml.
Você define seus widgets UI aqui mesmo.
<?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
Este layout será insuflado ao nosso `DialogFragmento'.
Ele conterá nosso "RecyclerView" como nosso "adapterview":
<?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
Este layout será inflado nos itens View para nosso RecyclerView.
Basicamente um CardView para cada item de Reciclagem.
Contém um TextView simples:
<?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. Criar classes Java
Os aplicativos Android são escritos em linguagem de programação Java, portanto, vamos criar algumas classes.
1. MyHolder.java
Nossa classe ViewHolder.
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. MeuAdaptador.java
Nossa classe de adaptador reciclador:
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
Este é o nosso `DialogFragmento'. Ele deriva de android.app.DiloagFragment.
Esta classe mostrará nosso "RecyclerView":
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
Nossa PrincipalAtividade.
Ela conterá um botão que ao ser clicado mostrará nosso `DialogFragment':
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");
}
});
}
}
Exemplo 2 - Android `DialogFragment' - ListView Search/Filter
A idéia de diálogos é ótima, porque podemos abri-los do nada. O usuário pode então realizar seu trabalho e depois dispensar o diálogo.
Neste exemplo, criamos um fragmento de diálogo que é exibido quando um simples botão é clicado a partir de nossa principal [atividade] (https://camposha.info/android/activity).
Nosso diálogo conterá uma simples ListView e uma SearchView. A ListView conterá uma Lista de jogadores.
A visualização de busca pode então ser usada para pesquisar os jogadores da lista.
**1. Nossa classe MainActivity***.
Esta é nossa principal atividade
.
Como classe é uma atividade, pois deriva de android.app.Activity
.
Não. | Responsabilidade |
---|---|
1. | É nosso lançador e apenas atividade . |
2. | Ele conterá um botão que, quando clicado, mostramos um fragmento de diálogo. |
3. | Mantém um FragmentManager que ajuda na exibição de nosso fragmento de diálogo. |
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. Nossa classe PlayerFragment.
Esta é a nossa classe PlayerFragment.
Não. | Responsabilidade |
---|---|
1. | Deriva do android.app.DialogFragment', tornando-o assim um DialogFragment'. |
2. | Referenciaremos aqui uma ListView e SearchView. ListView será nossa visualização do adaptador enquanto usaremos uma visualização de busca para inserir nossos termos de busca. |
3. | Descarregaremos nosso fragmento de diálogo quando o botão de descarte for clicado. |
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. Nosso Layout de Atividade Principal***
Este é nosso principal layout de atividade
.
Não. | Responsabilidade | Não. |
---|---|---|
1. | Contém um botão que, quando clicado, abrirá nosso fragmento de diálogo. |
<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. O NOSSO JogadorFragmento Layout***
Este é o layout de nosso `DialogFragment'.
Aqui estão os seus papéis:
Não. | Responsabilidade |
---|---|
1. | Defina uma ListView que exibirá a lista de itens. |
2. | Definir uma SearchView para pesquisar/filtrar nossos dados. |
3. | Definir um botão para dispensar nosso fragmento de diálogo. |
<?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>
**Nosso Manifesto***
Nosso manifesto andróide.xml. Nossa atividade
está registrada aqui.
<?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>