the club - megazine · março 2015 05 a chegada das redes sociais facilitou um pouco a vida do...

32
março 2015

Upload: phamhuong

Post on 15-Nov-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015

Page 2: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015

Page 3: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 03

22

Índice

Editorial

04

11

Autor: Jeferson Silva de Lima

05

Autor: Luciano Pimenta

Android – ListView com Interação de dados

Autor: Thiago C. Montebugnoli

Integração Android e Facebook

Delphi XE5 - Controle de Versões

Page 4: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201504

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Thiago Montebugnoli - Editor [email protected]

Caro amigo programador,

É sempre com muita satisfação que disponibilizamos mais uma re-vista com diversos tipos de assuntos pertinentes ao nosso mundo da Programação. Aproveito também para lembrá-lo que estamos sempre aberto a sugestões de assuntos para Artigos e Dicas, pois a sua opinião é muito importante para nós.

Neste mês nosso colunista Luciano Pimenta escreveu o artigo “Fa-cebook e Android”, um tema presente na vida de todos ultimamente. Neste artigo ele ensina a realizar a integração dos mesmos, sendo que o próprio Facebook disponibiliza um SDK e uma vasta documentação para realizar esta tarefa com aplicativos Android. Nosso consultor téc-nico Jeferson Silva de Lima vem com o artigo “Delphi XE5 – Controle de Versões”, sendo que neste ele foca para aplicações Desktop. Ele cria um exemplo que será responsável pela definição de diferentes versões, e o mais importante, sem a necessidade de gerar um projeto para cada um. Um recurso fundamental para quem procura versatilidade em seus softwares. Para finalizar a revista eu abordei um assunto de extrema importância relacionado ao Android, o uso do ListView com interação de Dados. Implementei o uso do componente “EditText” permitindo que uma classe pudesse alimentá-lo e integrá-lo ao nosso ListView em questão, servindo como base para futuras adaptações.

Desejo uma ótima leitura e até o mês que vem!

Um Abraço.

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações e Suporte: (14) 3732-1529

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected] Informações: [email protected] Cadastro: theclub_cadastro

Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

www.twitter.com/theclubbr

Copyright The Club 2013

Diretor TécnicoMarcos César Silva

DiagramaçãoVitor M. Rodrigues

DesignVitor M. Rodrigues

RevisãoDenise Blair

ColunistasHamden Vogel

Jeferson Silva de LimaLuciano Pimenta

Marlon Aparecido Branco ValentinoThiago Cavalheiro Montebugnoli

Impressão e acabamento:GRIL - Gráfica e Editora

Taquarituba-SP - Tel. (14) 3762-1345

ReproduçãoA 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.

Editorial

Page 5: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 05

A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco-rar um novo usuário e senha, basta logar com sua rede social favorita (Facebook, Google+, Twitter etc).

Isso também é possível em aplicações Android. O Facebook disponibiliza um SDK para a integração do Facebook com aplicativos Android. Temos uma boa documentação no site, e veremos como fazer um login simples neste artigo.

Criando uma app no Facebook

Primeiramente, precisamos criar uma app no Facebook. Ela que vai interagir com a aplicação Android, validando o usuário que está logando e retornando informações. Nessa app você indica as informações que deseja retornar do Facebook logado.

Acesse https://developers.facebook.com (é necessário estar logado no Facebook). É interessante, você criar uma página para seu aplicativo, ou mesmo se for apenas para teste, faça o login com seu usuário pessoal do Facebook.

Acesse o item My Apps>Add a new app. Agora você precisa escolher

em qual plataforma irá trabalhar. Escolha Android. O primeiro passo (Figura 1) será para escolhermos uma app existente ou criar uma nova, dando um nome para a App.

Veja a Figura 1. Criando uma nova app no facebook

Digite “TheClubAndroid”, para criar um Facebook App ID. Será aberta uma tela (Figura 2) para você indicar se o aplicativo que está usando é de testes e qual a categoria que o mesmo se encaixa.

Figura 2. Escolhendo a categoria

Integração Android e Facebook

Figura 1. Criando uma nova app no facebook

Page 6: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201506

Clique em Create App ID. Agora, estamos em um passo a passo. Ao rolar a tela, temos as opções para baixar o SDK (se ainda não o fez, faça agora), baixar um emulador e como adicionar o SDK ao projeto (veremos isso mais adiante).

Na parte final, temos que preencher dois campos com o nome do pacote da app no Android (Package Name) e a Activity principal da app Android (Default Activity Class Name). Vamos abrir o Android Studio e criar um novo projeto.

Escolha o template que você deseja usar (usei o Blank Activity with Frag-ment). Lembre-se que o nome do pacote, está vinculado ao nome do projeto que você criará no wizard (Figura 3).

Figura 3. Criando o projeto Android

Dê o nome de “TheClubAndroidApp”. O nome do pacote, deverá ser “br.com.theclubandroid”. Veja no arquivo AndroidManifest.xml como fica o nome do pacote (Figura 4) no item package.

Figura 4. Arquivo AndroidManifest.xml

Ainda no arquivo AndroidManifest.xml, temos a Activity principal (MainAc-tivity). Esse nome é que colocaremos no wizard da app do Facebook. Voltando a app do Facebook, digite os valores da aplicação Android e clique em Avançar.

Criando a chave da aplicação

No próximo passo, devemos criar a chave da nossa aplicação Android. Se estiver usando o Windows, o Facebook indica o comando no prompt:

keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64

Nota: pode ser necessário configuração do caminho da ferramenta keytool e openssl na sua máquina. O arquivo debug.keystore está na pasta .android do usuário logado no Windows. A ferramenta Keytool está na pasta bin do JDK.

A Keytool irá gerar um código, que devemos indicar no campo Develo-pment Key Hashes. Após configurar o caminho, basta executar o comando. Será solicitado uma senha, digite uma de sua preferencia. No final, teremos o resultado, como na Figura 5.

Figura 5. Gerando a Key Hash para a app do Facebook

Nota: o key é individual, o valor que será mostrado aqui, não indica que poderá ser usado por você, ele é válido apenas na minha máquina de testes.

Após adicionar a chave, clique em Avançar. O próximo passo, são dicas para sua aplicação e assim, finalizamos a criação da app no Facebook. Clique no link que vai levar para a dashboard da app (Figura 6).

Figura 6. Dashboard da app do Facebook

Agora, podemos configurar nossa app do Facebook. Primeiro, note que abaixo do nome da app um App ID. Esse código será usado na aplicação Android, para poder diferenciar a nossa app do Facebook. Clique em Settings e teremos todas as configurações feitas no wizard podendo editá-las, se necessário.

Nessa aba, também podemos adicionar uma nova plataforma, como tam-bém excluir a app. Em App Details podemos colocar descrições e informações da app, bem como imagens que serão usadas para promover a app no Facebook.

Nota: utilize imagens com o tamanho exato indicado, senão, não poderá ser feito o upload da mesma.

Page 7: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 07

Listagem 1. Configurando o layout com o LoginButton

Essas seriam as configurações necessárias para a app no Facebook. Vol-tamos ao Android Studio.

Adicionando o SDK no projeto

Primeiramente, precisamos adicionar no projeto o SDK do Facebook que você baixou no inicio do artigo. Descompacte o arquivo zipado em uma pasta de sua preferência. A versão usada neste artigo é a 3.22.0.

Faremos a mesma configuração realizada no artigo sobre Volley, então não entrarei em detalhes de como adicionar uma biblioteca no projeto Android. Acesse as configurações do projeto Android. Importe um projeto existente, es-colhendo a pasta facebook dentro do arquivo descompactado do SDK (Figura 7).

Figura 7. Importando o projeto do Facebook para a aplicação Android

Após, adicione como dependência o projeto que acabamos de importar. Caso ocorra um erro do arquivo build.gradle da biblioteca do Facebook, basta usar os valores do arquivo build.gradle da pasta da aplicação. Após, clique em Try again para o Gradle compilar o projeto com a dependência do SDK do Facebook.

Na árvore do projeto, já devemos ter a módulo facebook (Figura 8).

Figura 8. SDK do Facebook no projeto Android

Login no Facebook

Para realizar o login temos um controle chamado LoginButton. Crie um novo arquivo de layout com o nome “login_facebook”. Vamos configurar esse layout conforme a Listagem 1.

<TextView android:id=”@+id/banner” android:layout_width=”wrap_content”

Figura 6. Dashboard da app do Facebook

Page 8: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201508

Listagem 2. Métodos para o Login no Facebook

android:layout_height=”wrap_content” android:text=”@string/textoLogin” android:layout_marginTop=”10dp”/>

<com.facebook.widget.LoginButton android:id=”@+id/btnLogin” android:layout_width=”fill_parent” android:layout_height=”wrap_content” android:gravity=”center” android:layout_marginTop=”10dp”/>

Arquivo strings.xml<string name=”textoLogin”>Faça o login na aplicação usando a rede social Facebook.</string>

Adicionamos um TextView, para apresentar o mensagem ao usuário para ele logar com o Facebook e o LoginButton. Na parte de layout é somente isso. Crie uma nova Activity (“LoginActivity”) e vamos adicionar primeiramente o código da Listagem 2.

private boolean bLogin = false;private UiLifecycleHelper uiHelper;private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChanged(session, state, exception); }};

public void onSessionStateChanged(final Session session, SessionState state, Exception exception){

if(session != null && session.isOpened()){

Request.newMeRequest(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null && !bLogin) {

user.getId(); user.getName(); user.getProperty(“email”).toString();

bLogin = true; } }}).executeAsync();}}

Vamos entender como funciona. Criamos duas variáveis e um call-back, que faz a chamada ao login do Facebook. No onSessionStateChanged é onde ocorre a requisição para logar no Facebook. Adicionamos uma flag (bLogin) para saber se já estamos logado.

O método onComplete retorna os dados do usuário, para a validação correta. Com isso, precisamos apenas manipular o mesmo. No objeto user temos algumas informações como data de aniversário, nome do meio, primeiro nome, último nome, localização etc.

Caso deseje, você pode exibir os dados após receber a permissão pela app. No nosso exemplo, não vou exibir, apenas será redirecionado para a Activity principal da app. No OnCreate, vamos instanciar e configurar as informações que desejamos receber com o login do usuário:

uiHelper = new UiLifecycleHelper(LoginActivity.this, callback);uiHelper.onCreate(savedInstanceState);

LoginButton lb = (LoginButton)findViewById(R.id.btnLogin);lb.setPublishPermissions(Arrays.asList(“email”, “public_profile”, “user_friends”));

Precisamos sobscrever alguns métodos para manipular a sessão do Face-

Page 9: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 09

Listagem 3. Sobscrevendo métodos da Activity

book. Veja o código da Listagem 3.

@Overrideprotected void onResume() { super.onResume();

Session session = Session.getActiveSession(); if(session != null && (session.isClosed() || session.isOpened())){ onSessionStateChanged(session, session.getState(), null); }

uiHelper.onResume();}

@Overrideprotected void onPause() { super.onPause(); uiHelper.onPause();}

@Overrideprotected void onDestroy() { super.onDestroy(); uiHelper.onDestroy();}

@Overrideprotected void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); uiHelper.onSaveInstanceState(bundle);}

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data);}

Para finalizar, precisamos indicar no AndroidManifest.xml o id da aplicação. Crie uma string no arquivo strings.xml chamada “facebook_app_id” com o valor do ID da app do Facebook, que vimos na Figura 6. Abra o AndroidManifest.xml e adicione o seguinte código, dentro do bloco application.

<meta-data android:name=”com.facebook.sdk.ApplicationId” android:value=”@string/facebook_app_id”/>

Por fim, precisamos registrar a Activity que criamos para o login:

<activity android:name=”br.com.theclubandroid.LoginActivity”></activity><activity android:name=”com.facebook.LoginActivity” android:label=”Login Facebook”></activity>

Registramos nossa Activity, assim como precisamos registrar uma Activity do Facebook (com.facebook.LoginActivity). A tela inicial da aplicação é a Mai-nActivity, então precisamos verificar se o usuário já logou, pois precisamos solicitar a permissão, apenas uma vez. No OnCreate da Main, adicione o seguinte código:

Session sessao = Session.getActiveSession();if (sessao == null){ Intent login = new Intent(MainActivity.this, LoginActivity.class); startActivity(login);}

Já estamos em condições de logar no Facebook. Execute a aplicação (Figura 9), temos a tela inicial com o botão de Login.

Figura 9. Botão de login no Facebook

Ao clicar no botão será aberta uma tela para logar no Facebook (Figura 10).

Page 10: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201510

Figura 10. Solicitando permissão de login

Note que o usuário pode editar as permissões que o aplicativo Android terá acesso. O perfil público é obrigatório, mas outras informações podem não ser autorizadas pelo usuário (Figura 11).

Figura 11. Usuário pode não autorizar determinadas permissões

Clique em OK. Será redirecionado para a tela principal (se implementou o código no onSessionStateChanged) ou ficará na mesma tela, onde o Login-Button muda para Logout. Faça um teste, abra a aplicação novamente, agora, não é mais solicitado o login.

Acesse o perfil no Facebook e entre no item Aplicativos na seção Confi-gurações. Veja que agora temos a aplicação criada no Facebook entre as apps autorizadas (Figura 12).

Figura 12. App do Facebook autorizada

Conclusão

Vimos nesse artigo, como usar o SDK do Facebook para integrar aplicativos Android com a rede social, usando o LoginButton. No próximo artigo, vamos fazer algo mais avançado, como retornar a lista de amigo, bem como informa-ções dos mesmos (curtidas, etc).

Um grande abraço a todos e sucesso em seus projetos.

www.lucianopimenta.net

Luciano PimentaLuciano Pimenta (NOVO DOMINIO: www.lucianopimenta.com) é desenvolvedor Delphi/C#

para aplicações Web com ASP.NET, Windows com Win32 e Windows Forms com .NET. Palestrante da 4ª edição da Borland Conference (BorCon) e da 1ª Delphi Conference.

É MVP Embarcadero, grupo de profissionais que ajudam a divulgar o Delphi no mundo. Atualmente é desenvolvedor da SoftDesign fábrica de softwares em Porto Alegre-RS.

Autor de mais de 90 artigos e de mais de 600 vídeos aulas publicadas em revistas e sites especializados, além de treinamentos presenciais e multimídias. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados.

Sobre o autor

Page 11: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 11

Listagem 1 – DDL das Tabelas.

Olá amigos do The-Club nos últimos artigos focamos em diversas aplicações Mobile que atualmente estão em alta, porém, vamos voltar um pouco para o ‘velho’ e bom desktop.

Neste artigo vamos criar um recurso fundamental em aplicações comercias em geral que é o controle de acesso. Quando falamos de controle de acesso já pensamos logo em ‘Usuário’ e ‘Senha’, o que também é um ótimo recurso, porém, nem sempre este recurso cobre todas as necessidades que o desen-volvedor ou a empresa utilizam. Como assim?

Pensemos na seguinte situação; “Preciso criar uma versão mais Clean do meu sistema o cliente João não utiliza nenhum relatório e vive dizendo que o sistema é difícil de utilizar e tem muitas telas e recursos... Já sei, posso bloquear o acesso dele de todos os recursos que ele não utiliza através do meu controle de usuários, problema resolvido!”.

Em parte isso seria uma solução, porém, existem casos que há diversos usuários no sistema e apenas bloquear não seria a solução, mas também ocultar da tela para que fique algo simples e ‘Limpo’.

Por estes motivos vamos criar uma pequena aplicação que será responsável por definirmos as versões de nosso sistema sem precisar gerar um projeto para cada um.

Obs: Vamos utilizar o Delphi XE5 para o desenvolvimento, mas poderá criar em outras versões também, apenas alguns componentes visuais poderão apresentar problemas em versões mais antigas o que não deve interferir no controle em si.

Iniciando

Para este exemplo vamos ter como base o componente TActionList que irá conter TODAS as ações principais do sistema, ou seja, cada ação ativa ou inativa reflete no sistema o que o usuário terá acesso ou não.

Delphi XE5 - Controle de Versões

Para iniciamos vamos criar nossa base de dados que irá armazenar as informações de acesso. Segue a DDL das tabelas para que possa criar inde-pendente de seu banco de dados:

/* Table: PERMISSOES */

CREATE TABLE PERMISSOES ( ID_VERSAO INTEGER NOT NULL, ID_ITEM INTEGER NOT NULL, ACAO VARCHAR (80), ATIVO CHAR (1));

/* Primary keys definition */

ALTER TABLE PERMISSOES ADD CONSTRAINT PK_PERMISSOES PRIMARY KEY (ID_ITEM, ID_VERSAO);

/* Table: VERSOES */

CREATE TABLE VERSOES ( ID_VERSAO INTEGER NOT NULL, COD_VERSAO INTEGER);

/* Primary keys definition */

ALTER TABLE VERSOES ADD CONSTRAINT PK_VERSOES PRIMARY KEY (ID_VERSAO);

Page 12: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201512

A tabela de versões é opcional só precisamos gravar o código da versão, ou seja, caso tenha uma tabela com as configurações de seu sistema poderá adicionar este campo lá.

Com as tabelas criadas podemos iniciar o projeto.

Vamos precisar de três Unit:

Formulário Principal – FrmPrincipal (TForm);Controle de Permissões – frmPermissoesPadrao (TForm);DM (TDataModule).

No formulário principal adicione os seguintes componentes:

Imagem 1 – Formulário Principal.

1 TMainMenu;3 TActionList.

Mas, qual a necessidade de 3 Listas de ações ?

Vamos trabalhar da seguinte forma, no ActionList ‘Acoes’ terão os coman-dos que os menus já executam, ou seja, as ações de chamar um formulário, executar algum procedimento etc. Portanto, temos que criar os outros Actions baseados nele, as ações definidas em cada Action devem levar em consideração o padrão de cada versão, por exemplo:

• Versão Completa terá acesso a todos os recursos;• Versão Limitada terá acesso a:o Clientes;o Vendedores;o Faturamento;o Rel. Clientes;o Rel. Vendedores.

Com as ações definidas deverá simplesmente copiar as ações do padrão para o restante e lembre-se de pegar apenas a que irá utilizar, veja exemplo abaixo:

Imagem 2 – ActionList.

Regras

Para que o desenvolvimento e manutenção desta funcionalidade fiquem simples vamos criar algumas regras.

• Os ActionList referentes a cada versão devem conter uma Tag para identificação;

• A Tag deve ser equivalente a valor gravado no campo COD_VERSAO

Page 13: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 13

do banco de dados;• A nomenclatura das ações de cada ActionList devem seguir o pa-

drão: o ac*Nome: o * = Letra Inicial da versão; o Nome = Apelido da ação.

acCClientes (Referente a versão Completo);acLClientes (Referente a versão Limitado).

• As ações referentes ao controle não devem ter nenhum vínculo com o projeto, ou seja, caso precise remover as Actions basta excluir que o projeto irá funcionar normalmente. (Não se aplica a Action Acoes, pois, ela não tem vínculo direto com o controle).

• Vamos utilizar a propriedade GroupIndex e a Tag para agruparmos as ações em seus respectivos menus, exemplo:

Imagem 3 – Propriedades.

As ações pertencentes ao Menu ‘Cadastro’ fazem parte do GroupIndex 1, ou seja, a Tag deverá seguir a numeração:

101, 102, 103... 199

Imagem 4 – Cadastros.

Essa mesma Tag será gravada no banco de dados e será o ID_ITEM das ações, veja abaixo:

Imagem 5 – Tabela Permissões. Financeiro pertence ao grupo dois e relatórios ao grupo três.

• Os itens do Menu que não deseja exibir deve indicar Tag -1, veja como serão apresentados os itens de controle:

Imagem 6 – Formulário de Controle.

Imagem 7 – Item Menu.

Em nosso caso os Itens do Menu que vamos ocultar são os ‘Parâmetros’ e ‘Sair’, veja que a Tag já está -1.

Codificação

Agora que definimos nossas regras podemos prosseguir com o desen-volvimento.

Como vimos anteriormente nosso formulário principal já contém as Ac-

Page 14: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201514

Listagem 2 – SQL Permissões.

Listagem 3 – Componentes.

tions e MenuItens adicionados, portanto, vincule as ações ao seus respectivos itens, veja abaixo:

Imagem 8 – Item.

É necessário criar este vínculo para que possamos liberar ou bloquear o acesso ao recurso através das ações:

Imagem 9 – Tela Principal.

No exemplo acima estamos utilizando a versão limitada veja que os itens já estão bloqueados.

Antes de codificarmos o controle temos que configurar o Data Module:

Imagem 10 – Data Module.

Conexão – TSQLConnection;sdsGenerico, sdsPadrao – TSQLDataSet;dspPadrao – TdataSetProvider;Local – TLocalConnection.

As configurações estão da forma padrão. (DBExpress)

Segue consulta SQL do ‘sdsPadrao’:

SELECT * FROM PERMISSOES

A estrutura de nosso exemplo está montada, portanto, vamos adicionar os componentes que serão utilizados em nossa tela de controle, segue abaixo:

BevelBottom, BevelTop: TBevel;PgcBase: TPageControl;BtgBase: TButtonGroup;ImageBase: TImageList;sbtnListar: TSpeedButton;acAcoes: TActionList;cdsPadrao: TClientDataSet.

Alinhe o BevelTop e BtgBase ao topo do formulário e o BevelBottom ao rodapé, alinhe o PgcBase alClient para ocupar todo o formulário o que nesse caso se limita ao rodapé, veja :

Imagem 11 – Formulário de Controle.

Em nosso ‘ImageBase’ é necessário indicar 2 imagens para cada versão uma será ativa e a outra inativa, veja exemplo:

Imagem 12 – Imagens.

Page 15: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 15

Listagem 4 – Procedimentos.

Listagem 5 – OnCreate.

Listagem 6 – Função Captura Versão.

Lembre-se de indicar primeiramente as inativas e as ativas respectiva-mente.

No ‘acAcoes’ crie um ação para cada versão que irá utilizar:

Imagem 13 – Ações.

As Tags dessas ações devem ter o mesmo valor da versão, ou seja, em nosso caso versão 1 indica ‘Completo’ e 2 ‘Limitado’. Essas ações são necessá-rias, pois através delas vamos adicionar os comandos dos botões. Não posso simplesmente adicionar o comando no OnClick dos botões ?

Não! Nosso objetivo é criar uma aplicação genérica, ou seja, se precisar adicionar uma terceira versão além das duas que já estamos utilizando basta criar uma Action nova em sua tela inicial e não precisa criar um novo botão com novos comandos.

Seguem procedimentos, funções e variáveis que vamos utilizar em nosso desenvolvimento.

private {Private declarations} Procedure CriaBotoes(FForm: TForm); Procedure CapturaMenu(FForm: TForm); Procedure GravaAcoes(FForm: TForm; Id_Versao: Integer); Procedure CriaChecks(FForm: TForm; TabSheet: TTabSheet); Procedure CapturaAcoes; Procedure OnClick(Sender: TObject); Procedure AlteraVersao(Id_Versao: Integer); Procedure Atualiza_

Acoes(FForm: TForm; Id_Versao: Integer); Function CapturaVersao: Integer; Var fVERSAO: Integer;public {Public declarations} Procedure ControlaAcessos(FForm: TForm);

Os procedimentos utilizados no exemplo têm como parâmetro um TForm, ou seja, será seu formulário principal. Note que a sintaxe é praticamente a mes-ma em todos os processos então por que não criar apenas um procedimento?

Não teria problema, mas o objetivo aqui é reaproveitar código e dividir cada processo para facilitar a leitura do código depois de pronto, vamos ver como deve ficar!

procedure FormCreate(Sender: TObject);begin fVERSAO:= CapturaVersao;end;

Iniciamos atribuindo a versão que está gravada em seu banco de dados à variável fVERSAO, assim não precisamos ficar a todo o momento buscando este dado no banco.

function CapturaVersao: Integer;begin Try DM.sdsGenerico.Close; DM.sdsGenerico.CommandText:= ‘SELECT COD_VERSAO FROM VERSOES’; DM.sdsGenerico.Open; Result:= DM.sdsGenerico.Fields[0].AsInteger; Finally DM.sdsGenerico.Close; End;end;

Comentamos acima que iríamos reaproveitar código veja que já iniciamos utilizando apenas os procedimentos criados e isso se repete no evento OnShow.

Page 16: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201516

Listagem 7 – OnShow.

Listagem 8 – Procedimento Captura Menu.

Listagem 9 – Procedimento Cria Botões.

procedure FormShow(Sender: TObject);begin cdsPadrao.Open; CapturaMenu(frmPrincipal); CriaBotoes(frmPrincipal); If cdsPadrao.RecordCount <= 0 Then Begin Mensagem(‘Controle de Versão’,’ Os requisitos serão criados !’,mtInformation,[‘Ok’]); cdsPadrao.Refresh; AlteraVersao(1); acAcoes.Actions[0].ImageIndex:= 1 + acAcoes.ActionCount - 1; End else CapturaAcoes;end;

Neste momento acessamos nosso DataSet padrão que está vinculado ao DataModule, portanto, irá trazer todas as permissões gravadas no banco de dados. Em seguida, capturamos o Menu e criamos os botões, seguem codifi-cações respectivamente.

procedure CapturaMenu(FForm: TForm);Var I, J: Integer; C: TComponent; TabSheet: TTabSheet;begin With FForm do For I := 0 To ComponentCount - 1 do Begin C:= Components[I]; If (C is TMainMenu) Then Begin For J := 0 To TMainMenu(C).Items.Count - 1 do Begin If (TMainMenu(C).Items[J].Visible = True) And (TMainMenu(C).Items[J].Tag = 0) Then Begin TabSheet :=

TTabSheet.Create(PgcBase); TabSheet.PageControl:= PgcBase; TabSheet.Caption:= TMainMenu(C).Items[J].Caption; CriaChecks(FForm,TabSheet); End; End; End; End;end;

procedure CriaBotoes(FForm: TForm);Var I, Index: Integer; C: TComponent;begin With FForm do For I := 0 To ComponentCount - 1 do Begin C:= Components[I]; If (C is TActionList) And (TActionList(C).Tag > 0) Then Begin Index:= TActionList(C).Tag - 1; BtgBase.Items.Insert(Index); BtgBase.Items[Index].Caption:= TActionList(C).Name; BtgBase.Items[Index].Action:= acAcoes.Actions[Index]; acAcoes.Actions[Index].ImageIndex:= Index; If fVERSAO > 0 Then acAcoes.Actions[fVERSAO - 1].ImageIndex:= fVERSAO + acAcoes.ActionCount - 1; End; End;end;

Na criação das abas de nossa tela de controle nos baseamos nos itens do Menu, conforme imagem 6, na mesma rotina temos o procedimento ‘CriaChe-cks’ que como o próprio nome diz irá criar os Checks que utilizaremos para

Page 17: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 17

Listagem 10 – Procedimento Cria Checks.

Listagem 11 – OnClick.

Listagem 12 – Procedimento Altera Versão.

marcar e desmarcar as ações a serem utilizadas.

Procedure CriaChecks(FForm: TForm; TabSheet: TTabSheet);Var C: TComponent; I: Integer; Check: TCheckListBox;begin Check:= TCheckListBox.Create(Self); Check.Parent:= TabSheet; Check.Align:= alClient; Check.OnClickCheck:= OnClick; Check.Columns:= 3;

With FForm do For I := 0 To ComponentCount - 1 do Begin C:= Components[I]; If (C is TAction) And (C.Tag <> 0) And (TAction(C).ActionList.Tag = 1) then Begin If (TAction(C).GroupIndex = 1) And (TabSheet.Caption = ‘&Cadastros’) Then Check.Items.Add(IntToStr(TAction(C).Tag) + ‘ - ‘ + TAction(C).Caption); If (TAction(C).GroupIndex = 2) And (TabSheet.Caption = ‘&Financeiro’) Then Check.Items.Add(IntToStr(TAction(C).Tag) + ‘ - ‘ + TAction(C).Caption); If (TAction(C).GroupIndex = 3) And (TabSheet.Caption = ‘&Relatórios’) Then Check.Items.Add(IntToStr(TAction(C).Tag) + ‘ - ‘ + TAction(C).Caption); End; End;end;

Note que após a criação do TCheckListBox adicionamos o comando On-Click que irá atualizar as ações no banco de dados, codificação abaixo. Ainda no procedimento ‘CriaChecks’ veja que utilizamos o GroupIndex atribuído no início para dividir os itens em seus respectivos menus.

procedure OnClick(Sender: TObject);Var Cod, S: String; Id: Integer;begin S:= TCheckListBox(Sender).Items.Strings[TCheckListBox(Sender).ItemIndex]; Cod:= Trim(Copy(S,1,Pos(‘-’,S)-1)); If TryStrToInt(Cod,Id) Then Begin if cdsPadrao.Locate(‘ID_ITEM’, Id, []) Then Begin cdsPadrao.Edit; If TCheckListBox(Sender).Checked[TCheckListBox(Sender).ItemIndex] Then cdsPadraoATIVO.AsString := ‘V’ else cdsPadraoATIVO.AsString := ‘F’;

cdsPadrao.Post; End; End;end;

Concluindo este trecho voltamos a listagem 9 ‘CriaBotoes’, neste momento criamos os botões que utilizaremos para trocar de versão quando necessário, note que a ação e imagem são vinculadas ao botão através da Tag.

Os procedimentos citados até agora estão inseridos no evento OnShow de nosso formulário de controle o que demonstra que já criamos boa parte de nossa ferramenta apenas ao exibir o formulário.

Para finalizarmos este evento temos mais 2 comandos ‘AlteraVersao’ e ‘CapturaAcoes’, neste caso só vamos chamar o ‘AlteraVersao’ se as permissões não estiverem criadas no banco, note que passamos o parâmetro 1 para esse procedimento, pois, por ser a primeira vez a criar as permissões é necessário passar a ActionList padrão que já contem todas as ações, segue procedimento abaixo:

procedure AlteraVersao(Id_Versao: Integer);begin cdsPadrao.Close;

Page 18: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201518

Listagem 13 – Procedimento Grava ações.

Listagem 14 – Procedimento Captura Ações.

DM.sdsGenerico.Close; DM.sdsGenerico.CommandText:= ‘UPDATE VERSOES SET COD_VERSAO = ‘+IntToStr(Id_Versao); DM.sdsGenerico.ExecSQL; DM.sdsGenerico.Close;

fVERSAO:= CapturaVersao;

DM.sdsGenerico.Close; DM.sdsGenerico.CommandText:= ‘DELETE FROM PERMISSOES’; DM.sdsGenerico.ExecSQL; DM.sdsGenerico.Close;

cdsPadrao.Open; GravaAcoes(FrmPrincipal,fVERSAO); CapturaAcoes;end;

Primeiro atualizamos o código da versão, excluímos qualquer permissão que estiver na tabela e gravamos as ações. Note que há outro procedimento neste trecho o ‘GravaAcoes’, como o próprio nome diz ele será responsável por gravar as ações no banco e habilitar ou não dependendo da versão.

procedure GravaAcoes(FForm: TForm; Id_Versao: Integer);var I: Integer; C: TComponent;begin With FForm do Begin For I := 0 to ComponentCount - 1 do Begin C:= Components[I]; If (C is TAction) And (C.Tag <> 0) And (TAction(C).ActionList.Tag = 1) then If not cdsPadrao.Locate(‘ID_ITEM’, C.Tag, []) then Begin cdsPadrao.Append; cdsPadraoID_VERSAO.AsInteger := Id_Versao; cdsPadraoID_ITEM.AsInteger := C.Tag; cdsPadraoACAO.AsString := Copy(TAction(C).

Name,1,2) + Copy(TAction(C).Name,4,Length(TAction(C).Name)-3); cdsPadraoATIVO.AsString := ‘F’; cdsPadrao.Post; End; End;

For I := 0 to ComponentCount - 1 do Begin C:= Components[I]; If (C is TAction) And (C.Tag <> 0) And (TAction(C).ActionList.Tag = Id_Versao) then If cdsPadrao.Locate(‘ID_ITEM’, C.Tag, []) then Begin cdsPadrao.Edit; cdsPadraoATIVO.AsString := ‘V’; cdsPadrao.Post; End; End; End;end;

Podemos ver que há dois loops utilizando o For, porém, a diferença está nas condições do If. Primero temos que adicionar as ações independentes da versão, entretanto, note que passamos falso para todas as ações e no segundo loop é que ativamos ou não as ações seguindo a versão, após isso os dados já estão gravados em seu banco da forma que vimos na imagem 5.

Agora que os dados já estão no banco precisamos acessar os dados para sabermos o que está ou não liberado para uso para isso utilize o procedimento ‘CapturaAcoes’.

procedure CapturaAcoes;Var C: TComponent; I, Id, J: Integer; S, Cod: String;begin For I := 0 To ComponentCount - 1 do Begin C:= Components[I]; If (C is TCheckListBox) Then Begin

Page 19: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 19

Listagem 15 – OnClose.

Listagem 16 – AfterPost.

Listagem 17 – Botão Listar.

Listagem 18 – Procedimento Atualiza as ações.

For J := 0 to TCheckListBox(C).Count - 1 do Begin S:= TCheckListBox(C).Items.Strings[J]; Cod:= Trim(Copy(S,1,Pos(‘-’,S)-1)); If TryStrToInt(Cod,Id) Then If cdsPadrao.Locate(‘ID_ITEM’, Id, []) Then If cdsPadraoATIVO.AsString = ‘V’ Then TCheckListBox(C).Checked[J] := True else TCheckListBox(C).Checked[J]:= False; End; End; End;end;

Neste momento já estamos com a maior parte do projeto pronto só nos resta inserir alguns pequenos controles não menos importantes para o fun-cionamento do exemplo. Vamos iniciar com controles básicos:

procedure FormClose(Sender: TObject; var Action: TCloseAction);begin cdsPadrao.Close; Action:= TCloseAction.caFree;end;

procedure cdsPadraoAfterPost(DataSet: TDataSet);begin cdsPadrao.ApplyUpdates(0);end;

Outro detalhe importante está em nosso próximo comando, digamos que após nosso projeto pronto e rodando no cliente precisamos criar uma nova ação, simples não? Até o momento não teríamos essa possibilidade, pois, com as informações gravadas no banco de dados a verificação das ações não seria

realizada em nenhum momento, portanto, criamos um botão que será utilizado apenas para atualizar quando necessário, segue listagem abaixo:

Procedure sbtnListarClick(Sender: TObject);begin If MessageDlg(‘Deseja atualizar os requisitos ?’,mtConfirmation,[mbYes,mbNo],0) = mrYes Then Begin Try cdsPadrao.Refresh; Atualiza_Acoes(frmPrincipal,fVERSAO); CapturaAcoes; MessageDlg(‘Atualizado com Sucesso !’,mtInformation,[mbOK],0); Except On E: Exception Do MessageDlg(‘Falha ao Atualizar ‘+ E.Message,mtError,[mbOK],0); End; End;end;

Para atualizarmos os dados vamos seguir a sintaxe do procedimento de gravação, porém, neste caso já temos que passar a versão a ser utilizada evitando perder qualquer configuração que tenha sido realizada no cliente sem relação com o padrão, por exemplo, vamos supor que por padrão nossa versão bloqueie o acesso aos clientes, mas em uma empresa específica é so-licitada este recurso e você precise realmente liberar... É só liberar e pronto! Isso mesmo, mas quando for atualizar algum novo recurso o que aconteceria com essas configurações ‘personalizadas’ para cada cliente? Seriam perdidas! Pois, como vimos no processo de gravação sempre seguimos o padrão e diante destes fatores necessitamos de um comando apenas para atualizar.

procedure Atualiza_Acoes(FForm: TForm; Id_Versao: Integer);Var I: Integer; C: TComponent;begin With FForm do Begin For I := 0 to ComponentCount - 1 do Begin

Page 20: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201520

Listagem 19 – Executa ações.

Listagem 20 – Controla Acessos.

C:= Components[I]; If (C is TAction) And (C.Tag <> 0) And (TAction(C).ActionList.Tag = Id_Versao) then If not cdsPadrao.Locate(‘ID_ITEM’, C.Tag, []) then Begin cdsPadrao.Append; cdsPadraoID_VERSAO.AsInteger := Id_Versao; cdsPadraoID_ITEM.AsInteger := C.Tag; cdsPadraoACAO.AsString := Copy(TAction(C).Name,1,2) + Copy(TAction(C).Name,4,Length(TAction(C).Name)-3); cdsPadraoATIVO.AsString := ‘V’; cdsPadrao.Post; End; End; End;end;

Para finalizarmos as configurações não podemos esquecer-nos do coman-do de nossos botões, segue abaixo:

procedure acCompletoExecute(Sender: TObject);begin If MessageDlg(‘Deseja alterar a Versão ?’,mtConfirmation,[mbYes,mbNo],0) = mrYes Then Begin //Desabilita Botão Anterior acAcoes.Actions[fVERSAO - 1].ImageIndex:= fVERSAO - 1; AlteraVersao(TAction(Sender).Tag); //Habilita Botão Atual acAcoes.Actions[fVERSAO - 1].ImageIndex:= fVERSAO + acAcoes.ActionCount - 1; MessageDlg(‘Encerre a aplicação para efetivar as mudanças !’,mtWarning,[mbOK],0); End;end;

Imagem 14 – Alterar Versão.

Agora que está tudo configurado só nos resta controlarmos os acessos, portanto, segue nossa rotina de controle:

procedure ControlaAcessos(FForm: TForm);Var Acao: TAction; Id_Versao: Integer; Ativo: String;begin Try Id_Versao:= CapturaVersao; DM.sdsGenerico.Close; DM.sdsGenerico.CommandText := ‘SELECT * FROM PERMISSOES ‘ + ‘WHERE ID_VERSAO = ‘ + IntToStr(Id_Versao); DM.sdsGenerico.Open;

While not DM.sdsGenerico.Eof do Begin Acao := TAction(FForm.FindComponent(DM.sdsGenerico.FieldByName(‘ACAO’).AsString)); If Acao = nil then Begin Acao := TAction(FForm.FindComponent(Copy(DM.sdsGenerico.FieldByName(‘ACAO’).AsString, 1, Length(DM.sdsGenerico.FieldByName(‘ACAO’).AsString) - 2))); if Acao <> nil then if (Acao.HelpKeyword = ‘’) then Acao := nil; End;

If Acao <> nil then Begin Ativo:= DM.sdsGenerico.

Page 21: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 21

Listagem 21 – OnShow Principal.

FieldByName(‘ATIVO’).AsString; If Ativo = ‘V’ then Acao.Enabled := True else Acao.Enabled := False; End; DM.sdsGenerico.Next; End; Finally DM.sdsGenerico.Close; end;end;

Neste momento acessamos as permissões no banco de dados e através do nome das ações buscamos no formulário os componentes que possuem o mesmo nome para ativarmos ou não. Chame o comando no evento OnShow de seu formulário principal, segue exemplo:

procedure TFrmPrincipal.FormShow(Sender: TObject);begin [email protected]

Jeferson Silva de LimaConsultor The Club.

Sobre o autor

frmPermissoesPadrao.ControlaAcessos(FrmPrincipal);end;

Conclusão

Vimos como criar um controle de acesso sem a utilização de usuários, neste exemplo o foco está em criar versões diferentes do mesmo projeto de forma simples e funcional. Espero que tenham gostado desta dica e até a próxima!

Page 22: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201522

Neste mês irei compartilhar uma dúvida que me surgiu no transcorrer do desenvolvimento de um projeto: como implementar o uso do componente ListView existindo uma interação de dados, melhor dizendo, como embutir um componente EditText dentro do ListView. Precisei deste

recurso em meu projeto para criar uma tela de pesquisa de Produtos mais ágil, podendo interagir com o campo quantidade automaticamente. É importante lembrar que neste artigo terei como base o artigo “Android - Aprendendo a utilizar o ListView” do mês de Novembro de 2012 e mais outros pequenos trechos de códigos pesquisados na internet e modificados conforme a neces-sidade no momento.

Para quem nunca trabalhou com o componente “ListView” recomendo antes fazer uma leitura de nosso artigo citado acima, o qual aborda mais detalhadamente o funcionamento do mesmo.

Teremos também como base a implementação da classe “ArrayAdapter”, servindo para personalizar e montar o lay-out desejado.

Criando o Projeto

No primeiro momento deveremos inicializar um projeto Android padrão, clicando em “File/New/Android Application Project”, recomendo estar utilizan-do a versão “4” em diante. Este projeto irá conter os arquivos “MainActivity.java” e “activity_main.xml” (ambos criados automaticamente), até aqui não vimos nada de novo. Ver Imagem 01.

Veja a Figura 01: Exemplo Inicial.

Criando a Classe Produtos

Esta classe será responsável por atribuir e obter todos os produtos exis-tentes. Iremos alimentá-la manualmente para facilitar o aprendizado (Ressalto que poderemos alimentá-la de qualquer fonte de dados).

Ver abaixo a Listagem 01 comentada.

Android – ListView com Interação de dados

package com.example.android_listviewinteracao;

Figura 01: Exemplo Inicial.

Page 23: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 23

Listagem 01: Classe Produtos.

import java.util.ArrayList;import java.util.List;

Importaremos algumas bibliotecas, sendo a “java.util.ArrayList” e a “java.util.List” para utilizar o método ArrayList e List respectivamente, ambos para trabalhar com a classe “Produtos” mais adiante.

public class Produtos {

private static final long serialVersionUID = 1L; public int Id_Produto; public String Descricao; public Number Preco_Venda; public int Qtd;

Teremos os atributos Id_Produto (inteiro), Descricao (Texto), Preco_venda (Numérico) e Qtd (inteiro). Todos terão os métodos “Get” e “Set” implemen-tados a seguir.

public Produtos() { } No Construtor não colocaremos nenhuma codificação.

public int getId_Produto() { return Id_Produto; }

public void setId_Produto(int id_produto) { Id_Produto = id_produto; } public String getDescricao() { return Descricao; }

public void setDescricao(String descricao) { Descricao = descricao; } public Number getPreco_Venda() { return Preco_Venda; }

public void setPreco_Venda(Number preco_Venda) { Preco_Venda = preco_Venda; }

public int getQtd() { return Qtd; }

public void setQtd(int qtd) { Qtd = qtd; }

Já no método “ListarProdutos” iremos retornar dados do tipo “List<Produtos>”, ou seja, uma Lista de todos os produtos cadastrados. Veremos abaixo mais detalhadamente a inserção manual de alguns objetos nesta lista. Esta função irá nos servir para alimentar o ListView.

public List<Produtos> ListarProdutos() {List<Produtos> lista_produto = new ArrayList<Produtos>(); Produtos produto = new Produtos(); produto.setId_Produto(1); produto.setDescricao(“Arroz Prato Fino 5Kg”); produto.setPreco_Venda(9.80); lista_produto.add(produto); Produtos produto2 = new Produtos(); produto2.setId_Produto(2); produto2.setDescricao(“Feijão Carioquinha 1 kg”); produto2.setPreco_Venda(4.30); lista_produto.add(produto2); Produtos produto3 = new Produtos(); produto3.setId_

Page 24: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201524

Listagem 02. Código XML do ListView.

Produto(3);produto3.setDescricao(“Batata Elma Chips - Tamanho Família”); produto3.setPreco_Venda(2.99); lista_produto.add(produto3); Produtos produto4 = new Produtos(); produto4.setId_Produto(4); produto4.setDescricao(“Macarrão Orsi Espaguete”); produto4.setPreco_Venda(1.98); lista_produto.add(produto4); Produtos produto5 = new Produtos(); produto5.setId_Produto(5); produto5.setDescricao(“Azeite de Oliva 450 ml”); produto5.setPreco_Venda(7.56); lista_produto.add(produto5); Produtos produto6 = new Produtos(); produto6.setId_Produto(6);produto6.setDescricao(“Refrigerante Coca Cola 2 Litros Retornável”); produto6.setPreco_Venda(3.80); lista_produto.add(produto6); Produtos produto7 = new Produtos(); produto7.setId_Produto(7); produto7.setDescricao(“Água Mineral 1,5 litros”); produto7.setPreco_Venda(2.09); lista_produto.add(produto7); return lista_produto; } }

Criando o Lay-out do ListView “theclubadapter.xml”

Na Figura 02 teremos o lay-out proposto contendo os elementos: 3 com-ponentes TextView, sendo “txtProd”, “txtId_Produto” e “txtPreco” servindo para listar a Descrição, Id e Preço de Venda do Produto. Teremos também um EditText “edtQtd” para atribuir a quantidade do Produto.

Figura 02: Lay-Out ListView.

Com base no lay-out criado anteriormente teremos o código XML corres-pondente na Listagem 02.

<?xml version=”1.0” encoding=”utf-8”?><LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:id=”@+id/LinearLayout01” android:layout_width=”fill_parent” android:layout_height=”90dip” android:gravity=”right” android:orientation=”vertical” android:paddingBottom=”5dip” android:paddingTop=”5dip” tools:ignore=”InvalidId” > <LinearLayout android:id=”@+id/linearLayout02” android:layout_width=”match_parent” android:layout_height=”100dp” android:gravity=”right” android:orientation=”horizontal” > <LinearLayout android:id=”@+id/

Page 25: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 25

LinearLayout03” android:layout_width=”135dp” android:layout_height=”84dp” android:layout_weight=”0.99” android:orientation=”vertical” > <TextView android:id=”@+id/txtProduto” android:layout_width=”match_parent” android:layout_height=”30dp”android:text=”@string/txtprod”android:textAppearance=”?android:attr/textAppearanceLarge” /> <LinearLayout android:id=”@+id/linearLayout06” android:layout_width=”match_parent” android:layout_height=”wrap_content” > <TextView android:id=”@+id/txtId” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:gravity=”top” android:text=”@string/id_”android:textAppearance=”?android:attr/textAppearanceSmall” android:textSize=”15dp” android:typeface=”sans” /> <TextView android:id=”@+id/txtIdProduto” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:duplicateParentState=”true” android:text=”@string/txtid_produto”android:textAppearance= “?android:attr/

textAppearanceSmall” android:textSize=”15dp” android:typeface=”sans” /> </LinearLayout> <LinearLayout android:id=”@+id/linearLayout07” android:layout_width=”match_parent” android:layout_height=”wrap_content” > <LinearLayout android:id=”@+id/linearLayout08” android:layout_width=”wrap_content” android:layout_height=”match_parent” > <TextView android:id=”@+id/txtp1” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:gravity=”top” android:text=”P1:”android:textAppearance=”?android:attr/textAppearanceSmall” android:textSize=”15dp” android:typeface=”sans” /> <TextView android:id=”@+id/txtPreco1” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:duplicateParentState=”true” android:text=”txtPreco1” android:textAppearance= “?android:attr/textAppearanceSmall” android:textSize=”15dp” android:typeface=”sans” />

Page 26: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201526

<TextView android:id=”@+id/txtEspaco1” android:layout_width=”wrap_content”android:layout_height=”wrap_content” android:text=” “ android:textAppearance=”?android:attr/textAppearanceSmall” /> </LinearLayout> <LinearLayout android:id=”@+id/linearLayout09” android:layout_width=”wrap_content” android:layout_height=”match_parent” > <TextView android:id=”@+id/txtEspaco2” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=” “android:textAppearance=”?android:attr/textAppearanceSmall” /> </LinearLayout> </LinearLayout> </LinearLayout> <LinearLayout android:id=”@+id/LinearLayout05” android:layout_width=”82dp” android:layout_height=”90dp” android:orientation=”vertical” > <TextView android:id=”@+id/txtQtd” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Qtd:”android:textAppearance=”?android:attr/textAppearanceMedium” android:textSize=”20dp” /> <EditText

android:id=”@+id/edtQuantidade” android:layout_width=”79dp” android:layout_height=”40dp” android:layout_margin=”2dp” android:inputType=”numberDecimal” android:singleLine=”true”android:textAppearance=”?android:attr/textAppearanceLarge” android:typeface=”sans” > </EditText> </LinearLayout> </LinearLayout> </LinearLayout>

Criando e Codificando a Activity “theclubadapter.java”

Na atividade “theclubadapter.java” iremos concentrar todo o compor-tamento do componente criado anteriormente. Iremos herdar da classe “ArrayAdapter” e sobrescreveremos o método “getView”, necessário para atribuirmos os dados. Ver Listagem 03 comentada.

package com.example.android_listviewinteracao;

import java.util.List;import android.annotation.SuppressLint;import android.content.Context;import android.text.Editable;import android.text.TextWatcher;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.TextView;

Faremos o uso de algumas bibliotecas citadas no bloco de código acima.

public class theclubadapter extends ArrayAdapter<Produtos>{

Como foi dito, esta classe irá herdar da classe ArrayAdapter, tendo como objeto “Produtos” (Classe criada para esta ocasião).

private final LayoutInflater inflater;

Page 27: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 27

private final int resourceId; private List<Produtos> produtoitems;

O atributo do tipo “LayoutInflater” chamado “inflater” será responsável por “inflar” nosso listview com os dados do Contexto. Já o atributo inteiro “resourceId” receberá o próprio lay-out “theclubadaper”. Por último temos um List<Produtos>, variável responsável por armazenar todos os objetos do tipo Produto.

public theclubadapter(Context context, int resource, List<Produtos> produtos) { super(context, resource, produtos); this.inflater = LayoutInflater.from(context); this.resourceId = resource; this.produtoitems = produtos; }

Serão todos atribuídos no Construtor de nossa classe. Lembrando que com o método “super” estamos chamado o método de nossa classe pai. Antes de partirmos para os comentários referentes ao método “getView”, será necessário descrever a classe estática “ProdutosRepositorio” e mais outros dois métodos chamados “setupItem” e “setVal1TextChangeListener”.

public static class ProdutosRepositorio { Produtos produtos; TextView txtProduto; TextView txtIdProduto; TextView txtPreco1; EditText edtQtd; }

A classe pública estática “ProdutosRepositório” será composta por todos os membros do ListView mais a classe Produtos. Faremos o uso desta classe para ter um maior controle sobre a indexação dos registros localizados no ListView.

private void setupItem(ProdutosRepositorio repositorio) { repositorio.txtProduto.setText(repositorio.produtos.Descricao); repositorio.txtIdProduto.setText(String.valueOf(repositorio.produtos.Id_Produto));

repositorio.txtPreco1.setText(String.valueOf(repositorio.produtos.Preco_Venda)); String Qtd = String.valueOf(repositorio.produtos.getQtd()); if (Qtd.equals(“0”)) repositorio.edtQtd.setText(“”); else repositorio.edtQtd.setText(String.valueOf(repositorio.produtos.getQtd())); } Neste método atribuimos todos os dados com origem da classe “ProdutosRepositorio”.

private void setVal1TextChangeListener(final ProdutosRepositorio repositorio) { repositorio.edtQtd.addTextChangedListener(new TextWatcher() {

@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

@Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(s.toString().length()>0) repositorio.produtos.setQtd(Integer.parseInt(s.toString()); }

@Override public void afterTextChanged(Editable s) { } }); }}

Page 28: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201528

Listagem 03: Tela Principal.

No método “setVal1TextChangeListener” do componente EditText “Quan-tidade”, comparamos se o mesmo possui algum valor para logo em seguida alimentarmos com o valor corrente. Utilizamos para isto o método sobrescrito “OntextChanged”.

@Override public View getView(int position, View convertView, ViewGroup parent) { ProdutosRepositorio repositorio = null;

convertView = inflater.inflate(resourceId, parent, false); repositorio = new ProdutosRepositorio(); repositorio.produtos = produtoitems.get(position);repositorio.txtProduto = (TextView) convertView.findViewById(R.id.txtProduto);repositorio.txtIdProduto = (TextView) convertView.findViewById(R.id.txtIdProduto);repositorio.txtPreco1 = (TextView) convertView.findViewById(R.id.txtPreco1);repositorio.edtQtd = (EditText) convertView.findViewById(R.id.edtQuantidade); setVal1TextChangeListener(repositorio); convertView.setTag(repositorio); setupItem(repositorio);

return convertView; }

Após uma abordagem da classe e das funções utilizadas, podemos finalizar

com o método sobrescrito “getView”, o qual fará todo o trabalho “pesado” de nossa classe. Ele será invocado toda vez que atualizarmos nosso Listview, obtendo uma visão (view) para os dados na posição especificada no conjunto de dados. Importante salientar que podemos criar um modo de exibição ma-nualmente ou inflá-lo a partir de um arquivo de layout XML. Teremos como parâmetro a variável “Position” para nos retornar um valor inteiro da posição do item do Listview, a “ConvertView” do tipo “View” para retornamos com as modificações necessárias e por fim a “ViewGroup” chamada “Parent” que será recuperada como parâmetro o tipo de “Layout”, por exemplo o “LinearLayout”.

1º Passo – Alimentaremos nossa “View” através do método já comentado “inflate”.

2º Passo - Vamos criar uma variável “repositorio” do tipo “ProdutosRepo-sitorio” para atribuirmos todos os componentes utilizados.

3º Passo – Disparamos o método “setVal1TextChangeListener(repositorio)”.4º Passo – Utilizamos o método “convertView.setTag(repositorio)” para

salvar o “ProdutosReposito” como uma View.5º Passo – Setamos os valores e retornamos a view para ser utilizada.

Criando o Lay-out “activity_main.xml”

Este será o “lay-out” principal, o qual irá fazer referência ao nosso “Lis-tview” personalizado. Devemos inserir um ListView e um Button (o qual irá listar e carregar os produtos com quantidade maior que zero). Ver Imagem 03.

Figura 03: Lay-out principal.

O código XML é bem simples, podendo ser conferido na listagem 03.

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” xmlns:tools=”http://schemas.android.com/tools” android:layout_width=”match_parent” android:layout_height=”match_parent” android:gravity=”center” android:orientation=”vertical” android:paddingBottom=”@dimen/activity_vertical_margin” android:paddingLeft=”@dimen/activity_horizontal_margin” android:paddingRight=”@dimen/activity_horizontal_

Page 29: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 29

margin” android:paddingTop=”@dimen/activity_vertical_margin” tools:context=”.MainActivity” > <ListView android:id=”@+id/listViewProdutos” android:layout_width=”match_parent” android:layout_height=”600dp” > </ListView> <Button android:id=”@+id/btnConfirmar” android:layout_width=”120dp” android:layout_height=”50dp” android:onClick=”Confirmar” android:text=”Confirmar” /></LinearLayout>

Codificando a Activity “MainActivity.java”

Para entendermos um pouco mais, esta atividade ficará responsável por atribuir ao ListView o “theclubAdapter.xml” e alimentá-lo através da classe “Produtos.java”. Ao clicar no botão confirmar faremos uma varredura no mesmo para identificarmos os itens que possuem o valor maior que zero para o campo quantidade. Atribuiremos na classe “Produtos” com auxílio dos métodos “Sets” e em seguida disponibilizaremos através de uma Lista podendo ser obtidos através dos métodos “Gets”. (Neste caso poderíamos tanto utilizar estes dados nesta mesma Atividade quanto em uma outra qualquer passando o objeto por parâmetro).

package com.example.android_listviewinteracao;

import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.app.AlertDialog;import android.view.View;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;

Importaremos algumas bibliotecas necessárias para o bom funcionamento.

public class MainActivity extends Activity { Button btnConfirmar; ListView listViewProdutos; ArrayAdapter<Produtos> adapter;

Teremos três variáveis, as duas primeiras são: uma do tipo “Button” e outra “ListView” (ambas fazem referências aos componentes visíveis em nosso XML). A variável “ArrayAdapter<Produtos>” irá armazenar toda a nossa classe personalizada.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); InicializaListeners(); ListarTheClubAdapter(); }

public void InicializaListeners() {listViewProdutos = (ListView) findViewById(R.id.listViewProdutos); btnConfirmar = (Button) findViewById(R.id.btnConfirmar); } public void ListarTheClubAdapter() { Produtos produtos = new Produtos(); List<Produtos> lista_produtos = produtos.ListarProdutos(); adapter = new theclubadapter(this, R.layout.theclubadapter, lista_produtos); listViewProdutos.setAdapter(adapter); }

No método “Oncreate” apenas inicializaremos nossos Componentes e através do “ListarTheClubAdapter” instanciaremos a classe “Produtos” para disparar o método “ListarProdutos”. A variável “adapter” irá receber a classe “theclubadapter” com os parâmetros de entrada: Contexto, tipo de layout e todos os dados em forma de lista.

private void MensagemInformativa(String mensagen) { new AlertDialog.Builder(this) .setTitle(“The Club”) .setMessage(mensagen) .setPositiveButton(“OK”, null) .setCancelable(false) .show(); }

Page 30: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março201530

Achei mais didádico criar uma função chamada “MensagemInformativa” com o auxílio da classe “Builder” para informar ao usuário todos os registros com quantidade maior que zero.

public void Confirmar(View view) {ArrayList<Produtos> produtosporquantidade = new ArrayList<Produtos>(); for(int i=0;i<adapter.getCount();i++) { int qtd = adapter.getItem(i).Qtd; if (qtd > 0) { Produtos pro = new Produtos(); pro.setId_Produto(adapter.getItem(i).Id_Produto); pro.setDescricao(adapter.getItem(i).Descricao); pro.setPreco_Venda(adapter.getItem(i).Preco_Venda); pro.setQtd(adapter.getItem(i).Qtd); produtosporquantidade.add(pro); } } for (int i = 0; i < produtosporquantidade.size(); i++) { MensagemInformativa(“Id: “+ String.valueOf(produtosporquantidade.get(i).getId_Produto()) + “ Descrição: “+ String.valueOf(produtosporquantidade.get(i).getDescricao()) + “ Preço Venda: “+ String.valueOf(produtosporquantidade.get(i).getPreco_Venda()) + “ Quantidade: “+ String.valueOf(produtosporquantidade.get(i).getQtd())); } }}

Por fim o método “Confirmar” será disparado no evento “OnClick” do botão. Possuiremos duas etapas, sendo: um laço para alimentar nossa classe e o outro para carregar todos os dados atribuídos na mesma.

Teremos uma ideia geral de nosso aplicativo conferindo a Figura 04.

Figura 04: Exemplo funcionando.

Conclusões

Caros programadores, a ideia geral desta dica transformada em artigo foi de poder demonstrar como devemos proceder com o desenvolvimento de um componente específico para a plataforma Android, no nosso caso um ListView. O detalhe que não podemos esquecer é que este ListView poderá tanto “listar” informações de uma classe ou Banco de Dados quanto atribuir novos valores para o mesmo. Podemos utilizar exemplos deste tipo em um Pedido de Venda, agilizando no processo de escolha de um ou mais produtos. Poderíamos ter implementado também um “EditText” para o Preço de Venda sem muito trabalho. Fica aí a dica, um abraço e até o mês que vem!

[email protected]

Thiago Cavalheiro Montebugnoliadora aprender novas tecnologias. Formado pela Faculdade de Tecnologia de Botucatu

– 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 Prefeitura Municipal de Itaí-SP é colunista mensal da Revista The Club Megazine e é consultor Técnico do The Club. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer e MCSD - Microsoft Certified Solution Developer.

Sobre o autor

Page 31: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015 05

Page 32: The Club - megazine · março 2015 05 A chegada das redes sociais facilitou um pouco a vida do usuário na questão de cadastros em sites. Você não precisa mais deco- rar um novo

março2015