Escolar Documentos
Profissional Documentos
Cultura Documentos
2014
fevereiro
2014
04 05
ASP.NET
Aplicações .NET em camadas, teoria e prática - Parte 1
11
Delphi XE5 – Banco de
dados com Android
Autor: Jeferson Silva de Lima
16
Projeto Pegaso:
Projeto Pegaso Aprendendo a utilizar Orientação a
Objetos com Recursos Multi-Plataforma – Novas Técnicas
de Programação - Parte 2
24 30
Android - Personalizando
o “Spinner”
Autor: Thiago C. Montebugnoli Desafio The Club
03
fevereiro
2014
Editorial
Olá amigos do The Club!
Av. Profº Celso Ferreira da Silva, 190
Jd. Europa - Avaré - SP - CEP 18.707-150
Informações e Suporte: (14) 3732-1529
Internet
http://www.theclub.com.br
Cadastro: cadastro@theclub.com.br
Suporte: suporte@theclub.com.br
Estamos aqui mais um mês deste ano de 2014, sempre com o intuito de Informações: info@theclub.com.br
Skype Cadastro: theclub_cadastro
agradá-los com o conteúdo de nossos artigos. A todo o momento estamos Skype Suporte: theclub_linha1
theclub_linha2
nos deparando com o desenvolvimento de novas tecnologias no ramo da theclub_linha3
a utilizar Orientação a Objetos com Recursos Multi-Plataforma” com novas Diretor Técnico
Técnicas de Programação. Nesta segunda e última parte podemos aliar o Marcos César Silva
Impressão e acabamento:
Um grande abraço e até o mês que vem! GRIL - Gráfica e Editora
Taquarituba-SP - Tel. (14) 3762-1345
Reprodução
A utilização, reprodução, apropriação, armazenamento em banco
de dados, sob qualquer forma ou meio, de textos, fotos e outras
criações intelectuais em cada publicação da revista “The Club
Megazine” são terminantemente proibidos sem autorização
escrita dos titulares dos direitos autorais.
04
fevereiro
2014
Aplicações .NET em camadas,
teoria e prática - Parte 1
A
tualmente é muito comum ouvir a famosa expressão “apli- único lugar.
cações em camadas” ou “desenvolvimento em camadas” ou
apenas “camadas”. Essa estrutura pode parecer estranha, mas ainda existe, está em pleno
funcionamento e mais próximo do que você pensa, por exemplo: Sistema de
Essa expressão não é modismo, logo o conceito e o tipo Estacionamento.
de projeto em camadas (MVC) assumirá de vez o lugar do WEBForms, então, é
muito comum o assunto e você pode facilmente vê-lo aparecer numa entrevista Aplicações em duas camadas – Com a estrutura da organização com-
de emprego, conversa com amigos de trabalho, faculdade, etc. partilhando recursos por meio de rede e servidores, as aplicações ganharam
características de duas camadas conhecida como cliente/servidor. Nesse
Ou seja, é algo comum, muito comum mesmo, todo mundo fala.Mas modelo, os dados ficam armazenados em segurança no servidor a disposição
aí começa o problema, todo mundo fala, mas quem realmente conhece o da aplicação conectada a rede como mostra a imagem 02.
suficiente para falar e fazer?
Por conta disso, resolvi apresentar esse assunto de duas formas, teoria
e prática. Então, vamos começar pela parte teórica conhecendoo conceito
(resumido) do desenvolvimento de aplicações em camadas.
05
fevereiro
2014
Aplicações em camadas (contexto prático)
Requisitos:
Agora que você já tem uma ideia a respeito de camadas, vamos fixar Sendo assim, vamos iniciar o desenvolvimento do banco de dados na
alguns conceitos. nossa aplicação.
Tanto Layer com Tier, significam “camadas” em inglês. Só que Tier refere- Abra o Sql Server Management Studio e crie o banco de dados para nossa
-se à estrutura física (hardwares, servidores, etc.) e Layer refere-se à estrutura aplicação como mostra a imagem04.
lógica. Daqui em diante o foco será na camada Layer já que vamos tratar da
organização da estrutura do código da aplicação.
O interessante no conceito de desenvolvimento em camadas é que você Imagem 04 – Criando o Banco de Dados da aplicação.
não está restrito a apenas três camadas, você pode dividir em mais camadas
se seu projeto exigir. Na verdade, quanto mais você dividir visando organizar, Em “New Database” o nome dadoa nossa base será MVC, após digitar o
mais trabalho terá no começo, porém, mais produtividade e organização você nome, clique em OK como mostra a imagem 05.
terá ao final do projeto e no período de evolução e sustentação.
Veja a imagem 05.
Na divisão em camadas lógicas, destacamos os principais itens:
Com o Banco de Dados criado, abra uma nova janela clicando em “New
• User Interface/Presentation – Trata-se da camada de apresentação Query” e utilize o script CREATE TABLE a seguir:
para coleta e exibição de dados.
• Business LogicLayer – Trata-se da camada de lógica e regras de
negócio intermediando requisições do usuário. Listagem 1
• Data Access Layer – Camada de dados responsável pela execução
de transações de envio e retorno de dados. Não confundir com DAO (Data CREATETABLE [Usuario](
Access Objetct) com DAL (Data Access Layer). [IdUsuario] [bigint]
IDENTITY(1,1)NOTNULL,
DAO é um padrão de projeto,Implementa especificamente um objeto [NomeUsuario] [varchar](50)
contido no contexto de DAL.
06
fevereiro
2014
Imagem 05 – Banco de dados nomeado como MVC.
NOTNULL,
[EmailUsuario] [varchar](50)
NOTNULL,
[Login] [nchar](15)NOTNULL,
[Senha] [nchar](15)NOTNULL
CONSTRAINT [PK_Usuario]
PRIMARYKEYCLUSTERED
(
[IdUsuario] ASC
)WITH (
PAD_INDEX=OFF,
STATISTICS_NORECOMPUTE=OFF,
IGNORE_DUP_KEY=OFF,
ALLOW_ROW_LOCKS=ON,
ALLOW_PAGE_LOCKS=ON)ON
[PRIMARY]
)ON [PRIMARY]
07
fevereiro
2014
Com o Banco de Dados e a Tabela criada, precisamos de pelo menos dois
registros na tabela, conforme script a seguir:
Listagem 2
INSERTINTO [Usuario]
([NomeUsuario]
,[EmailUsuario]
,[Login]
,[Senha])
VALUES
(‘João Marcos’
,’contato@tilosofia.com.br’
,’jmsaka’
,’12345’)
INSERTINTO [Usuario]
([NomeUsuario]
,[EmailUsuario]
,[Login]
,[Senha])
VALUES
(‘Aderbal Lacerda’
,’aderbal@gmail.com’
,’aderb’
,’ABC’)
Repare como ficou a estrutura de pastas na Solution Explorer com as Veja a imagem 08.
camadas Model, View, Controller como mostra a imagem 08.
Na janela que se abrirá você estará na etapa “ChooseModelContents”,
08
fevereiro
2014
Imagem 08 – inclusão do Entity Data Model
09
fevereiro
2014
Após preencher os dados, testar a conexão e clicar em “OK”, a tela “Entity
Data Model” deverá estar preenchida conforme imagem 13.
Conclusão
Imagem 13 - Entity Data Model após estabelecer conexão.
O tema desenvolvimento em camadas é muito interessante, porém deve
Na tela seguinte será necessário escolher os objetos que serão mapeados, ser tratado com cautela e deve ser muito praticado além de estudado.
no caso desse artigo somente a tabela Usuários como mostra a imagem 14.
Tome muito cuidado com fóruns de discussão, pois, tem muita gente
falando besteira que pode atrasar seu aprendizado, pesquise o assuntoem
fontes confiáveis como MSDN e Macoratti, por exemplo.
Não tenha pressa em aprender só pra dizer que conhece, pois, experiência
vale mais que conhecimento.
Fontes:
http://pt.wikipedia.org/wiki/Modelo_em_tr%C3%AAs_camadas
Microsoft Visual C# 2008 - John Sharp
10
fevereiro
2014
Delphi XE5
Banco de dados com Android
Q
uando desenvolvemos uma aplicação na plataforma ‘An-
droid’ temos em mente que nossa base de dados conven-
cional não pode ser acessada diretamente pelo dispositivo
móvel, ou seja, deve haver uma ponte entre o dispositivo
e a base de dados.
Conectando ao Banco A extensão do arquivo será (.db). Com o local indicado clique no botão
‘Advanced’ e vá até a propriedade ‘FailifMissing’ marcando como ‘False’, assim
Neste exemplo utilizaremos o banco de dados ‘SQLite’ que é compatível ao tentar conectar ao banco se não existir ele será criado, caso deixe ‘True’ o
com a plataforma Android, além do Interbase. Delphi apenas irá se conectar a base de dados.
C:\Users\Suporte4\Documents\meubanco.db
Imagem 2 – Propriedades avançadas.
11
fevereiro
2014
Após configurarmos a conexão devemos criar as tabelas, para isso clique Nomeie os componentes conforme listagem abaixo:
com o botão direito em ‘Table’ em sua conexão e terá a opção ‘New Table’.
Componentes
SQLConnection1: Conexao;
SQLQuery1: SQLInsert;
SQLQuery2: SQLDelete;
SQLDataSet1: sdsClientes;
Criando a aplicação
12 fevereiro
2014
Project/Deployment, conforme imagem abaixo: ‘Plataforms’ para Android e em ‘Remote Path’ coloque: ‘ .\assets\internal ‘ (sem
as aspas) , esse será o local onde ficará nossa base de dados no dispositivo.
Listagem 1 – BeforeConnect.
Conexao.Params.
Values[‘Database’] := TPath.
Combine(TPath.GetDocumentsPath,
‘nomedobanco.db’);
Imagem 8 – Deployment.
Imagem 11 – Emulador.
13
fevereiro
2014
begin
Try
if InputQuery(‘Novo
Cliente’,’Nome’,S) and (S.Trim
<> ‘’) then
Begin
SQLInsert.Close;
SQLInsert.
ParamByName(‘CLI_NOME’).
AsString := S;
Imagem 12 – Parâmetro ‘CLI_NOME’. SQLInsert.ExecSQL();
sdsClientes.Refresh;
End;
except
on e: Exception do
begin
ShowMessage(e.Message);
end
End;
14
fevereiro
2014
begin
S := ListView1.Selected.Text;
Try
if InputQuery(‘Deletar
Cliente’,’Nome’,S) and (S.Trim
<> ‘’) then
Begin
SQLDelete.Close;
SQLDelete.
ParamByName(‘CLI_NOME’).
AsString := S;
SQLDelete.ExecSQL();
sdsClientes.Refresh;
End;
except
on e: Exception do
begin
Imagem 15 – InputQuery Delete.
ShowMessage(e.Message);
end
Conclusão
End;
Vimos neste artigo como conectar nosso dispositivo móvel na base de
dados SQLite sem depender de outra aplicação, ou seja, tudo de forma sim-
ples e direta. Este exemplo pode ser melhorado e implementado da forma
Veja que ao clicar no item da Lista ele será armazenado na variável
que desejarem.
S, veja na imagem abaixo:
Espero que tenham gostado desta dica e até a próxima!
Sobre o autor
Jeferson Silva de Lima
Consultor The Club.
suporte@theclub.com.br
15
fevereiro
2014
Projeto Pegaso Aprendendo a utilizar
Orientação a Objetos com Recursos
Multi-Plataforma – Novas Técnicas de
Programação - Parte 2
N
esta segunda e última parte do artigo abordarei mais alguns própria classe estivesse dentro do dataset em execução – isso é prático para
recursos de nosso projeto. Seguindo a lógica de raciocínio, o desenvolvedor à medida em que evolui no código-fonte, incrementando a
a nossa classe sempre deverá se interagir com a TConexao produtividade do projeto e a elegância do nível do fonte também – podendo
para prover o banco de dados desejado. Para isso, a nossa retornar qualquer tipo incluído na unit DB.pas por exemplo (um descendente
classe de exemplo TPessoaFisica terá uma variável privada de TCollection/ TOwnedCollection), ou então customizando para novos tipos:
de TConexao, que será referenciada na classe inteira, para de forma abstrata observe abaixo a função de retornar o próximo ID de uma tabela – declarado
prover este acesso. como “GetNextId” de TConexaoDBISAM e TConexaoFirebird, respectivamente:
16
fevereiro
2014
begin Figura 19 – Demonstração do método CarregarBanco nas classes TConexao-
fId := TCustomSQLDataSet(Self. DBISAM e TConexaoFirebird.
RetornaDataSet(Format(sql constructor TConexaoDBISAM.
MaxIndexFromFieldNameForm create;
at1, [fFieldName, fTable]))). begin
Fields[0].AsString; if (ffDiretorioDBISAM = ‘’)
if (fId = ‘’) then fId := then
‘1’; Self.CarregarBanco(‘DBISAM’)
Result := fId; else
end; Self.CarregarBanco(ffDireto
if (Result = 1) then rioDBISAM);
FCod_Pessoa := inherited;
end;
FormatFloat(‘0000’, Self.
GetCurrentCod_Pessoa);
function TConexaoDBISAM.
CarregarBanco(const cDiretorio:
function TPessoaFisica. string): Boolean;
GetCurrentCod_Pessoa: integer; var
begin fIniFile: TIniFile;
Result := Conexao.GetFields fFile: TextFile;
FromSQL(Format(sqlSelectPess fPathCfgIni: string;
oaFisicaFromNome, [FNome])). fDiretorio: string;
Fields[0].AsInteger; fNotOK: Boolean;
end; begin
fNotOK := False;
fPathCfgIni :=
function TConexao.
ExtractFilePath(Application.
GetFieldsFromSQL(const fSQL:
ExeName)+ FCFGIni;
string): TFields;
begin dmDBISAM := TdmDBISAM.
if Self is TConexaoDBISAM Create(nil);
then dmDBISAM.BD.Connected :=
Result := False;
TConexaoDBISAM(Self). if dmDBISAM.BD.DatabaseName
GetFieldsFromSQL(fSQL) = EmptyStr then dmDBISAM.
else if Self is TConexaoXML BD.DatabaseName :=
then FDataBaseName;
Result := TConexaoXML(Self).
if not SysUtils.
GetFieldsFromSQL(fSQL)
FileExists(fPathCfgIni) then
else if Self is
begin
TConexaoFirebird then AssignFile(fFile,
Result := fPathCfgIni);
TConexaoFirebird(Self). Rewrite(fFile);
GetFieldsFromSQL(fSQL); Append(fFile);
end; Writeln(fFile,
‘[Configuracao]’);
Writeln(fFile, ‘Diretorio=
Um método que não foi explicado ainda é o CarregarBanco, presença ‘);
obrigatória em todas as classes que descendam de TConexao – pois ele é o Flush(fFile); { ensures
encarregado de “procurar” o banco de dados, e se encontrar, preparar ele that the text was actually
(configurando permissões, drivers de acesso, etc) e deixá-lo disponível para as written to file }
transações que possam ser requeridas posteriormente. Esse método deve ser CloseFile(fFile);
chamado na criação do objeto de TConexao desejado (construtor de TCone- end
xaoDBISAM/ TConexaoFirebird, por exemplo). Segue abaixo as declarações de else
CarregarBanco nas classes TConexaoDBISAM e TConexaoFirebird, bem como begin
as suas chamadas no método construtor de cada uma delas: fIniFile := TIniFile.
17
fevereiro
2014
Create(fPathCfgIni); end; //end if bd.connected
with fIniFile do = false then
begin
try if fNotOK then
dmDBISAM.BD.Directory begin
:= ReadString(‘Configuracao’, Result := False;
‘Diretorio’, dmDBISAM. end
BD.Directory); else
dmDBISAM.BD.Connected begin
:= Self.BancoExiste(dmDBISAM. if not (dmDBISAM.
BD.Directory); BD.Connected) then
finally begin
Free; fIniFile := TIniFile.
end; Create(fPathCfgIni);
end; with fIniFile do
end; begin
try
if not (dmDBISAM.BD.Connected) dmDBISAM.BD.Directory
then := ReadString(‘Configuracao’,
begin ‘Diretorio’, dmDBISAM.
if Self.BancoExiste((Extrac BD.Directory);
tFilePath(Application.ExeName) dmDBISAM.BD.Connected
+ ‘BD\’ + cDiretorio) , False) := Self.BancoExiste(dmDBISAM.
then //tenta achar localmente BD.Directory, False);
begin finally
fIniFile := TIniFile. Free;
Create(fPathCfgIni); end;
with fIniFile do end;
begin end;
try end;
WriteString(‘C Result := not fNotOK;
onfiguracao’,’Diretorio’, end;
(ExtractFilePath(Application.
ExeName) + ‘BD\’ + cDiretorio)); { TConexaoFirebird }
finally
Free; function TConexaoFirebird.
end; CarregarBanco(const cDiretorio:
end; string): Boolean;
end begin
else if not Result := True;
DirectoryExists(dmDBISAM. if (cDiretorio = EmptyStr)
BD.Directory) or (dmDBISAM. then
BD.Directory = ‘’) or not begin
(dmDBISAM.BD.Connected) then fVendorLib :=
begin FMyGDSVendorLib;
fIniFile := TIniFile. fLibraryName :=
Create(fPathCfgIni); FMyDBXExpress
with fIniFile do FirebirdLibraryName;
begin fPathDataBase :=
try FUsuariosFDB;
WriteString(‘Configura end
cao’,’Diretorio’, fDiretorio); else if (cDiretorio =
finally ‘default’) then
Free; begin
end; fVendorLib :=
end; FMyGDSVendorLib;
end else fNotOK := True; fLibraryName :=
18
fevereiro
2014
ExtractFilePath(Application. end;
ExeName) + IncludeTrai except
lingPathDelimiter(‘BD\ on E: Exception do
FIREBIRD’) + FMyDBXExpress begin
FirebirdLibraryName; Raise EInvalidDataBase.
fPathDataBase :=
Create(EErroGeralBancoDeDados +
ExtractFilePath(Application.
#13#10 + E.Message);
ExeName) + IncludeTrailingPa
thDelimiter(‘BD\FIREBIRD’) + Result := False;
fPathDataBase; end;
end end;
else end;
begin
fVendorLib := constructor TConexaoFirebird.
cDiretorio + FMyGDSVendorLib; create(const cDiretorio: string
fLibraryName := = ‘default’);
cDiretorio + FMyDBXExpress begin
FirebirdLibraryName; if not Self.
fPathDataBase :=
CarregarBanco(cDiretorio) then
cDiretorio + fPathDataBase;
Exit;
end;
inherited create;
Result := ( (DirectoryE end;
xists(fPathDataBase)) and
(FileExists(fLibraryName)) );
if not Result then Exit;
19
fevereiro
2014
Listagem 20
end;
procedure
type DestroyFrame(APageControl:
IFrame = interface TPageControl; ATabsheet:
[‘{112D577F-BA1B-4CAA-97D6- TTabsheet);
A12D25E6503B}’] var
procedure OnShow; frame: TFrame;
procedure OnHide; begin
procedure Novo; frame :=
procedure Persistir; GetFrame(APageControl,
procedure Excluir; ATabsheet);
procedure GetUsedClass(const if frame <> nil then
fObject: TObject = nil); frame.Free;
end; end;
procedure function
TfrmCadastroPessoaFisica. GetActionFrame(APageControl:
tabHistoricoShow(Sender: TPageControl; ATabsheet:
TObject); TTabSheet; AFrameOption:
begin FrameOption; const myObject:
if Assigned(PessoaFisica) TObject = nil): TFrame;
then var
GetActionFrame(PageControl1, intf: IFrame;
Sender as TTabSheet, foShow, frame: TFrame;
PessoaFisica); begin
end; Result := nil;
procedure CreateFrame(APageControl,
TfrmCadastroPessoaFisica. ATabsheet);
tabHistoricoHide(Sender:
TObject); frame :=
begin GetFrame(APageControl,
GetActionFrame(PageControl1, ATabsheet);
Sender as TTabSheet, foHide);
end; if not Supports(frame,
IFrame, intf) then Exit;
function GetFrame(APageControl:
TPageControl; ATabSheet: case AFrameOption of
TTabsheet): TFrame; foShow:
begin begin
if not Assigned(ATabsheet) if Assigned(myObject)
then then
ATabsheet := APageControl. intf.
ActivePage; GetUsedClass(myObject);
Result := nil; intf.OnShow;
if Assigned(ATabsheet) and end;
(ATabSheet.ControlCount > 0) foHide: intf.OnHide;
and (ATabSheet.Controls[0] end;
is TFrame) then
Result := TFrame(ATabSheet. Result := frame;
Controls[0]); end;
20 fevereiro
2014
Figura 20 – Criação do objeto do tipo TFrame – na tabsheet de Histórico em tempo de execução.
Figura 21-24 – Exibição das principais Telas do nosso sistema em execução – a última é a janela-diálogo de confirmação de exclusão – personalizada pelo componente sha-
reweare TAdvSmoothMessageDialog da empresa TMSSoftware.
21
fevereiro
2014
Figura 21-24 – Exibição das principais Telas do nosso sistema em execução – a
última é a janela-diálogo de confirmação de exclusão – personalizada pelo componente
shareweare TAdvSmoothMessageDialog da empresa TMSSoftware.
22
fevereiro
2014
Conclusão que venham a contribuir com todos os desenvolvedores Delphi – esta incrível
ferramenta de programação que sempre se encontra cada vez mais imbatível
Foram discutidos tópicos relacionados a Linguagem Orientada a Objetos e poderosa frente à novas IDE´s que surgem no mercado diariamente também
em Delphi através de um exemplo fictício mas de implementação profissional aliadas a novas formas alternativas de formatos de trocas de informações
de um sistema em desenvolvimento – abordando a criação da classe negocial como JSON, etc.
de Pessoa Física, a classe TConexao e suas comunicações, bem como a criação
do banco de dados e a camada de apresentação correspondente. Foi abordado Um abraço a todos e até aos próximos artigos! Até lá!
novo template de telas personalizado com efeitos suaves, gradientes, leves
e agradáveis – customizados por componentes de terceiros e com design
diferenciado de certos componentes (como panéis com bordas arredondadas,
panéis com gradiente de barras de ferramentas e títulos nas posição top/left
no estilo Microsoft/XP) e outras técnicas de implementação como a utilização
de interfaces com frames e a classe TConexao – projetada para ambientes
Sobre o autor
multiplataforma.
Hamden Vogel
Com isso, foi distribuído este projeto de teste para acompanhamento Analista de Sistemas pós-graduado em Engenharia de Software pela
de como foi desenvolvido (a partir do código-fonte) e como foi desenhado (a UPIS e Programador Delphi com larga experiência desde 2000, tem de-
partir das telas em tempo de execução) – onde um usuário final poderá exe- senvolvido e vendido softwares em Delphi para a África e Estados Unidos,
além do mercado nacional. Colaborou com dicas e componentes para sites
cutar o aplicativo em qualquer diretório de seu computador (da maneira que especializados em Delphi. Também desenvolve em outras linguagens como
foi distribuído os fontes pelo artigo) e perceber o funcionamento do mesmo. C/C++, ASP, PHP e .NET.
23
fevereiro
2014
Android - Personalizando
o “Spinner”
M
uitas vezes temos a necessidade de personalizar com- Classe “Cidades.java”
ponentes ao decorrer do desenvolvimento de algum
projeto. Na realidade é isto que deixa nosso software Devemos também programar uma classe padrão que irá nos retornar
com um lay-out diferente dos outros. Quando traba- um Conjunto de valores. No caso nesta classe foram cadastradas algumas
lhamos com a programação para Android é inevitável cidades de exemplo.
não nos deparar com uma situação destas. Neste artigo irei personalizar um
dos principais componentes, o “Spinner”. Ele fornece uma maneira rápida de Veja abaixo o código da classe ”Cidades.java”.
selecionar um valor a partir de um conjunto de valores. No estado padrão, um
“Spinner” mostra seu valor atualmente selecionado. Ao selecioná-lo é exibido Listagem 01: Classe “Cidades.java”.
um Menu suspenso com todos os outros valores disponíveis, a partir do qual o
usuário pode selecionar um novo. Ele se parece com o “Combobox” do Delphi package com.example.android_
ou o “DropDownList” da plataforma .Net. spinner;
24
fevereiro
2014
add(“PIRAJU”); xmlns:tools=”http://
RetornarCidades.add(“SÃO schemas.android.com/tools”
PAULO”); android:layout_width=”match_
} parent”
} android:layout_
height=”match_parent”
android:paddingBottom=”@
dimen/activity_vertical_margin”
A função desta classe é nos retornar um “ArrayList” dos valores cadastrados android:paddingLeft=”@
no método “Construtor”. Veremos mais adiante sua utilização. dimen/activity_horizontal_
margin”
android:paddingRight=”@
Activity_Main.xml dimen/activity_horizontal_
margin”
O rosto principal do exemplo será composto por 3 (três) Componentes android:paddingTop=”@dimen/
“Spinners”. Ver Imagem 01. activity_vertical_margin”
tools:context=”.
MainActivity” >
<Spinner
android:id=”@+id/
spinner1”
android:layout_
width=”400dp”
android:layout_
height=”50dp”
android:layout_
alignParentTop=”true”
android:layout_
centerHorizontal=”true”
android:layout_
marginTop=”22dp” />
<Spinner
android:id=”@+id/
spinner2”
android:layout_
width=”400dp”
android:layout_
height=”50dp”
android:layout_
alignLeft=”@+id/spinner1”
android:layout_
below=”@+id/spinner1”
android:layout_
marginTop=”42dp” />
<Spinner
Figura 01: Activity_Main.xml. android:id=”@+id/
spinner3”
O código XML correspondente: (Listagem 02) android:layout_
width=”400dp”
Listagem 02: XML da tela principal. android:layout_
height=”70dp”
<RelativeLayout android:layout_
xmlns:android=”http://schemas. alignLeft=”@+id/spinner2”
android.com/apk/res/android” android:layout_
25
fevereiro
2014
2-) Personalização do Item do componente
below=”@+id/spinner2”
android:layout_ Devemos seguir os mesmos passos descritos anteriormente, a diferença
marginTop=”58dp” /> deste é que definiremos outro nome para o arquivo, como: “spinner_dropdo-
</RelativeLayout> wn_theclub.xml” e utilizaremos alguns atributos da classe “CheckedTextView”.
Os principais são: “singleline” (Itens do “Spinner” com apenas uma linha) e
“textColor” (Cor da Fonte). Ver Listagem 04.
android:textColor=”#ee66ff”/>
26 fevereiro
2014
MainActivity.java
tableRow1” android:layout_
width=”wrap_content” Para cada exemplo achei melhor criar um Procedimento. O projeto será
android:layout_height=”wrap_ dividido em 4 (quatro) Procedimentos, sendo:
content” android:padding=”10px”>
<ImageView - InicializaListeners(): Responsável por inicializar os componentes “Spin-
android:layout_width=”32sp” ners” e o objeto “Cidades”.
android:src=”@drawable/ - ValorPersonalizado(): Personalizar os valores gerais do “Spinner”. (“Spin-
ic_launcher” android:layout_ ner_theclub.xml”)
height=”32sp” /> - ItemPersonalizado(): Personalizar especificamente os itens do “Spinner”.
<TextView (“Spinner_dropdown_theclub.xml”)
android:textSize=”22sp” - ImagemItemPersonalizado(): Utilizar uma imagem no “Spinner”. (“Spin-
android:text=”Cidade” ner_imagem_theclub.xml”)
android:textStyle=”bold”
android:layout_width=”fill_
parent” android:id=”@+id/
SpinnerCidadeItem” package com.example.android_
android:layout_ spinner;
height=”fill_parent”
android:paddingLeft=”5sp” />
</TableRow>
</TableLayout> Utilizaremos algumas bibliotecas adicionais para desenvolver este exem-
plo, veja abaixo:
@Override
protected void onCreate(Bundle
savedInstanceState)
{
super.
onCreate(savedInstanceState);
setContentView(R.layout.
activity_main);
InicializaListeners();
Figura 03: Arquivos do Exemplo. ValorPersonalizado();
27
fevereiro
2014
ItemPersonalizado();
ImagemItemPersonalizado();
}
public void
InicializaListeners()
{
spn1 = (Spinner)
findViewById(R.id.spinner1);
spn2 = (Spinner)
findViewById(R.id.spinner2);
spn3 = (Spinner)
findViewById(R.id.spinner3);
cidades = new
Cidades();
} Figura 04: Método ValorPersonalizado().
public void
ItemPersonalizado()
public void {
ValorPersonalizado() ArrayAdapter<String>
{ arrayAdapter2 = new
ArrayAdapter<String> ArrayAdapter<String>(this,R.
arrayAdapter1 = new layout.spinner_theclub,
ArrayAdapter<String>(this,R. cidades.RetornarCidades);
layout.spinner_theclub, arrayAdapter2.
cidades.RetornarCidades); setDropDownViewResource(R.
spn1. layout.spinner_dropdown_
setAdapter(arrayAdapter1); theclub);
} spn2.
setAdapter(arrayAdapter2);
}
28 fevereiro
2014
Para inserirmos uma imagem no “Spinner”, teremos um trabalho a mais
para fazer. Primeiramente devemos declarar um “ArrayList” utilizando o tipo
de dados “HashMap”. Quando utilizamos este tipo devemos obrigatoriamente
informar o par “chave/valor”. Para preencher os itens do “Spinner” faremos
um laço e em seguida usar a classe “SimpleAdapter” contendo os parâmetros:
- Contexto da aplicação, - o “Arraylist” com os campos chave/valor, - o arquivo
de configuração “spinner_imagem_theclub.xml”, a chave “Cidades” e por final
o “SpinnerCidadeItem” contido no arquivo de configuração (Nesta referência
é onde será armazenada os dados oriundos do “ArrayList”). Ver Imagem 06.
public void
ImagemItemPersonalizado()
{
ArrayList<HashMap<String, Figura 06: Método ImagemItemPersonalizado().
String>> alist = new
ArrayList<HashMap<String,
String>>(); Conclusões
HashMap<String, String> map =
new HashMap<String, String>();
A linguagem Java + XML nos proporciona diversos tipo de recursos no
for(int i=0; i < cidades. desenvolvimento de aplicativos para a plataforma Android. Neste artigo,
RetornarCidades.size(); i++) achei necessário explorar um pouco mais deste componente, o “Spinner”. O
{ “Spinner” é um dos componentes mais utilizados quando precisamos retornar
map = new dados de diversas fontes (Neste artigo usamos uma classe com dados estáticos
HashMap<String,String>(); para esta tarefa). Pudemos “enfeitar” e deixar com uma aparência muito mais
map.put(“Cidades”, cidades. agradável alterando tamanho e cor de fontes, Imagens, estilos, entre outras
RetornarCidades.get(i). coisas. Vou ficando por aqui, Abraços e até o mês que vem!
toString());
alist.add(map);
}
SimpleAdapter
Sobre o autor
simpleAdapter = new
SimpleAdapter( Thiago Cavalheiro Montebugnoli
this, alist,R.layout.spinner_ adora aprender novas tecnologias. Formado pela Faculdade de Tecnologia de Botucatu
imagem_theclub, new String[] – SP (FATEC), já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco
de Dados SQL Server e Firebird. Atualmente trabalha no Centro de Processamento de Dados da
{“Cidades”}, Prefeitura Municipal de Itaí-SP é colunista mensal da Revista The Club Megazine e é consultor
new int[] {R.id. Técnico do The Club. Possui as seguintes certificações: MCP - Microsoft Certified Professional,
MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer
SpinnerCidadeItem}); e MCSD - Microsoft Certified Solution Developer.
spn3.
setAdapter(simpleAdapter);
}
} thiago@theclub.com.br
29
fevereiro
2014
desafio the club
Verticais
Horizontais
1. Qrsysdata - 2. Registry - 3. Onselect - 4. Override - 5. Vkreturn - 6. Keyprewiew - 7. Sqlexpr - 8. Dbchart - 9. Overload - 10. TheClub - 11. Concat - 12. Locate - 13. Datecompare - 14. Incday
30
fevereiro
2014
05
fevereiro
2014
fevereiro
2014