Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 18
Aula 18
Navegação
entre
Janelas
• Como
projetar
estratégias
efe>vas
e
prá>cas
de
navegação
entre
janelas?
• O
que
é
a
barra
de
ações?
• Que
>po
de
opções
podemos
inserir
na
barra
de
ações?
• Quais
opções
devem
ser
mostradas
na
barra
de
ações?
• Como
implementar
navegação
horizontal
entre
fragmentos?
• Como
voltar
à
a>vidade
mãe
a
par>r
da
a>vidade
filha?
A
Barra
de
Ações
• A
barra
de
ações
é
uma
área
no
topo
da
tela
que
geralmente
persiste
entre
a>vidades.
Ela
possui
vários
propósitos:
– Facilita
o
acesso
a
ações
importantes.
– Suporta
a
consistência
de
navegação
entre
apps.
– Reduz
confusões
colocando
ações
menos
importantes
em
um
menu
secundário.
– Provê
um
espaço
dedicado
a
dar
uma
"iden>dade"
à
aplicação.
Exemplos
de
Barras
de
Ações
A barra de açõe
s
possui quatro
elementos.
Quais são eles?
1. Ícone
da
aplicação
2. Controle
de
visão:
menu
extra,
Ytulo
está>co,
etc.
3. Botões
de
ações:
esses
são
os
botões
mais
importantes,
aos
quais
o
usuário
deveria
ter
pronto
acesso.
4. Ações
secundárias:
componentes
secundários
podem
ficar
nessa
caixinha
expandível.
Desabilitando
a
Barra
de
Ações
Visão
normal
Desabilitando
em
Java
Visão normal
@Override
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.ac>vity_main);
Ac>onBar
ac>onBar
=
getAc>onBar();
ac>onBar.hide();
}
Desabilitando
em
XML
Visão normal
<ac>vity
android:name=".MainAc>vity"
android:label="@string/>tle_ac>vity_main"
android:theme="@android:style/Theme.Holo.NoAc9onBar"
>
<intent‐filter>
<ac>on
android:name="android.intent.ac>on.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER"
/>
</intent‐filter>
</ac>vity>
Criando
um
Menu
• Android
já
vem
com
<menu
xmlns:android=
"hsp://schemas.android.com/apk/res/android">
uma
pasta
para
<item
android:id="@+id/menu_1"
android:>tle="Item
1"
layouts
de
menu:
android:orderInCategory="100"
android:showAsAc>on="never"
/>
<item
android:id="@+id/menu_2"
android:>tle="Item
2"
android:orderInCategory="100"
android:showAsAc>on="never"
/>
<item
android:id="@+id/menu_3"
android:>tle="Item
3"
android:orderInCategory="100"
android:showAsAc>on="never"
/>
</menu>
Criando
um
Menu
• Android
já
vem
com
public
class
MainAc>vity
extends
Ac>vity
{
<menu
xmlns:android=
"hsp://schemas.android.com/apk/res/android">
uma
pasta
para
@Override
<item
android:id="@+id/menu_1"
android:>tle="Item
1"
layouts
de
menu:
public
void
onCreate(Bundle
savedInstanceState)
{
android:orderInCategory="100"
super.onCreate(savedInstanceState);
android:showAsAc>on="never"
/>
setContentView(R.layout.ac>vity_main);
<item
android:id="@+id/menu_2"
}
android:>tle="Item
2"
android:orderInCategory="100"
Lembre-se de ativar o menu!
android:showAsAc>on="never"
/>
@Override
<item
android:id="@+id/menu_3"
public
boolean
onCreateOp9onsMenu(Menu
menu)
{
android:>tle="Item
3"
android:orderInCategory="100"
getMenuInflater().inflate(R.menu.ac9vity_main,
menu);
android:showAsAc>on="never"
/>
return
true;
</menu>
er o
}
Pode-se mov
a
}
menu para
ões.
barra de aç
Colocando
ícones
na
barra
de
ações
<menu
xmlns:android=
"hsp://schemas.android.com/apk/res/android"
>
Onde ficam
<item
android:id="@+id/menu_1"
os ícones?
android:orderInCategory="100"
android:icon="@drawable/icon_a"
android:showAsAc9on="ifRoom|withText"
android:>tle="Item
1"/>
O que
<item
significa
android:id="@+id/menu_2"
android:orderInCategory="100"
esse texto?
android:icon="@drawable/icon_b"
android:showAsAc>on="ifRoom|withText"
android:>tle="Item
2"/>
<item
android:id="@+id/menu_3"
android:orderInCategory="100"
android:icon="@drawable/icon_c"
android:showAsAc>on="ifRoom|withText"
android:>tle="Item
3"/>
</menu>
Drawable
Resources
Paisagem
Retrato
qu e a c o n t ece
O
s os
se mudamo
pi
ícones de hd
para ldpi?
Drawable
Resources
<menu
xmlns:android=
"hsp://schemas.android.com/apk/res/android"
>
<item
Paisagem
android:id="@+id/menu_1"
android:orderInCategory="100"
android:icon="@drawable/icon_a"
android:showAsAc>on="ifRoom|withText"
android:>tle="Item
1"/>
<item
android:id="@+id/menu_2"
Retrato
android:orderInCategory="100"
android:icon="@drawable/icon_b"
android:showAsAc>on="ifRoom|withText"
android:>tle="Item
2"/>
<item
android:id="@+id/menu_3"
qu e a c o n t eceu
O
com o outro
android:orderInCategory="100"
android:icon="@drawable/icon_c"
ssa
android:showAsAc9on="ifRoom|withText"
botão de no
android:9tle="Item
3"/>
barra?
</menu>
Menu
Overflow
<menu
xmlns:android=
"hsp://schemas.android.com/apk/res/android"
>
<item
android:id="@+id/menu_1"
android:orderInCategory="100"
android:icon="@drawable/icon_a"
android:showAsAc>on="ifRoom|withText"
android:>tle="Item
1"/>
<item
android:id="@+id/menu_2"
android:orderInCategory="100"
android:icon="@drawable/icon_b"
android:showAsAc>on="ifRoom|withText"
android:>tle="Item
2"/>
<item
android:id="@+id/menu_3"
android:orderInCategory="100"
android:icon="@drawable/icon_c"
android:showAsAc9on="ifRoom|withText"
android:9tle="Item
3"/>
</menu>
Forçando
a
Barra
<menu
xmlns:android=
• É
possível
forçar
a
"hsp://schemas.android.com/apk/res/android"
>
<item
colocação
de
itens
na
android:id="@+id/menu_1"
android:orderInCategory="100"
barra
de
ações.
android:icon="@drawable/icon_a"
android:showAsAc>on="always"
– Mas
o
resultado
android:>tle="Item
1"/>
<item
gráfico
final
pode
não
android:id="@+id/menu_2"
ficar
bom.
android:orderInCategory="100"
android:icon="@drawable/icon_b"
android:showAsAc>on="always"
android:>tle="Item
2"/>
<item
android:id="@+id/menu_3"
android:orderInCategory="100"
android:icon="@drawable/icon_c"
android:showAsAc>on="always"
android:>tle="Item
3"/>
</menu>
F.I.T.
• É
preciso
escolher
com
cuidado
quais
itens
ficam
expostos
na
barra
de
ações:
– Frequente:
itens
usados
com
frequência,
por
exemplo,
mais
de
dez
vezes
por
tela.
– Importante:
itens
que
são
importantes
para
a
aplicação,
e
que
o
usuário
deveria
ser
capaz
de
encontrar
com
facilidade.
– Típico:
itens
comuns
nesse
>po
de
aplicação,
por
exemplo,
"compar>lhar
fotos".
Lindando
com
os
Eventos
• A
barra
de
ações
é
um
@Override
public
boolean
onOp>onsItemSelected(MenuItem
item)
{
menu
normal.
switch
(item.getItemId())
{
case
R.id.menu_1:
Log.v("Menu",
"Menu
selec>onado
=
1");
@Override
return
true;
public
boolean
onCreateOp>onsMenu(Menu
menu)
{
case
R.id.menu_2:
MenuInflater
inflater
=
getMenuInflater();
Log.v("Menu",
"Menu
selec>onado
=
2");
inflater.inflate(R.menu.ac>vity_main,
menu);
return
true;
return
true;
case
R.id.menu_3:
}
Log.v("Menu",
"Menu
selec>onado
=
3");
return
true;
case
R.id.menu_4:
Log.v("Menu",
"Menu
selec>onado
=
4");
return
true;
case
R.id.menu_5:
Log.v("Menu",
"Menu
selec>onado
=
5");
return
true;
default:
;
}
return
false;
}
Visões
de
Ação
• Existem
alguns
componentes
predefinidos
que
podem
ser
inseridos
na
barra
de
ações:
<menu
xmlns:android="hsp://schemas.android.com/apk/res/android"
>
<item
android:id="@+id/menu_search"
android:ac>onViewClass="android.widget.SearchView"
android:icon="@drawable/icon_qst"
android:showAsAc>on="ifRoom|collapseAc>onView"
android:>tle="Busque
aqui"/>
</menu>
Visões
de
Ação
• Existem
alguns
componentes
predefinidos
que
podem
ser
inseridos
na
barra
de
ações:
<menu
xmlns:android="hsp://schemas.android.com/apk/res/android"
>
<item
android:id="@+id/menu_search"
android:ac>onViewClass="android.widget.SearchView"
android:icon="@drawable/icon_qst"
android:showAsAc>on="ifRoom|collapseAc>onView"
android:>tle="Busque
aqui"/>
</menu>
Expandindo
e
Retraindo
• Se
o
elemento
de
ação
é
retrá>l,
então
é
possível
tratar
eventos
de
expansão
e
retracção.
• Cada
elemento
desses
possui
um
botão
"up",
em
geral
disponível
no
ícone
da
aplicação.
– Esse
botão
retrai
o
elemento
gráfico.
• Clicando‐se
no
botão,
ele
é
expandido.
Eventos
de
Expansão
public
boolean
onCreateOp>onsMenu(Menu
menu)
{
MenuInflater
inflater
=
getMenuInflater();
inflater.inflate(R.menu.ac>vity_main,
menu);
MenuItem
search_item
=
menu.findItem(R.id.menu_search);
search_item.setOnAc>onExpandListener(new
OnAc>onExpandListener()
{
public
boolean
onMenuItemAc>onCollapse(MenuItem
item)
{
Log.v("DATA",
"Collapsed");
return
true;
}
public
boolean
onMenuItemAc>onExpand(MenuItem
item)
{
Log.v("DATA",
"Expanded");
return
true;
}
});
return
true;
}
Fichários
• A
barra
de
ações
pode
ser
usada
para
agrupar
abas
de
navegação.
• Android
se
encarrega
de
dispor
as
abas
da
forma
mais
conveniente,
dependendo
do
>po
do
layout:
retrato
ou
paisagem.
NAVIGATION_MODE_TABS
public
class
TabAc>vity
extends
Ac>vity
{
@Override
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
final
Ac>onBar
ac>onBar
=
getAc>onBar();
ac>onBar.setNaviga>onMode(Ac>onBar.NAVIGATION_MODE_TABS);
Ac>onBar.TabListener
tabListener
=
new
Ac>onBar.TabListener()
{
public
void
onTabSelected(Ac>onBar.Tab
tab,
FragmentTransac>on
})
{}
public
void
onTabUnselected(Ac>onBar.Tab
tab,
FragmentTransac>on
})
{}
public
void
onTabReselected(Ac>onBar.Tab
tab,
FragmentTransac>on
})
{}
};
for
(int
i
=
0;
i
<
3;
i++)
{
ac>onBar.addTab(ac>onBar.newTab().setText("Tab
"
+
(i
+
1))
.setTabListener(tabListener));
}
}
}
NAVIGATION_MODE_LIST
@Override
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
final
Ac>onBar
ac>onBar
=
getAc>onBar();
ac>onBar.setNaviga>onMode(Ac>onBar.NAVIGATION_MODE_LIST);
ac>onBar.setListNaviga>onCallbacks(
new
ArrayAdapter(ac>onBar.getThemedContext(),
android.R.layout.simple_list_item_1,
android.R.id.text1,
new
String[]
{
"Tab
1",
"Tab
2",
"Tab
3"
}),
new
Ac>onBar.OnNaviga>onListener()
{
public
boolean
onNaviga>onItemSelected(int
posi>on,
long
id)
{
return
true;
}
});
}
Planejando
Janelas
• Quais
técnicas
podemos
usar
para
planejar
as
janelas
de
uma
aplicação?
• Que
fatores
precisam
ser
levados
em
consideração?
• Quais
recursos
notacionais
podemos
usar
para
definir
as
telas
e
suas
inter‐relações?
Construindo
janelas
mais
complexas
Múltiplos tabs
Construa uma aplicação com
três guias de fichário. Cada
uma dessas guias deve abrir
um fragmento na parte
inferior da janela.
A atividade principal
agrupará três telas. A
primeira tela contém botões
para outras duas atividades.
Uma dessas atividades é
específica para mostrar
imagens.
A outra atividade mostrará
uma coleção de 100
fragmentos.
Layout
da
parte
inferior
fragment_sec>on_dummy.xml
<TextView
xmlns:android=
"hsp://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="24sp"
android:padding="32dp"
/>
Precisamos
agora escrever
o código do
fragmento.
Fragmento
da
parte
inferior
Para que
DummySec>onFragment.java
serve essa
constante?
public
class
DummySec>onFragment
extends
Fragment
{
Nosso
Adaptador
public
class
AppSec>onsPagerAdapter
extends
FragmentPagerAdapter
{
public
AppSec>onsPagerAdapter(FragmentManager
fm)
{
super(fm);
Para que serv
}
e
cada um dess
@Override
es
métodos?
public
Fragment
getItem(int
i)
{
Fragment
fragment
=
new
DummySec>onFragment();
Bundle
args
=
new
Bundle();
args.putInt(DummySec>onFragment.ARG_SECTION_NUMBER,
i
+
1);
fragment.setArguments(args);
á
O que acontecer
return
fragment;
quando
}
alterarmos a
@Override
guia em foco?
public
int
getCount()
{
return
3;
}
@Override
Como será a
public
CharSequence
getPageTitle(int
posi>on)
{
atividade
return
String.valueOf(posi>on
+
1);
principal desse
}
exemplo?
}
MainAc>vity.java
A
A>vidade
Principal
public
class
MainAc>vity
extends
FragmentAc>vity
implements
Ac9onBar.TabListener
{
AppSec>onsPagerAdapter
mAppSec>onsPagerAdapter;
O que seria
ViewPager
mViewPager;
essa
interface?
@Override
public
void
onCreate(Bundle
savedInstanceState)
{…}
Quais
métodos ela
}
teria?
E esse objeto,
o que seria
ele?
Criando
a
A>vidade
@Override
Precisamos
public
void
onCreate(Bundle
savedInstanceState)
{
definir esse
super.onCreate(savedInstanceState);
layout.
setContentView(R.layout.view_pager);
mAppSec>onsPagerAdapter
=
new
AppSec>onsPagerAdapter(
getSupportFragmentManager());
O que esse
final
Ac>onBar
ac>onBar
=
getAc>onBar();
có digo faz?
ac9onBar.setHomeBu`onEnabled(false);
ac>onBar.setNaviga>onMode(Ac>onBar.NAVIGATION_MODE_TABS);
mViewPager
=
(ViewPager)
findViewById(R.id.pager);
mViewPager.setAdapter(mAppSec>onsPagerAdapter);
mViewPager
.setOnPageChangeListener(new
ViewPager.SimpleOnPageChangeListener()
{
@Override
public
void
onPageSelected(int
posi>on)
{
ac>onBar.setSelectedNaviga>onItem(posi>on);
}
});
for
(int
i
=
0;
i
<
mAppSec>onsPagerAdapter.getCount();
i++)
{
Falta implementar os
ac>onBar.addTab(ac>onBar.newTab()
métodos de
.setText(mAppSec>onsPagerAdapter.getPageTitle(i))
TabListener. Vocês
.setTabListener(this));
lembram quais são?
}
}
MainAc>vity.java
Criando
a
A>vidade
@Override
Precisamos
public
void
onCreate(Bundle
savedInstanceState)
{
definir esse
super.onCreate(savedInstanceState);
layout.
setContentView(R.layout.view_pager);
mAppSec>onsPagerAdapter
=
new
AppSec>onsPagerAdapter(
getSupportFragmentManager());
<android.support.v4.view.ViewPager
final
Ac>onBar
ac>onBar
=
getAc>onBar();
xmlns:android="h#p://schemas.android.com/apk/res/android"
ac>onBar.setHomeBusonEnabled(false);
android:id="@+id/pager"
ac>onBar.setNaviga>onMode(Ac>onBar.NAVIGATION_MODE_TABS);
mViewPager
=
(ViewPager)
findViewById(R.id.pager);
android:layout_width="match_parent"
mViewPager.setAdapter(mAppSec>onsPagerAdapter);
android:layout_height="match_parent"
/>
mViewPager
view_pager.xml
.setOnPageChangeListener(new
ViewPager.SimpleOnPageChangeListener()
{
@Override
public
void
onPageSelected(int
posi>on)
{
ac>onBar.setSelectedNaviga>onItem(posi>on);
}
});
for
(int
i
=
0;
i
<
mAppSec>onsPagerAdapter.getCount();
i++)
{
Falta implementar os
ac>onBar.addTab(ac>onBar.newTab()
métodos de
.setText(mAppSec>onsPagerAdapter.getPageTitle(i))
TabListener. Vocês
.setTabListener(this));
lembram quais são?
}
}
MainAc>vity.java
Eventos
de
Guia
• A
barra
de
ações
disponibiliza
uma
interface
para
escutar
"eventos
de
guia".
– Esses
eventos
ocorrem
quando
uma
guia
é
selecionada.
– A
interface
disponibiliza
os
seguintes
métodos:
• onTabSelected.
Para que serv
• onTabReselected.
e
cada um dess
es
• onTabUnselected.
métodos?
Como será a
implementação
desses métodos
no exemplo?
Mudanças
entre
abas
public
class
MainAc>vity
extends
FragmentAc>vity
implements
Ac>onBar.TabListener
{
// ...
public
void
onTabReselected(Tab
tab,
FragmentTransac>on
})
{
}
public
void
onTabSelected(Tab
tab,
FragmentTransac>on
})
{
mViewPager.setCurrentItem(tab.getPosi>on());
}
public
void
onTabUnselected(Tab
tab,
FragmentTransac>on
})
{
}
}
MainAc>vity.java
Navegação
Ver>cal
• O
programa
anterior
demonstrou
a
navegação
horizontal
entre
janelas.
– Nesse
caso,
as
janelas
estão
no
mesmo
nível
da
hierarquia
de
janelas.
• Existe
também
a
navegação
ver>cal.
– Uma
a>vidade
chama
a
outra.
– Nesse
caso,
a>vidades
são
empilhadas.
Nós já vimos no Que Como implementar
curso exemplos de exemplos esse tipo de
navegação vertical. nós vimos? navegação?
Lançando
a>vidades
O
Fragmento
que
dispara
A>vidades
public
View
onCreateView(LayoutInflater
inflater,
ViewGroup
container,
Bundle
savedInstanceState)
{
View
rootView
=
inflater.inflate(R.layout.fragment_sec>on_launchpad,
container,
false);
rootView.findViewById(R.id.demo_collec>on_buson).setOnClickListener(
new
View.OnClickListener()
{
Afinal, como
public
void
onClick(View
view)
{
ativaremos
Log.v("FRAME",
"Open
a
new
ac>vity
here.");
esse
}
fragmento?
});
rootView.findViewById(R.id.demo_external_ac9vity).setOnClickListener(
new
View.OnClickListener()
{
public
void
onClick(View
view)
{
Intent
externalAc>vityIntent
=
new
Intent(Intent.ACTION_PICK);
externalAc>vityIntent.setType("image/*");
externalAc>vityIntent
O que é isso?
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startAc>vity(externalAc>vityIntent);
}
Quando esse
});
botão for
return
rootView;
selecionado, qual
}
atividade será
}
lançada?
LaunchpadSec>onFragment
.java
Selecionando
entre
Fragmentos
public
class
AppSec>onsPagerAdapter
extends
FragmentPagerAdapter
{
//...
@Override
public
Fragment
getItem(int
i)
{
switch
(i)
{
case
0:
return
new
LaunchpadSec>onFragment();
default:
Fragment
fragment
=
new
DummySec>onFragment();
Bundle
args
=
new
Bundle();
args.putInt(DummySec>onFragment.ARG_SECTION_NUMBER,
i
+
1);
fragment.setArguments(args);
return
fragment;
Explique a
}
lógica desse
}
código.
}
AppSec>onsPagerAdapter.java
Um
Pequeno
Desafio:
public
class
AppSec>onsPagerAdapter
extends
FragmentPagerAdapter
{
//...
@Override
public
Fragment
getItem(int
i)
{
switch
(i)
{
case
0:
return
new
LaunchpadSec>onFragment();
default:
Fragment
fragment
=
new
DummySec>onFragment();
Bundle
args
=
new
Bundle();
args.putInt(DummySec>onFragment.ARG_SECTION_NUMBER,
i
+
1);
fragment.setArguments(args);
Modifique o
a s Queremos enha o
return
fragment;
t e x t o d
d a " e M a n t
d u a s últimas "segun r a m a E s s e desafio
}
p r o g
. "t e rceira" aci- fica como
telas "i n t e r n
}
páginas. exercício.
onalizável".
}
AppSec>onsPagerAdapter.java
public
class
LaunchpadSec>onFragment
extends
Fragment
{
O
Fragmento
que
dispara
A>vidades
public
View
onCreateView(LayoutInflater
inflater,
ViewGroup
container,
Bundle
savedInstanceState)
{
View
rootView
=
inflater.inflate(R.layout.fragment_sec>on_launchpad,
container,
false);
rootView.findViewById(R.id.demo_collec>on_buson).setOnClickListener(
new
View.OnClickListener()
{
public
void
onClick(View
view)
{
Log.v("FRAME",
"Open
a
new
ac>vity
here.");
}
});
Queremos
rootView.findViewById(R.id.demo_external_ac>vity).setOnClickListener(
new
View.OnClickListener()
{
implementar
public
void
onClick(View
view)
{
uma nova
Intent
externalAc>vityIntent
=
new
Intent(Intent.ACTION_PICK);
atividade aqui.
externalAc>vityIntent.setType("image/*");
externalAc>vityIntent
mbram
Vocês le
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
c o mo lançar uma
startAc>vity(externalAc>vityIntent);
a ti vidade
}
});
específica?
return
rootView;
}
}
LaunchpadSec>onFragment
.java
O
Fragmento
que
dispara
A>vidades
rootView.findViewById(R.id.demo_collec>on_buson).setOnClickListener(
new
View.OnClickListener()
{
public
void
onClick(View
view)
{
Intent
intent
=
new
Intent(getAc>vity(),
Collec>onDemoAc>vity.class);
startAc>vity(intent);
}
});
Junto com todas
Qual atividade Precisamos as suas telas. E
que está sendo implementá-la! com todos os
lançada aqui?
fragmentos.
LaunchpadSec>onFragment
.java
Precisamos
A
Nova
A>vidade
implementar
esse layout.
public
class
Collec>onDemoAc>vity
extends
FragmentAc>vity
{
E também
DemoCollec>onPagerAdapter
mDemoCollec>onPagerAdapter;
esse
adaptador.
ViewPager
mViewPager;
O que esse
public
void
onCreate(Bundle
savedInstanceState)
{
comando está
super.onCreate(savedInstanceState);
fazendo?
setContentView(R.layout.ac9vity_collec9on_demo);
mDemoCollec>onPagerAdapter
=
new
DemoCollec9onPagerAdapter(
getSupportFragmentManager());
final
Ac>onBar
ac>onBar
=
getAc>onBar();
ac>onBar.setDisplayHomeAsUpEnabled(true);
o
mViewPager
=
(ViewPager)
findViewById(R.id.pager);
Lembre-se d
mViewPager.setAdapter(mDemoCollec>onPagerAdapter);
manifesto.
}
}
Collec>onDemoAc>vity.java
<manifest
xmlns:android="hsp://schemas.android.com/apk/res/android"
package="com.dcc052.aula18"
Atualizando
o
Manifesto
android:versionCode="1"
android:versionName="1.0"
>
<uses‐sdk
android:minSdkVersion="16"
android:targetSdkVersion="15"
/>
<applica>on
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
>
<ac>vity
android:name=".MainAc>vity"
uiOp>ons="splitAc>onBarWhenNarrow"
android:label="@string/>tle_ac>vity_main"
>
<intent‐filter>
<ac>on
android:name="android.intent.ac>on.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER"
/>
</intent‐filter>
</ac>vity>
<ac9vity
android:name=".Collec9onDemoAc9vity"
android:label="@string/demo_collec9on"
/>
</applica>on>
</manifest>
AndroidManifest.xml
ac>vity_collec>on_demo.xml
Layout
com
Faixa
de
Título
<android.support.v4.view.ViewPager
xmlns:android="hsp://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
DemoCollec>onPagerAdapter.java
O
Segundo
Adaptador
do
Dia
public
class
DemoCollec>onPagerAdapter
extends
FragmentPagerAdapter
{
public
DemoCollec>onPagerAdapter(FragmentManager
fm)
{
super(fm);
}
@Override
public
Fragment
getItem(int
i)
{
Precisamos
Fragment
fragment
=
new
DemoObjectFragment();
agora criar o
f r agmento.
Bundle
args
=
new
Bundle();
args.putInt(DemoObjectFragment.ARG_OBJECT,
i
+
1);
fragment.setArguments(args);
return
fragment;
Como seria o
}
seu layout?
@Override
public
int
getCount()
{return
100;
}
@Override
public
CharSequence
getPageTitle(int
posi>on)
{
return
"OBJECT
"
+
(posi>on
+
1);
}
}
Layout
do
novo
fragmento
<TextView
xmlns:android="hsp://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
to
android:layout_height="match_parent"
E o fragmen
e
android:gravity="center"
propriament
android:textSize="128sp"
dito, como
android:padding="32dp"
/>
seria?
fragment_collec>on_object.xml
O
Úl>mo
Fragmento
public
class
DemoObjectFragment
extends
Fragment
{
public
sta>c
final
String
ARG_OBJECT
=
"object";
@Override
public
View
onCreateView(LayoutInflater
inflater,
ViewGroup
container,
Bundle
savedInstanceState)
{
View
rootView
=
inflater.inflate(R.layout.fragment_collec>on_object,
container,
false);
Bundle
args
=
getArguments();
((TextView)
rootView.findViewById(android.R.id.text1)).setText(Integer
.toString(args.getInt(ARG_OBJECT)));
return
rootView;
}
Possivelmen
te Como voltar para
}
agora temos a atividade
ão
DemoObjectFragment.java
uma aplicaç principal a partir
funcional. da secundária?
Navegando
de
Volta
• É
possível
usar
o
ícone
da
aplicação
como
o
"back‐bu#on".
– Essa
é
uma
propriedade
da
barra
de
ações.
public
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.ac>vity_collec>on_demo);
mDemoCollec>onPagerAdapter
=
new
DemoCollec>onPagerAdapter(
getSupportFragmentManager());
final
Ac>onBar
ac>onBar
=
getAc>onBar();
ac>onBar.setDisplayHomeAsUpEnabled(true);
mViewPager
=
(ViewPager)
findViewById(R.id.pager);
mViewPager.setAdapter(mDemoCollec>onPagerAdapter);
}
Collec>onDemoAc>vity.java
Collec>onDemoAc>vity.java
Encontrando
o
caminho
de
volta
@Override
public
boolean
onOp>onsItemSelected(MenuItem
item)
{
Esse teste é
switch
(item.getItemId())
{
verdadeiro quando
a atividade mãe
case
android.R.id.home:
está em outra
Intent
upIntent
=
new
Intent(this,
MainAc>vity.class);
aplicação.
if
(NavU9ls.shouldUpRecreateTask(this,
upIntent))
{
TaskStackBuilder.from(this).addNextIntent(upIntent).startAc>vi>es();
finish();
}
else
{
NavU>ls.navigateUpTo(this,
upIntent);
}
return
true;
}
return
super.onOp>onsItemSelected(item);
}
DemoCollec>onPagerAdapter.java
Salvando
Memória
public
class
DemoCollec>onPagerAdapter
extends
FragmentPagerAdapter
{
public
DemoCollec>onPagerAdapter(FragmentManager
fm)
{
super(fm);
}
@Override
Essa classe
public
Fragment
getItem(int
i)
{
consome
Fragment
fragment
=
new
DemoObjectFragment();
muita
r
Bundle
args
=
new
Bundle();
memória. Po
args.putInt(DemoObjectFragment.ARG_OBJECT,
i
+
1);
que?
fragment.setArguments(args);
return
fragment;
O coletor de
}
lixo não
@Override
ajuda, nesse
public
int
getCount()
{return
100;
}
caso?
@Override
public
CharSequence
getPageTitle(int
posi>on)
{
return
"OBJECT
"
+
(posi>on
+
1);
}
}
DemoCollec>onPagerAdapter.java
Salvando
Memória
public
class
DemoCollec>onPagerAdapter
extends
FragmentStatePagerAdapter
{
public
DemoCollec>onPagerAdapter(FragmentManager
fm)
{
super(fm);
}
@Override
public
Fragment
getItem(int
i)
{
Fragment
fragment
=
new
DemoObjectFragment();
Bundle
args
=
new
Bundle();
args.putInt(DemoObjectFragment.ARG_OBJECT,
i
+
1);
fragment.setArguments(args);
return
fragment;
}
Esse
novo
adaptador
@Override
destrói
o
fragmento
public
int
getCount()
{return
100;
}
corrente,
quando
o
@Override
public
CharSequence
getPageTitle(int
posi>on)
{
usuário
navega
para
return
"OBJECT
"
+
(posi>on
+
1);
outra
página.
}
}