Você está na página 1de 49

Programação
para
a
Plataforma
Android
–
Aula
16


Fragmentos

•  O
que
são
fragmentos

•  Como
combinar
múl?plas
visões
em
uma
única
tela?

•  Como
lidar
com
telas
de
tamanhos
variados?

•  Como
modificar
a
visão
de
uma
a?vidade
durante
a
sua
execução?

•  Como
criar
caixas
de
diálogo
itera?vas?

•  Criando
uma
aplicação
para
ler
livros.

Múl?plas
a?vidades
na
tela

•  Até
aqui,
sempre
trabalhamos
com
uma

a?vidade
por
tela.

–  De
fato,
tecnicamente
não
é
possível
combinar

múl?plas
a?vidades
em
uma
mesma
tela.

–  Por
outro
lado,
isso
seria
bastante
desejável.

Por que seria
interessante
combinarmos d
uas
atividades em u
ma
mesma tela?
Um
Exemplo


Você poderia
descrever cada
uma dessas
visões em XML?
Visões
e
Reuso

•  Em
princípio,
podemos

construir
visões
como
esta
à

direita
em
XML.

•  Porém,
se
cada
uma
das

visões
que
a
compõem
fossem

a?vidades
separadas,

teríamos
muito
mais
reúso.

–  Porquê?

Lembrem-se
dessas
Fragmentos
 vantagens, pois
vamos discutí-
las depois.
•  A
fim
de
separar
a?vidades
e
visões,
Android

3.0
(API
11)
trouxe
o
conceito
de
Fragmentos.

•  Fragmentos
são
“quase”
a?vidades.

•  Fragmentos
possuem
três
vantagens:

–  Aumentam
o
reúso
de
a?vidades.

–  Permitem
a
construção
de
telas
com
múl?plas

visões.

–  Permitem
a
modificação
da
visão
de
uma

a?vidade
em
tempo
de
execução.

Telas
de
Vários
Tamanhos

•  Fragmentos
podem
ser
programados
para

adaptar‐se
à
vários
?pos
de
telas.

Telas
de
Vários
Tamanhos

•  Desde
Android
3.0,
temos
também
infra‐
estrutura
para
criar
vários
?pos
de
layouts.

Caixa
de
Diálogo
Intera?va

Caixa de Diálogo:
•  Como
fragmentos
são

Crie uma caixa de diálogo com declarados.

dois botões: cancel e ok. •  Como
fragmentos
são

•  Escolhendo cancel, uma criados.

alerta com esse nome deve
aparecer na atividade •  Como
fragmentos

principal. trocam
informações

•  Escolhendo ok, uma alerta com
a?vidades.

com essa palavra deve ser
exibida pela atividade
principal.
Visão
geral
da
aplicação


Por onde
começamos?
Mas
antes
de
começarmos…

•  Fragmentos
existem

somente
a
par?r
de
Android

3.0
(API
11).

•  E
mesmo
assim,
são
pacotes

na?vos
somente
a
par?r
de

4.1
(API
16).

•  Entre
as
APIs
11
e
15,

fragmentos
são
uma

biblioteca
de
suporte.

–  Que
pode
ser
baixada
e

instalada
com
o
SDK.

Layout
da
A?vidade
Principal


Como é o
layout da
atividade
principal?
Layout
da
A?vidade
Principal

ac?vity_main.xml

<?xml
version="1.0"
encoding="u8‐8"?>

<LinearLayout
xmlns:android=













"h>p://schemas.android.com/apk/res/android"





android:layout_width="fill_parent"





android:layout_height="fill_parent"

Por agora, isso 



android:orienta?on="verEcal"
>

já devia ser
coisa muito 



<Bulon









android:id="@+id/bu>on_post_dialog"

simples 








android:layout_width="fill_parent"









android:layout_height="wrap_content"









android:text="@android:string/ok"
/>


</LinearLayout>

E como seria a
implementação
da atividade?
Layout
da
A?vidade
Principal

Aula16Ac?vity.xml

public
class
Aula16Ac?vity
extends
FragmentAc?vity

implements
OnClickListener
{




@Override



public
void
onCreate(Bundle
savedInstanceState)
{

Por agora, isso 



super.onCreate(savedInstanceState);

já devia ser 



setContentView(R.layout.main);

coisa muito 



Bulon
bulonPostDialog
=









(Bulon)
findViewById(R.id.bulon_post_dialog);

simples 




bulonPostDialog.setOnClickListener(this);



}




public
void
onClick(View
v)
{












}
 Precisamos
agora

Existe qualquer criar
o
fragmento,

diferença para }
 e
“bolar”
um
jeito

uma atividade dele
“conversar”

normal? com
a
a?vidade.

Criando
um
Fragmento

Aula16Ac?vity.xml


public
void
onClick(View
v)
{





Confirma(onDialogFragment
confirma?onDialog
=









Confirma?onDialogFragment.newInstance(R.string.dialog_format_?tle);





confirma?onDialog.setConfirma(onDialogFragmentListener(this);





confirma?onDialog.show(getSupportFragmentManager(),
null);



}


Temos
de
 E
dar
um
jeito
da

 ais

Mas,
que
jeito
m
implementar
 a?vidade
e
do
 
um

esquisito
de
criar
essa
classe.
 fragmento
 ão

objeto.
Por
que
n
conversarem
 r

usar
um
construto
padrão?

Confirma?onDialogFragment.java

Builders

public
class
Confirma?onDialogFragment
extends
DialogFragment
{



...



public
sta(c
Confirma(onDialogFragment
newInstance(int
(tle)
{





Confirma(onDialogFragment
frag
=
new
Confirma(onDialogFragment();





Bundle
args
=
new
Bundle();





args.putInt("(tle",
(tle);





frag.setArguments(args);





return
frag;



}



...

}

Parla!

•  Precisamos
de
dar
um
jeito
do
fragmento
e
da

a?vidade
conversarem.

•  Podemos
fazer
isso
via
o
padrão
observer,
um

velho
conhecido
nosso.


Quando
vimos
o

padrão
observer

antes?

Ainda
os
observadores

public
class
Aula16Ac?vity
extends
FragmentAc?vity
implements
 Aula16Ac?vity.java





OnClickListener,
Confirma(onDialogFragmentListener
{



public
void
onPosi(veClick()
{





Toast.makeText(this,
android.R.string.ok,
Toast.LENGTH_LONG).show();



}



public
void
onNega(veClick()
{





Toast.makeText(this,
android.R.string.cancel,
Toast.LENGTH_LONG).show();



}


public
void
onClick(View
v)
{





Confirma?onDialogFragment
confirma?onDialog
=
Confirma?onDialogFragment

public
class
Confirma?onDialogFragment
extends
DialogFragment
{









.newInstance(R.string.dialog_format_?tle);



private
Confirma(onDialogFragmentListener
listener;





confirma?onDialog.setConfirma(onDialogFragmentListener(this);





confirma?onDialog.show(getSupportFragmentManager(),
null);



public
interface
Confirma(onDialogFragmentListener
{



}
 



public
void
onPosi(veClick();

}
 



public
void
onNega(veClick();



}




public
void
setConfirma(onDialogFragmentListener(







Confirma?onDialogFragmentListener
listener)
{





this.listener
=
listener;



}

Confirma?onDialogFragment.java
 }

O
Observado

public
class
Aula16Ac?vity
extends
FragmentAc?vity
implements





OnClickListener,
Confirma?onDialogFragmentListener
{



public
void
onPosi?veClick()
{





Toast.makeText(this,
android.R.string.ok,
Toast.LENGTH_LONG).show();



}



public
void
onNega?veClick()
{





Toast.makeText(this,
android.R.string.cancel,
Toast.LENGTH_LONG).show();



}


public
void
onClick(View
v)
{





Confirma?onDialogFragment
confirma?onDialog
=
Confirma?onDialogFragment

public
class
Confirma?onDialogFragment
extends
DialogFragment
{









.newInstance(R.string.dialog_format_?tle);



private
Confirma(onDialogFragmentListener
listener;





confirma?onDialog.setConfirma?onDialogFragmentListener(this);





confirma?onDialog.show(getSupportFragmentManager(),
null);



public
interface
Confirma(onDialogFragmentListener
{



}
 



public
void
onPosi(veClick();

}
 



public
void
onNega(veClick();



}




public
void
setConfirma(onDialogFragmentListener(







Confirma?onDialogFragmentListener
listener)
{





this.listener
=
listener;



}

}

O
Observador

public
class
Aula16Ac?vity
extends
FragmentAc?vity
implements





OnClickListener,
Confirma(onDialogFragmentListener
{



public
void
onPosi(veClick()
{





Toast.makeText(this,
android.R.string.ok,
Toast.LENGTH_LONG).show();



}



public
void
onNega(veClick()
{





Toast.makeText(this,
android.R.string.cancel,
Toast.LENGTH_LONG).show();



}


public
void
onClick(View
v)
{





Confirma?onDialogFragment
confirma?onDialog
=
Confirma?onDialogFragment

public
class
Confirma?onDialogFragment
extends
DialogFragment
{









.newInstance(R.string.dialog_format_?tle);



private
Confirma?onDialogFragmentListener
listener;





confirma?onDialog.setConfirma(onDialogFragmentListener(this);





confirma?onDialog.show(getSupportFragmentManager(),
null);



public
interface
Confirma?onDialogFragmentListener
{



}
 



public
void
onPosi?veClick();

}
 



public
void
onNega?veClick();



}




public
void
setConfirma?onDialogFragmentListener(







Confirma?onDialogFragmentListener
listener)
{





this.listener
=
listener;



}

}

public
class
Confirma?onDialogFragment
extends
DialogFragment
implements





DialogInterface.OnClickListener
{


Lidando
com
o
“Clique”



@Override



public
Dialog
onCreateDialog(Bundle
savedInstanceState)
{





int
?tle
=
getArguments().getInt("?tle");
 Que
padrão





return
new
AlertDialog.Builder(getAc?vity())









.setIcon(android.R.drawable.ic_dialog_alert).setTitle(?tle)
 de
projetos









.setPosi?veBulon(android.R.string.ok,
this)
 é
esse?









.setNega?veBulon(android.R.string.cancel,
this).create();



}




public
void
onClick(DialogInterface
dialog,
int
which)
{





if
(listener
!=
null)
{







switch
(which)
{







case
DialogInterface.BUTTON_POSITIVE:









listener.onPosi?veClick();
 E
o
que
a
a?vidade









break;
 principal
fará







default:
 quando
for









listener.onNega?veClick();
 no?ficada
do
evento







}





}
 que
escuta?



}

}
 Confirma?onDialogFragment.java

Toast!

Aula16Ac?vity.java


public
class
Aula16Ac?vity
extends
FragmentAc?vity
implements





OnClickListener,
Confirma?onDialogFragmentListener
{




public
void
onPosi?veClick()
{





Toast.makeText(this,
android.R.string.ok,
Toast.LENGTH_LONG).show();



}




public
void
onNega?veClick()
{





Toast.makeText(this,
android.R.string.cancel,
Toast.LENGTH_LONG).show();



}

}

Recapitulando
 Confirma?onDialogFragment.java

public
class
Confirma?onDialogFragment
extends
DialogFragment
implements





DialogInterface.OnClickListener
{



private
Confirma?onDialogFragmentListener
listener;



public
sta?c
Confirma?onDialogFragment
newInstance(int
?tle)
{

Aula16Ac?vity.java
 



Confirma?onDialogFragment
frag
=
new
Confirma?onDialogFragment();





Bundle
args
=
new
Bundle();

public
class
Aula16Ac?vity
extends
FragmentAc?vity
implements





args.putInt("?tle",
?tle);





OnClickListener,
Confirma?onDialogFragmentListener
{





frag.setArguments(args);





return
frag;



@Override



}



public
void
onCreate(Bundle
savedInstanceState)
{



public
interface
Confirma?onDialogFragmentListener
{





super.onCreate(savedInstanceState);





public
void
onPosi?veClick();





setContentView(R.layout.main);





public
void
onNega?veClick();





Bulon
bulonPostDialog
=
(Bulon)
findViewById(R.id.bulon_post_dialog);



}





bulonPostDialog.setOnClickListener(this);



public
void
setConfirma?onDialogFragmentListener(



}







Confirma?onDialogFragmentListener
listener)
{





this.listener
=
listener;



public
void
onClick(View
v)
{



}





Confirma?onDialogFragment
confirma?onDialog
=



@Override









Confirma?onDialogFragment



public
Dialog
onCreateDialog(Bundle
savedInstanceState)
{









.newInstance(R.string.dialog_format_?tle);





int
?tle
=
getArguments().getInt("?tle");





confirma?onDialog.setConfirma?onDialogFragmentListener(this);





return
new
AlertDialog.Builder(getAc?vity())





confirma?onDialog.show(getSupportFragmentManager(),
null);









.setIcon(android.R.drawable.ic_dialog_alert).setTitle(?tle)



}









.setPosi?veBulon(android.R.string.ok,
this)









.setNega?veBulon(android.R.string.cancel,
this).create();



public
void
onPosi?veClick()
{



}





Toast.makeText(this,
android.R.string.ok,
Toast.LENGTH_LONG).show();



public
void
onClick(DialogInterface
dialog,
int
which)
{



}





if
(listener
!=
null)
{







switch
(which)
{



public
void
onNega?veClick()
{







case
DialogInterface.BUTTON_POSITIVE:





Toast.makeText(this,
android.R.string.cancel,
Toast.LENGTH_LONG).show();









listener.onPosi?veClick();



}









break;

}







default:









listener.onNega?veClick();







}





}



}

}

Múl?plas
Visões

Leitor de Livros:
Crie um leitor de livros com
duas visões:
•  Uma é uma lista com os
títulos de capítulso.
•  A outra é um campo de texto
com o conteúdo do capítulo.
•  Clicando em um título abre-se
o capítulo.
•  Em modo de retrato vê-se
somente uma visão de cada
vez.
•  Em modo de paisagem, vêm-
se as duas!
Os
Layouts

Como
é
esse

layout
aqui?


E
esse
layout

aqui,
como
é?

Os
Layouts

Como
é
esse

layout
aqui?


Na verdade, tudo depende de


como estamos vendo o
telefone: se em modo de
retrato, ou em modo de
paisagem…

E
esse
layout

aqui,
como
é?

<?xml
version="1.0"
encoding="uz‐8"?>

<LinearLayout
xmlns:android=

Os
Layouts
 


"hlp://schemas.android.com/apk/res/android"





android:layout_width="match_parent"





android:layout_height="match_parent"

Esse
componente
de
 



android:orienta?on="horizontal"
>

layout,
e
esse
outro





<fragment

serão
preenchidos
por
 







android:id="@+id/summary_fragment"

classes
do
?po
 







android:name=

Fragment.
 








"com.dcc052.aula16.SummaryFragment"









android:layout_width="0dp"

O
que
são
 







android:layout_height="match_parent"

s?

esses
nome 







android:layout_weight="1"
/>






<fragment









android:id="@+id/chapter_fragment"









android:name=











"com.dcc052.aula16.ChapterFragment"









android:layout_width="0dp"









android:layout_height="match_parent"









android:layout_weight="2"
/>


</LinearLayout>

Os
Layouts

Esse
outro
layout
na

verdade
é
somente
uma

moldura,
onde

encaixaremos
um

fragmento
em
tempo
de

execução
da
aplicação.

Ele
terá,
assim
duas

visões
possíveis.


<?xml
version="1.0"
encoding="uz‐8"?>

<FrameLayout
xmlns:android=









"hlp://schemas.android.com/apk/res/android"





android:id="@+id/fragment_container"





android:layout_width="match_parent"





android:layout_height="match_parent"
/>

ChapterFragment

public
class
ChapterFragment
extends
Fragment
{



@Override



public
View
onCreateView(LayoutInflater
inflater,
ViewGroup
container,







Bundle
savedInstanceState)



{











}
 Fragmentos
possuem



@Override
 um
ciclo
de
vida,



public
void
onStart()
 parecido,
porém



{











}



public
void
updateChapterView(int
posi?on)

diferente
do
ciclo
de



{











}
 vida
de
a?vidades.



@Override



public
void
onSaveInstanceState(Bundle
outState)

Quais
partes



{











}
 desse
ciclo

}
 seriam
iguais?

es

ChapterFragment.java
 E
quais
part
seriam


diferentes?
Ciclo
de
Vida


Qual
é
o
papel
dos
métodos

abaixo?


‐ 
onAttach

‐ 
onCreateView

‐ 
onActivityCreated

‐ 
onDestroyView

‐ 
onDetach
ChapterFragment.java


Criando
Visão
do
Fragmento

public
class
ChapterFragment
extends
Fragment
{



final
sta?c
String
ARG_POSITION
=
"posi?on";



int
mCurrentPosi?on
=
‐1;
 Porque
temos

esse
teste?



@Override



public
View
onCreateView(LayoutInflater
inflater,







ViewGroup
container,
Bundle
savedInstanceState)
{





if
(savedInstanceState
!=
null)
{







mCurrentPosi?on
=
savedInstanceState.getInt(ARG_POSITION);





}





return
inflater.inflate(R.layout.chapter_view,
container,
false);



}
 Esse
método
faz
 Que
outros

parte
do
ciclo
 métodos
são
 Temos
de
criar

}
 de
vida
do
 chamados
nesse
 esse
layout.

Fragmento.
 ciclo?

layout/ChapterView.xml


O
layout
de
um
capítulo

<?xml
version="1.0"
encoding="uz‐8"?>

<TextView
xmlns:android=









"hlp://schemas.android.com/apk/res/android"





android:id="@+id/chapter_view"





android:layout_width="match_parent"





android:layout_height="match_parent"





android:padding="16dp"





android:textSize="18sp"
/>


Esse
layout
 Mas
é
claro
que
 Por
que
não
é



Por
hora
o

possui
algumas
 poderemos
 preciso
criar

layout
será

deficiências.
 melhorá‐lo
 uma
versão
de

assim.

Quais?
 depois.
 paisagem?

ChapterFragment.java


Começando
o
Fragmento


@Override

Explique
a



public
void
onStart()
{
 lógica
do





super.onStart();
 condicional





Bundle
args
=
getArguments();
 nesse
código.





if
(args
!=
null)
{







updateChapterView(args.getInt(ARG_POSITION));





}
else
if
(mCurrentPosi?on
!=
‐1)
{

Precisamos
de






updateChapterView(mCurrentPosi?on);
 esse
método,
q
finir





}
 ue

cria
a
visão
do



}
 fragmento.


@Override



public
void
onSaveInstanceState(Bundle
outState)
{





super.onSaveInstanceState(outState);





outState.putInt(ARG_POSITION,
mCurrentPosi?on);



}

Criando
a
Visão
do
Fragmento


public
void
updateChapterView(int
posi?on)
{





Ac(vity
ac(vity
=
getAc(vity();





TextView
chapter
=
(TextView)
ac?vity.findViewById(R.id.chapter_view);





chapter.setText(Book.poems[posi(on]);





mCurrentPosi?on
=
posi?on;



}
 O
que
esse

código
está
 Que
a?vid ade

ChapterFragment.java
 é
essa?

fazendo?


•  Em
termos
de
reúso
de
código,
esse
projeto
é

um
pouco
deficiente.

–  Quais
são
essas
deficiências?

Book.java

“O
Livro”

public
class
Book
{
 • 
“livro”
por
hora
é
um
stub.




sta?c
String[]
?tles
=
{
 • 
Como
poderíamos







"Primeiro
Poema",
 implementar
a
aplicação







"Segundo
Poema"
 defini?va?



};




sta?c
String[]
poems
=
{







"Olha
estas
velhas
arvores,
mais
belas\nDo
que
as
…",







"Sobre
minh'alma,
como
sobre
um
trono,\nSenhor..."



};


}

A
lista
de
capítulos

•  Nosso
próximo
passo

é
implementar
a
lista

de
capítulos.

•  Essa
classe
deve
ser

capaz
de
no?ficar

eventos.

–  Que
eventos
são

esses?

SummaryFragment.java

public
class
SummaryFragment
extends
ListFragment
{





OnChapterSelectedListener
mCallback;

Para
que





public
interface
OnChapterSelectedListener
{
 serve
todo









public
void
onChapterSelected(int
posi(on);
 esse
código
?





}






@Override





public
void
onCreate(Bundle
savedInstanceState)
{





}






@Override





public
void
onStart()
{





}






@Override





public
void
onAlach(Ac?vity
ac?vity)
{





}






@Override





public
void
onListItemClick(ListView
l,
View
v,
int
posi?on,
long
id)





{





}

}

Criando
o
Layout
the
Lista


@Override





public
void
onCreate(Bundle
savedInstanceState)
{









super.onCreate(savedInstanceState);









int
layout
=
Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.HONEYCOMB
?

















android.R.layout.simple_list_item_ac?vated_1
:
android.R.layout.simple_list_item_1;









setListAdapter(new
ArrayAdapter<String>(getAc?vity(),
layout,
Book.?tles));





}

SummaryFragment.java


Isso
se
parece
com

Por
que
ess um
#ifndef Note
que
não
foi
preciso

e

teste?
 dinâmico.
Você
pode
 criar
o
método

explicar
a
analogia?
 onCreateView.
Porque?

Começando
a
lista
de
†tulos

@Override

public
void
onStart()
{



super.onStart();



if
(getFragmentManager().findFragmentById(R.id.chapter_fragment)!=null)
{





getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);



}








}

SummaryFragment.java


Para
que

serve
esse

teste

misterioso?

Começando
a
lista
de
†tulos

@Override

public
void
onStart()
{



super.onStart();



if
(getFragmentManager().findFragmentById(R.id.chapter_fragment)!=null)
{





getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);



}








}

SummaryFragment.java


Estamos
testando
se
o
fragmento

está
em
modo
de
tela
dupla.
Esse

só
é
o
caso
quando
o
fragmento

chapter_fragment
está
presente

na
lista
de
layouts
a?vos.
Quando

estamos
em
modo
de
tela
dupla,

marcamos
o
item
selecionado
na

lista.

public
class
SummaryFragment
extends
ListFragment
{
 SummaryFragment.java





OnChapterSelectedListener
mCallback;






public
interface
OnChapterSelectedListener
{

onAlach









public
void
onChapterSelected(int
posi?on);

Explica‐me





}

novamente
a





@Override

lógica
desse





public
void
onAaach(Ac?vity
ac?vity)
{

código.









super.onAlach(ac?vity);









try
{
 Precisamos













mCallback
=
(OnChapterSelectedListener)
ac?vity;
 agora









}
catch
(ClassCastExcep?on
e)
{
 implementar
a













throw
new
ClassCastExcep?on(ac?vity.toString()
 a?vidade





















+
"
must
implement
OnHeadlineSelectedListener");
 principal.









}

Essa
será
a
cola





}

que
ligará
os





@Override
 dois





public
void
onListItemClick(ListView
l,
View
v,
int
posi?on,
long
id)
{
 fragmentos.









mCallback.onChapterSelected(posi?on);









getListView().setItemChecked(posi?on,
true);





}

}

A
A?vidade
Principal
 Que
interface
é

essa?

BookAc?vity.java

public
class
BookAc?vity
extends
FragmentAc?vity
implements





SummaryFragment.OnChapterSelectedListener
{




@Override



public
void
onCreate(Bundle
savedInstanceState)
 Por
que
esse

método
está



{





}
 aqui?




public
void
onChapterSelected(int
posi?on)



{





}
 Como
será
a

implementação
}
 de
onCreate?

Vários
Cenários
 Para
que
serve

BookAc?vity.java
 esse
teste?

@Override

public
void
onCreate(Bundle
savedInstanceState)
{




super.onCreate(savedInstanceState);
 E
esse
outro



setContentView(R.layout.summary_view);
 teste,
para
que

ele
serve?



if
(findViewById(R.id.fragment_container)
!=
null)
{






if
(savedInstanceState
!=
null)
{








return;





}






SummaryFragment
firstFragment
=
new
SummaryFragment();





firstFragment.setArguments(getIntent().getExtras());





getSupportFragmentManager().beginTransac?on()









.add(R.id.fragment_container,
firstFragment).commit();



}


}

Transações
 Fragmentos

são
criados
em

BookAc?vity.java
 transações.

@Override
 Porque?

public
void
onCreate(Bundle
savedInstanceState)
{




super.onCreate(savedInstanceState);



setContentView(R.layout.summary_view);
 Precisamos
agora

implementar



if
(findViewById(R.id.fragment_container)
!=
null)
{

 onChapterSelected.





if
(savedInstanceState
!=
null)
{

 Ideas?







return;





}






SummaryFragment
firstFragment
=
new
SummaryFragment();





firstFragment.setArguments(getIntent().getExtras());





getSupportFragmentManager().beginTransac?on()









.add(R.id.fragment_container,
firstFragment).commit();



}


}

BookAc?vity.java


Selecionando
um
Capítulo

public
void
onChapterSelected(int
posi?on)
{




ChapterFragment
chapterFrag
=
(ChapterFragment)
getSupportFragmentManager()







.findFragmentById(R.id.chapter_fragment);



if
(chapterFrag
!=
null
&&
chapterFrag.getAc(vity()
!=
null)
{

Para
que
serve
esse
teste?





chapterFrag.updateChapterView(posi?on);



}
else
{


E
se
eu





ChapterFragment
newFragment
=
new
ChapterFragment();

removesse
essa





Bundle
args
=
new
Bundle();
 condição?





args.putInt(ChapterFragment.ARG_POSITION,
posi?on);





newFragment.setArguments(args);





FragmentTransac?on
transac?on
=
getSupportFragmentManager()









.beginTransac?on();





transac?on.replace(R.id.fragment_container,
newFragment);





transac?on.addToBackStack(null);
 O
que
essa





transac?on.commit();
 transação
está



}

 fazendo?

}

Alternando
entre
visões

•  É
possível
alterar
a
visão
do
emulador
usando

a
combinação
de
telcas
CTRL+F11.

–  Será
que
o
custo
de
alterar
essas
visões
é
alto?

–  Como
saber
se
novas
a?vidades
são
criadas?

BookAc?vity.java


Logando
transições
de
estado

public
class
BookAc?vity
extends
FragmentAc?vity
implements





SummaryFragment.OnChapterSelectedListener
{



@Override



public
void
onStart()
{
super.onStart();

Log.v("BookAc?vity",
"onStart");
}



@Override



public
void
onStop()
{
super.onStop();
Log.v("BookAc?vity",
"onStop");
}



@Override



public
void
onResume()
{
super.onResume();
Log.v("BookAc?vity",
"onResume");
}



@Override



public
void
onPause()
{
super.onPause();
Log.v("BookAc?vity",
"onPause");
}



@Override



public
void
onDestroy()
{
super.onDestroy();
Log.v("BookAc?vity",
"onDestroy");
}

}
 Será
que
uma
nova

a?vidade
é
criada

quando
alternamos

entre
retrato
e

paisagem?

Melhorando
o
Layout
de
Capítulos

•  O
layout
que
usamos
para
capítulos
não
está

bom:
o
usuário
não
consegue
ler
o
texto

inteiro.
O
que
poderíamos
fazer?

<?xml
version="1.0"
encoding="uz‐8"?>

<TextView
xmlns:android=









"hlp://schemas.android.com/apk/res/android"





android:id="@+id/chapter_view"





android:layout_width="match_parent"





android:layout_height="match_parent"





android:padding="16dp"





android:textSize="18sp"
/>

chapter_view.xml

Melhorando
o
Layout
de
Capítulos

•  O
layout
que
usamos
para
capítulos
não
está

bom:
o
usuário
não
consegue
ler
o
texto

inteiro.
O
que
poderíamos
fazer?

<?xml
version="1.0"
encoding="uz‐8"?>

<TextView
xmlns:android=
 Podemos









"hlp://schemas.android.com/apk/res/android"
 reduzir
o





android:id="@+id/chapter_view"
 tamanho
da





android:layout_width="match_parent"
 fonte!





android:layout_height="match_parent"





android:padding="14dp"

O
que
mais





android:textSize="18sp"
/>

podemos

chapter_view.xml
 fazer?

chapter_view.xml


Melhorando
o
Layout
de
Capítulos

•  O
layout
que
usamos
para
capítulos
não
está

bom:
o
usuário
não
consegue
ler
o
texto

inteiro.
O
que
poderíamos
fazer?

<?xml
version="1.0"
encoding="uz‐8"?>

<ScrollView
xmlns:android=





"hlp://schemas.android.com/apk/res/android"





android:layout_width="fill_parent"

Ou
podemos





android:layout_height="fill_parent"

usar
um
scroll





android:padding="16dp"
>





<TextView









android:id="@+id/chapter_view"









android:layout_width="wrap_content"









android:layout_height="wrap_content"









android:textSize="18sp"
/>

</ScrollView>


Você também pode gostar