Professional Documents
Culture Documents
Aula 4
Aula 4
Objetos
Gráficos
• Depuração
simples:
imprimindo
eventos
• Lidando
com
botões
e
spinners
• Carregando
múlEplas
aEvidades
em
uma
aplicação
• O
padrão
adapter
• Mostrando
vários
itens
com
listas
• Os
diversos
layouts
Views
(de
novo)
• Visão
(view):
um
objeto
que
“sabe”
se
desenhar
na
tela.
• Grupos
(ViewGroup):
uma
visão
que
pode
conter
outras.
• Layout:
uma
visão
que
“sabe”
dispor
outras
visões
na
tela
do
aparelho.
o p o m o r fismo:
Antr
e s d e q ua n do um
Ed
d aç o de c ó digo
pe
uer
“sabe” qualq
coisa?
Textos
e
Botões
Primeira aplicação:
Crie a visão mostrada ao lado.
• Um clique no botão faz com
que o texto exibido seja
impresso no log do Android.
• O log do Android é um
arquivo de texto que pode ser
usado para depuração.
Saída crua:
O
Log
do
Android
Podem o s u sa r e
olher
s se
log para rec
fo r m a çõ e s de
in
r a çã o e t es tes
depu
d e s e m p e n ho
de
O
Log
do
Android
• Texto
é
impresso
pela
classe
Log,
que
possui
cinco
métodos
estáEcos.
Cada
método
impreme
em
uma
cor
diferente:
– Log.v:
texto
verboso
(preto)
– Log.d:
texto
de
depuração
(azul)
– Log.i:
texto
informaEvo
(verde)
– Log.w:
texto
de
aviso
(laranja)
– Log.e:
texto
de
erro
(vermelho)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=”…"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/txtDemo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/> la”
<EditText Qual é a “co
n t re a in t erface
android:id="@+id/eTxtDemo" e
igo
android:layout_width="fill_parent" XML e o cód
android:layout_height="wrap_content"
/>
Java?
<Button
android:id="@+id/btnDone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Log it"
/>
</LinearLayout>
Os
Nomes
dos
Componentes
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txt1 = (TextView)findViewById(R.id.txtDemo);
etxt1 = (EditText)findViewById(R.id.eTxtDemo);
btn1 = (Button)findViewById(R.id.btnDone);
txt1.setText("Entre seu texto");
btn1.setOnClickListener(btnDoneOnClick);
}
Falta ainda
programar o
evento. Como fica
isso?
Mais
um
evento
de
botão
private final Button.OnClickListener
btnDoneOnClick = new Button.OnClickListener() {
public void onClick(View v) {
String input = etxt1.getText().toString();
1
Log.v("TextViewDemo", input);
2
etxt1.setText("");
}
};
1. O
que
significam
os
parâmetros
de
Log.v?
2. O
que
essa
linha
está
fazendo?
Botões
com
Imagens
...
<ImageButton
android:id="@+id/btnDone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
...
}
});
Qual o próximo componente gráfico?!
Botões
de
Rádio
<RadioGroup
android:id="@+id/rgGroup1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioButton android:id="@+id/RB1”
android:text="Button1" />
<RadioButton android:id="@+id/RB2”
android:text="Button2" />
<RadioButton android:id="@+id/RB3”
android:text="Button3" />
</RadioGroup>
<TextView
android:id="@+id/txtRadio"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=
"RadioGroup: nada escolhido ainda"
/>
Botões
de
Rádio
<RadioGroup
android:id="@+id/rgGroup1"
android:layout_width="fill_parent"
ntar
Como impleme
android:layout_height="wrap_content"
camada de
android:orientation="vertical">
a
<RadioButton android:id="@+id/RB1” essa
android:text="Button1" />cont
role d
aplicação?
<RadioButton android:id="@+id/RB2”
android:text="Button2" />
<RadioButton android:id="@+id/RB3”
android:text="Button3" />
</RadioGroup>
<TextView
android:id="@+id/txtRadio"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=
"RadioGroup: nada escolhido ainda"
/>
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txtRadio = (TextView) findViewById(R.id.txtRadio);
rb1 = (RadioButton) findViewById(R.id.RB1);
rb2 = (RadioButton) findViewById(R.id.RB2);
rb3 = (RadioButton) findViewById(R.id.RB3);
// React to events from the RadioGroup
rb1.setOnClickListener(new RadioGroup.OnClickListener() {
public void onClick(View v) {
txtRadio.setText("Radio: escolhido botao 1");
}
});
rb2.setOnClickListener(new RadioGroup.OnClickListener() {
public void onClick(View v) {
txtRadio.setText("Radio: escolhido botao 2");
}
});
rb3.setOnClickListener(new RadioGroup.OnClickListener() {
public void onClick(View v) {
txtRadio.setText("Radio: escolhido botao 3");
}
});
}
<Spinner
android:id="@+id/spnMusketeers"
android:layout_width="250dp"
Spinners
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="2dp"
/>
Spinner:
layout
Completo
<?xml
version="1.0"
encoding="u/‐8"?>
<LinearLayout
xmlns:android="h5p://schemas.android.com/apk/res/android"
android:orientaEon="ver?cal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Spinner
android:id="@+id/spnMusketeers"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="2dp"
/>
</LinearLayout>
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); O
que
faz
esse
bloco
de
código?
spnMusketeers = (Spinner) findViewById(R.id.spnMusketeers);
List<String> lsMusketeers = new ArrayList<String>();
lsMusketeers.add("Athos");
lsMusketeers.add("Porthos");
lsMusketeers.add("Aramis");
ArrayAdapter<String> aspnMusketeers =
new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, lsMusketeers);
aspnMusketeers.setDropDownViewResource
(android.R.layout.simple_spinner_dropdown_item);
spnMusketeers.setAdapter(aspnMusketeers);
spnMusketeers.setOnItemSelectedListener
(new OnItemSelectedListener() {
public void onNothingSelected(AdapterView<?> arg0) {}
public void onItemSelected
(AdapterView<?> parent, View v, int position, long id) {
// ???
} E
esse
bloco
de
código,
o
que
faz?
});
}
public void onCreate(Bundle savedInstanceState) {
Eventos de Spinner:
super.onCreate(savedInstanceState);
setContentView(R.layout.main); Adicione um controlador de
eventos a essa spinner
spnMusketeers = (Spinner) findViewById(R.id.spnMusketeers);
List<String> lsMusketeers = new ArrayList<String>();
lsMusketeers.add("Athos");
• Modifique a visão para incluir
lsMusketeers.add("Porthos"); uma caixa de texto.
lsMusketeers.add("Aramis"); • Cada item selecionado deve
ArrayAdapter<String> aspnMusketeers =
new ArrayAdapter<String>(this,
ser mostrado na caixa de
texto.
lsMusketeers);
android.R.layout.simple_spinner_item,
aspnMusketeers.setDropDownViewResource
(android.R.layout.simple_spinner_dropdown_item);
spnMusketeers.setAdapter(aspnMusketeers);
spnMusketeers.setOnItemSelectedListener
(new OnItemSelectedListener() {
public void onNothingSelected(AdapterView<?> arg0) {???}
public void onItemSelected
(AdapterView<?> parent, View v, int position, long id) {
// ???
}
});
}
Spinner
mais
Caixa
de
Texto
<?xml
version="1.0"
encoding="u/‐8"?>
<LinearLayout
xmlns:android="h5p://schemas.android.com/apk/res/android"
android:orientaEon="ver?cal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Spinner
android:id="@+id/spnMusketeers"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="2dp"
/>
<TextView
android:id="@+id/txtSpinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Spinner:
nenhum
item
selecionado"
/>
</LinearLayout>
Eventos
de
Spinner
spnMusketeers.setOnItemSelectedListener(
new OnItemSelectedListener() {
public void onNothingSelected(AdapterView<?> arg0) {
txtSpinner.setText("Nada foi selecionado!");
}
public void onItemSelected(AdapterView<?> parent,
View v, int position, long id) {
txtSpinner.setText(
(String) parent.getItemAtPosition(position));
}
});
MúlEplas
AEvidades
• É
possível
desenvolver
múlEplas
aEvidades
na
mesma
aplicação.
• Novas
aEvidades
são
declaradas
em
AndroidManifest.xml.
• Usando
o
Eclipse,
pode‐se
escolher
qual
a
aEvidade
a
ser
lançada
no
emulador:
– Run,
Run configuration…,
Launch.
AndroidManifest.xml
<applicaEon
android:icon="@drawable/icon"
android:label="@string/app_name">
<acEvity
android:name=".AulaAcEvity4"
android:label="@string/app_name">
<intent‐filter>
<acEon
android:name="android.intent.acEon.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER"
/>
</intent‐filter>
</acEvity>
<acEvity
android:name=".Gallery1"
android:label="@string/app_name">
<intent‐filter>
<acEon
android:name="android.intent.acEon.MAIN"
/>
<category
android:name="android.intent.category.LAUNCHER"
/>
</intent‐filter>
</acEvity>
</applicaEon>
Selecione a atividade aqui!!
Galerias
de
Imagens
Lista de fotos:
Crie uma galeria de imagens,
tal que seja possível escolher
alguma dentre as fotos
mostradas.
Cada vez que uma foto é
escolhida, seu índice na
galeria deve ser mostrado no
Toast do aparelho celular
Galerias
• Android
possui
um
elemento
gráfico
que
se
presta
exatamente
ao
propósito
de
criar
galerias
de
imagens.
<?xml version="1.0" encoding="utf-8"?>
<Gallery
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gallery"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
Inicialização
da
Galeria
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gallery_1);
Gallery g = (Gallery) findViewById(R.id.gallery);
g.setAdapter(new ImageAdapter(this));
g.setOnItemClickListener(
new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent,
View v, int position, long id) {
Toast.makeText(Gallery1.this, "" + position,
Toast.LENGTH_LONG).show();
}
O qu
} eée
); cl asse sta
Toas
} t?
Adaptadores
• Adapter
é
um
padrão
de
projetos.
– Aliás,
dos
mais
simples
que
existem.
• Um
adaptador
faz
a
adequação
entre
duas
interfaces.
– Quais
interfaces
precisam
ser
adaptadas,
em
nosso
caso?
Adaptadores
em
UML
ImageAdapter
public class ImageAdapter extends BaseAdapter {
public ImageAdapter(Context c) { ... }
public int getCount() { ... }
public Object getItem(int position) { ... }
public long getItemId(int position) { ... }
public View getView(
int position,
View convertView,
ViewGroup parent) { Como
i m p l em entar
...
e s t e a daptador?
}
}
ImageAdapter
public class ImageAdapter extends BaseAdapter {
public ImageAdapter(Context c) { ... }
public int getCount() { ... }
public Object getItem(int position) { ... }
public long getItemId(int position) { ... }
public View getView(
int position, Número de items representados
View convertView, pelo adaptador.
ViewGroup parent) {
... Visão que mostrará o objeto
} armazenado na dada posição.
} Objeto em uma certa posição
Atributos
de
EsElo
int mGalleryItemBackground;
public ImageAdapter(Context c) {
mContext = c;
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
mGalleryItemBackground = a.getResourceId(
R.styleable.Gallery1_android_galleryItemBackground, 0);
a.recycle();
}
values/anrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Gallery1">
<attr name="android:galleryItemBackground" />
</declare-styleable>
</resources>
A
lista
de
imagens
private Integer[] mImageIds = {
R.drawable.gallery_photo_1,
R.drawable.gallery_photo_2, R.drawable.gallery_photo_3,
R.drawable.gallery_photo_4, R.drawable.gallery_photo_5,
R.drawable.gallery_photo_6, R.drawable.gallery_photo_7,
R.drawable.gallery_photo_8 };
Adicione a
funcionalidade Discuta a
de remover estratégia
ua
elementos de s escolhida.
aplicação.
• O
que
seria
uma
opção
mais
adequada?
• Qual
o
custo
de
fazer
a
mudança?
• E
como
inserir
os
novos
eventos
no
menu?
MúlEplos
Eventos
public final void onCreateContextMenu(
final ContextMenu menu,
final View v,
final ContextMenuInfo menuInfo
) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, del, Menu.NONE, "DEL");
menu.add(Menu.NONE, up, Menu.NONE, "UP");
menu.add(Menu.NONE, down, Menu.NONE, "DOWN");
}
public final boolean onContextItemSelected(final MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo)
item.getMenuInfo();
ListAdapter adapter = getListAdapter();
String e = (String) adapter.getItem((int) info.id);
switch (item.getItemId()) {
case del:
mStrings.remove(e);
break;
case up:
mStrings.remove(e);
mStrings.add(0, e);
break;
case down:
mStrings.remove(e);
mStrings.add(e);
break;
default:
return super.onContextItemSelected(item);
}
this.setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mStrings));
return true;
}
Mais
um
pouco
sobre
Layouts
• Android
usa
layouts
para
controlar
a
aparência
das
aplicações.
• Existem
vários
Epos
de
layouts:
– FrameLayout
– LinearLayout
– TableLayout
– AbsoluteLayout
– RelativeLayout
– etc
• Para
que
serve
cada
um
desses
formatos?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:// LinearLayout
schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText1" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText2" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText3" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText4" E basta mudar uma
/> linha para …
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:// LinearLayout
schemas.android.com/apk/res/android"
android:orientation=”horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=”E1" />
<EditText
android:layout_width="fill_parent" O que significa
android:layout_height="wrap_content" esse “wrap_
android:text=”E2" />
<EditText content”?
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=”E3" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=”E4"
/>
</LinearLayout>
Pesos
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText1"
android:layout_weight="1"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText2" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText3"
android:layout_weight="0.5"/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="EditText4"
android:layout_weight="0.5"/>
Layouts
de
Tabela
• Tabelas
permitem
que
componentes
gráficos
sejam
armazenados
em
linhas
e
colunas.
• É
possível
determinar
o
peso
de
cada
item?
<?xml
version="1.0"
encoding="ut‐8"?>
<TableLayout
xmlns:android="hnp://schemas.android.com/apk/res/android"
android:id="@+id/tblJobs"
Tabelas:
exemplo
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Bunon
android:text="Cell
11"
<TableRow
android:id="@+id/btnCel11"
android:layout_width="fill_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
<Bunon
android:text="wrap_content"
android:layout_weight="2"/>
android:id="@+id/btnCo21"
/>
android:layout_width="100dip"
<TextView
android:layout_height="wrap_content"
android:id="@+id/txtCell12"
/>
android:layout_width="wrap_content"
<TextView
android:layout_height="wrap_content"
android:id="@+id/txtCell22"
android:text="Cell
12"
android:layout_width="wrap_content"
android:layout_weight="1"/>
android:layout_height="wrap_content"
/>
android:text="Cell
22"
<TextView
/>
android:id="@+id/txtCell13"
<TextView
android:layout_width="wrap_content"
android:id="@+id/txtCell23"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="Cell
13"
android:layout_height="wrap_content"
android:layout_weight="1"/>
android:text="Cell
23"
/>
/>
<TextView
<TextView
android:id="@+id/txtCell14"
android:id="@+id/txtCell24"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="wrap_content"
android:text="Cell
14"
android:text="Cell
24"
android:layout_weight="1"/>
/>
/>
</TableRow>
</TableRow>
</TableLayout>
Layouts
Absolutos
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android=
"http://schemas.android.com/apk/res/android" Como será a
tela dessa
android:orientation="vertical"
android:layout_width="fill_parent”
android:layout_height="fill_parent” > aplicação?
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Canto superior esquerdo"
android:layout_x="0.0px” android:layout_y="0.0px" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Meio"
android:layout_x="140.0px” android:layout_y="200.0px" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Canto superior direito"
android:layout_x="240.0px” android:layout_y="400.0px" />
</AbsoluteLayout>
Layouts
Absolutos
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent”
android:layout_height="fill_parent” >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
400.0 esquerdo"
E se desuperior
android:text="Canto
fô ssemos android:layout_y="0.0px" />
android:layout_x="0.0px”
para 4000.0?
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Meio"
android:layout_x="140.0px” android:layout_y="200.0px" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Canto superior direito"
android:layout_x="240.0px” android:layout_y="400.0px" />
</AbsoluteLayout>
Discussão
• Quais
as
vantagens
de
um
layout
absoluto?
• E
quais
as
desvantagens?
• E
como
se
determinam
dimensões
em
Android?
<?xml
version="1.0"
encoding="u/‐8"?>
<RelaEveLayout
xmlns:android="h5p://schemas.android.com/apk/res/android"
android:orientaEon="ver?cal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
• É
possível
especificar
a
posição
de
um
elemento
<TextView
android:id="@+id/txtText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text1"
android:gravity="top"
gráfico
com
relação
a
android:layout_alignParentRight="true"
/>
outro,
usando
layouts
relaEvos.
<TextView
android:id="@+id/txtText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text2"
android:layout_below="@+id/txtText1"
/>
<Bunon
android:id="@+id/btnBu5on1"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="Bu5on1"
android:layout_below="@+id/txtText2"
/>
<Bunon
android:id="@+id/btnBu5on2"
android:layout_width="150dp"
android:layout_height="100dp"
android:text="Bu5on2"
android:layout_toRightOf="@+id/btnBu5on1"
android:layout_alignTop="@+id/btnBu5on1"
/>
</RelaEveLayout>
Layouts
RelaEvos
• É
possível
especificar
a
posição
de
um
elemento
gráfico
com
relação
a
outro.
<TextView
android:id="@+id/txtText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text1"
android:gravity="top"
android:layout_alignParentRight="true"
/>
<Button
android:id="@+id/btnButton1"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="Button1"
android:layout_below="@+id/txtText2"
/>
Layouts
RelaEvos
• É
possível
especificar
a
posição
de
um
elemento
gráfico
com
relação
a
outro.
<TextView
android:id="@+id/txtText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Text2"
android:layout_below="@+id/txtText1"
/>
<Button
android:id="@+id/btnButton2"
android:layout_width="150dp"
android:layout_height="100dp"
android:text="Button2"
android:layout_toRightOf="@+id/btnButton1"
android:layout_alignTop="@+id/btnButton1"
/>
Incrementando
a
nossa
lista
• Modifique
a
aEvidade
ListContext
para
que
seja
possível
mover
um
item
uma
posição
para
baixo.
O
úlEmo
item
não
pode
ser
movido,
mas
a
sua
aplicação
não
deve
parar
de
funcionar
se
o
usuário
tentar
movê‐lo.