A passagem de dados entre "atividades" ou "fragmentos" é um dos conceitos básicos que você precisa aprender quando começar a fazer o desenvolvimento do andróide. Mesmo que "atividades" e "fragmentos" não sejam nada além de aulas, eles são considerados aulas especiais em andróide, já que são fundamentais para como funciona a interface do usuário andróide. Assim, não apenas passamos os dados através de construtores, mas em uma das três seguintes maneiras:
- `Intent'.
Bundle
.- ViewModel
Analisaremos tudo isso usando exemplos práticos nesta lição. Vamos começar.
Exemplo 1: Passagem de dados Android - Fragmento
para Atividade
Via `Intent'.
Vamos continuar com nossas séries de passagem de dados andróides que tínhamos iniciado anteriormente. Tínhamos estudado como passar dados de "atividade" para "fragmento" e como passar tanto uma lista/objeto de "atividade" para "atividade", quanto simples tipos de dados primitivos.
Hoje, analisamos como passar dados simples do "fragmento" para a "atividade".
O que é um Fragmento
?
Um fragmento
é uma subatividade com seu próprio ciclo de vida. Os fragmentos são hospedados pelas atividades
. Um atividade
pode hospedar múltiplos fragmentos.
Por que passar dados do Fragmento
para a atividade
?
Não. | Motivo |
---|---|
1. | Fragmentos são subatividades e nos permitem ter telas diferentes sem necessariamente ter que criar muitas atividades . Portanto, precisamos saber como passar os dados do fragmento para uma atividade . |
2. | Fragmentos como Atividades são classes especiais de IU representando uma janela e, portanto, não podemos passar dados diretamente como fazemos com as classes comuns. |
Introdução
- Temos duas classes : uma nossa "atividade principal" e outra classe "meu fragmento".
- Quando pressionamos o botão FAB (Floating Action Button), abrimos o MyFragment via Transaction, anexando-o a um FrameLayout que iremos definir.
- O
Fragmento
contém um texto de edição e um spinner. - O usuário digita o nome da nave espacial e escolhe o ano de lançamento na fiação.
- Em seguida, passamos estes dois dados de volta à MainActivity.
- Em seguida, exibimos os dados recebidos em visualizações de texto.
- Usamos o Android Studio como nossa IDE.
- O código é bem comentado para facilitar a compreensão.
Perguntas comuns que respondemos
Com este simples exemplo, exploramos o seguinte :
- Como passar dados do
fragmento
para umaatividade
. - Como passar dados entre o
fragmento
e aatividade
utilizando intentos. - Como faço para realizar a FragmentTransaction.
- Substituir em Retomar() e receber dados em andróide.
- Como trabalhar tanto com o
fragmento
quanto com aatividade
.
Ferramentas utilizadas
- IDE : Estúdio Android
- OS : Windows 8.1
- PLATFORM : Android
- LÍNGUA : Java
- TOPIC :
Intent',Passagem de dados,
Fragmento'.
Vamos lá.
Vamos dar uma olhada no código fonte.
1. 'Build.gradle'.
- Não são necessárias dependências externas.
2. MainActivity.java
- Nosso "Atividade principal", lançador Atividade.
- Primeiro referimos aqui as visualizações, neste caso simples visualizações de texto para exibir nossos dados recebidos.
- Temos um método: receberData() que é responsável por receber e desembalar os dados que recebemos da classe
MeuFragmento
. - Estaremos recebendo os dados no método onResume().
- Como os métodos são chamados não somente quando retomamos do
fragmento
mas também depois que aatividade
for criada e iniciada, precisaremos identificar o chamador utilizando uma simples string do Remetente que enviaremos toda vez que enviarmos dados dofragmento
. - Se o remetente for 'Meu fragmento', então vamos em frente e desembalamos nossos dados.
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. MeuFragmento.java
- Nossa classe
Fragmento
. - Estamos utilizando a biblioteca de suporte
Fragmento
por isso estendemosandroid.support.v4.app.
Fragmento``. - Aqui temos um texto de edição, um botão e um spinner.
- O usuário deve digitar o nome da nave espacial em edittext,selecione o ano de lançamento no spinner e clique no botão enviar para enviar esses dados para MainActivity.
- Enviamos e empacotamos os dados em um
intent
. - Enviamos também uma variável que chamamos remetente para identificar o remetente desses dados como este
fragmento
.
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. Criar interfaces de usuário
As interfaces de usuário são normalmente criadas em andróides usando layouts XML, em oposição à codificação direta em java.
Este é um exemplo de programação declarativa.
Vantagens do uso de XML sobre Java
Não. | Vantagem |
---|---|
1. | Criação declarativa de widgets e views nos permite usar uma linguagem declarativa XML que torna mais fácil. |
2. | É de fácil manutenção, pois a interface do usuário é dissociada de sua lógica Java. |
3. | É mais fácil compartilhar ou baixar o código e testá-los com segurança antes do tempo de execução. |
4. | Você pode usar ferramentas geradas em XML para gerar XML |
Aqui estão nossos layouts para este projeto:
(a). activity_main.xml
- Este layout é inflado para a interface do usuário MainActivity.
- Ele inclui o 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>
Aqui estão alguns dos widgets, visões e grupos de visão que se empregam".
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. |
(b). content_main.xml
Este layout é incluído em sua atividade_main.xml.
Definimos aqui nossos widgets UI.
- Layout principal.
- Especificamos aqui os Views e widgets xml code.
- Este layout deve ser inflado em nossa interface MainActivity.
- É o layout do contentmain.xml em nosso projeto.
<?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). Layout do MyFragment
- Layout para nossa classe
Fragmento
. - Contém um CardView com um texto de edição e um spinner.
- É o layout do fragmento_my.xml em nosso projeto
<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>
Como Funcionar
- Faça o download do projeto acima.
- Você receberá um arquivo zipado, extraia-o.
- Abra o Estúdio Android.
- Agora feche, qualquer projeto já aberto
- Na barra de menu clique em **Arquivo >Novo > Projeto de Importação***
- Agora escolha uma pasta de destino, de onde você quer importar o projeto.
- Escolha um projeto Android.
Agora clique em "**OK***". - Feito, você já importou o projeto, agora edite-o.
Resultado
Aqui está o que você terá:
Mais recursos
Recurso | Link | |
---|---|---|
GitHub Browse | Browse | Browse |
GitHub Download Link | Download | Download |
Exemplo 2: Passagem de dados Android - De "Atividade" para "Fragmento" via "Bundle".
Ao desenvolver qualquer aplicação que não seja um Hello World, é provável que você precise ter mais de uma Atividade
ou Fragmentos.
A maioria dos novatos se confunde com a passagem de dados entre atividades
ou entre fragmentos
.
Hoje queremos ver como passar dados de uma atividade
para um fragmento
. Vamos utilizar um objeto "Bundle", embalar dados em nossa "Atividade", depois desempacotar esses dados dentro do método onCreateView() de nosso "Fragmento".
PASSO 1 : Criar Projeto
- Primeiro, criar um novo projeto no estúdio andróide. Ir para Arquivo --> Novo Projeto.
- Digite o nome do aplicativo e escolha o nome da empresa.
- Escolha o SDK mínimo.
- Escolher Vazio ou
atividade Básica
. - Clique em Finish.
PASSO 2 : Nosso `Build.gradle'.
- Estaremos utilizando um CardView em nosso `Fragmento'. Não são necessárias dependências externas.
PASSO 3 : Nosso `Fragmento'.
- Será inflado a partir de nosso "fragmento" de layout.
- Receberemos simplesmente os dados enviados pela MainActivity e os mostraremos em nossa visão dentro de nosso
fragmento
. - Desembrulhamos os dados em nosso método onCreateView().
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;
}
}
PASSO 4 : Nossa PrincipalAtividade
- Será inflado a partir de nosso conteúdomain.xml
- Quando o usuário clica no Botão de Ação Flutuante, embalamos os dados digitados por usuário em texto de edição e spinner em um objeto
Bundle
. - Em seguida, realizamos nossa transação 'Fragmento', substituindo nosso recipiente Framelayout por nosso 'Fragmento' inflado.
- Enviamos o pacote para o
Fragmento
.
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);
}
}
PASSO 5. Criar Atividade
Interface do usuário
As interfaces de usuário são normalmente criadas em andróides usando layouts XML, em oposição à codificação direta em java.
Este é um exemplo de programação declarativa.
**Vantagens do uso de XML sobre Java***.
Não. | Vantagem |
---|---|
1. | Criação declarativa de widgets e views nos permite usar uma linguagem declarativa XML que torna mais fácil. |
2. | É de fácil manutenção, pois a interface do usuário é dissociada de sua lógica Java. |
3. | É mais fácil compartilhar ou baixar o código e testá-los com segurança antes do tempo de execução. |
4. | Você pode usar ferramentas geradas em XML para gerar XML |
Aqui estão nossos layouts para este projeto:
(a). 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. |
(b). content_main.xml
Este layout é incluído em sua atividade_main.xml.
Definimos aqui nossos widgets UI.
<?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>
PASSO 6 : Nosso Fragmento
xml
- Nosso "fragmento" layout.
- Deve conter um CardView com visualização de texto.
<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>
PASSO 7 : Como Funcionar
- Faça o download do projeto.
- Você receberá um arquivo zipado, extraia-o.
- Abra o Estúdio Android.
- Agora feche, qualquer projeto já aberto
- Na barra de menu clique em **Arquivo >Novo > Projeto de Importação***
- Agora escolha uma pasta de destino, de onde você quer importar o projeto.
- Escolha um projeto Android.
Agora clique em "**OK***". - Feito, agora edite-o...
Resultado
Aqui está o que você recebe:
PASSO 8 : Mais
Recurso | Link |
---|---|
GitHub Browse | Browse |
GitHub Download Link | Baixar |
Passagem de dados do Android: ListView to ListView
Às vezes você pode querer passar dados de uma visualização de lista em Atividade
A para ListView em, digamos, Atividade
B. Bem, este é o propósito deste tutorial.
Teremos duas Atividades, cada uma com uma ListView. Clicamos em um botão e passamos os dados da primeira atividade
para a segunda atividade
, a primeira vista à esquerda para a segunda vista da lista.
Scripts de Gradle
Modifiquemos nosso nível de aplicação de arquivo `build.gradle'.
1. Build.gradle
- Especificamos as dependências sob o fechamento das dependências.
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
Teremos três layouts:
1. activity_main.xml
- Este layout será inflado na IU para nossa principal atividade.
- Ele manterá o layout
content_main.xml
. - Ele contém nossas definições de barra de aplicativos e barra de ferramentas.
<?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
- Isto conterá nossa primeira lista de visualização.
- Este layout é incluído dentro do
activity_main.xml
.
<?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
- Este layout será inflado na IU para nossa segunda `atividade'.
- Ele manterá a segunda
atividade
.
<?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>
CLASSES JAVA
Aqui estão nossas aulas de java:
**1. EspaçonavesCollection***
- Esta é uma classe que nos ajudará a transferir nossa ArrayList da primeira para a segunda
atividade'. Esta classe será serializada, transferida e depois desserializada na segunda
atividade`.
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***
- Esta é nossa segunda classe de
atividade
. - Receberá um arrailista seriado contendo nossas naves espaciais e o deserializará e exibirá na segunda visualização da lista.
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***
- Nossa classe MainActivity.
- Nossos dados do arraylist serão transferidos daqui para a segunda
atividade
quando o botão de ação flutuante for clicado.
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);
}
}
Resultado
Aqui está o que você recebe quando executa o projeto:
Download
Código para download aqui.