Você está na página 1de 52

Programação
para
a
Plataforma
Android
–
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
{




public
sta>c
final
String
ARG_SECTION_NUMBER
=
"sec>on_number";
 O que esse


código faz?


@Override



public
View
onCreateView(LayoutInflater
inflater,
ViewGroup
container,







Bundle
savedInstanceState)
{





View
rootView
=
inflater.inflate(R.layout.fragment_sec>on_dummy,









container,
false);





Bundle
args
=
getArguments();





((TextView)
rootView.findViewById(android.R.id.text1)).setText(getString(









R.string.dummy_sec9on_text,
args.getInt(ARG_SECTION_NUMBER)));





return
rootView;



}

}

FragmentPagerAdapter

•  Existe
uma
classe
própria
para
controlar
telas

com
múl>plos
fragmentos:

FragmentPagerAdapter.

•  Essa
classe
possui
três
métodos
muito
úteis:

–  Fragment getItem(int).

–  int getCount().

–  CharSequence getPageTitle(int
position).
 mos criar
Precisa Quanto retornará
um adaptador getCount em
.
para a aplicação nosso exemplo?
AppSec>onsPagerAdapter.java


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


Botões para atividades


Crie um novo layout, e o
associe à primeira guia.
Esse layout deverá ter
dois botões, e cada botão
irá abrir uma atividade
diferente.
Layout
para
os
botões

<FrameLayout
xmlns:android="hsp://schemas.android.com/apk/res/android"





android:layout_width="match_parent"





android:layout_height="match_parent"
>





<LinearLayout









android:layout_width="wrap_content"









android:layout_height="wrap_content"









android:layout_gravity="center"









android:orienta>on="ver>cal"
>









<Buson













android:id="@+id/demo_collec>on_buson"













android:layout_width="300dp"













android:layout_height="wrap_content"













android:layout_marginBosom="16dp"













android:text="@string/demo_collec>on"
/>









<Buson













android:id="@+id/demo_external_ac>vity"













android:layout_width="match_parent"













android:layout_height="wrap_content"













android:text="@string/demo_external_ac>vity"
/>





</LinearLayout>

</FrameLayout>
 fragment_sec>on_launchpad.xml

public
class
LaunchpadSec9onFragment
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()
{
 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.PagerTitleStrip
 Como seria o










android:id="@+id/pager_>tle_strip"
 adaptador








android:layout_width="match_parent"
 desse








android:layout_height="wrap_content"
 fragmento?








android:layout_gravity="top"









android:background="#33b5e5"









android:textColor="#fff"









android:paddingTop="4dp"









android:paddingBosom="4dp"
/>


</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.



}

}


Você também pode gostar

  • Aula 20
    Aula 20
    Documento46 páginas
    Aula 20
    Damn
    Ainda não há avaliações
  • Aula 15
    Aula 15
    Documento17 páginas
    Aula 15
    Damn
    Ainda não há avaliações
  • Aula 17
    Aula 17
    Documento34 páginas
    Aula 17
    Damn
    Ainda não há avaliações
  • Aula 6
    Aula 6
    Documento79 páginas
    Aula 6
    Damn
    Ainda não há avaliações