tag:blogger.com,1999:blog-11397562384950613862024-03-05T03:55:40.989-08:00Escola de AndroidMarcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.comBlogger51125tag:blogger.com,1999:blog-1139756238495061386.post-420714139818615692012-06-12T17:38:00.000-07:002012-06-12T17:38:29.537-07:00Efetuando download via FTPOlá pessoal,<br />
<br />
Hoje vou mostrar como acessar um servidor FTP, utilizando android vou criar uma classe client FTP completa com todas as funcionalidades que você irá precisar como por exemplo listar arquivos, excluir, mudar de diretório, mas no exemplo prático será apresentada a rotina para efetuar um download via FTP.<br />
<br />
Como de costume vou apresentar todos os fontes utilizados já com comentários para facilitar no aprendizado.
<br />
<br />
Abaixo segue um print dos arquivos do projeto:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR8pbcDI27tLRCAEfkWs4J-5LsTz9c24O9XteOFRHuao3Vt5j5Ff7d0h3Aj53VSqAtGjcKuKsHo_IXiwBeFtk3a8h1q8SxhBsPO00s_tr-r7QB6Bd8bmkOxjGwaQ_OYwDlFPQmsbVTDfyY/s1600/projeto.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR8pbcDI27tLRCAEfkWs4J-5LsTz9c24O9XteOFRHuao3Vt5j5Ff7d0h3Aj53VSqAtGjcKuKsHo_IXiwBeFtk3a8h1q8SxhBsPO00s_tr-r7QB6Bd8bmkOxjGwaQ_OYwDlFPQmsbVTDfyY/s400/projeto.png" width="295" /></a></div>
<br />
<br />
Abaixo segue o arquivo clsFTP.java<br />
<pre class="brush: java">package br.com.EscolaDeAndroid.FTP;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import android.util.Log;
public class clsFTP {
FTPClient mFtp;
private String TAG = "clsFTP";
//Listar os arquivos e diretórios de um determinado caminho
public FTPFile[] Dir(String pDiretorio)
{
try {
FTPFile[] ftpFiles = mFtp.listFiles(pDiretorio);
return ftpFiles;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível listar os arquivos e pastas do diretório " + pDiretorio + ". " + e.getMessage());
}
return null;
}
//Pegar o nome do diretório corrente
public String DiretorioCorrente()
{
try {
String workingDir = mFtp.printWorkingDirectory();
return workingDir;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível obter o diretório atual. " + e.getMessage());
}
return null;
}
//Mudar de diretório
public boolean MudarDiretorio(String pDiretorio)
{
try {
mFtp.changeWorkingDirectory(pDiretorio);
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível mudar o diretório para " + pDiretorio);
}
return false;
}
//Criar um diretório
public boolean CriarDiretorio(String pDiretorio)
{
try {
boolean status = mFtp.makeDirectory(pDiretorio);
return status;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível criar o diretório " + pDiretorio);
}
return false;
}
//Excluir um diretório
public boolean RemoveDiretorio(String pDiretorio)
{
try {
boolean status = mFtp.removeDirectory(pDiretorio);
return status;
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível remover o diretório " + pDiretorio);
}
return false;
}
//Deletar arquivo
public boolean Delete(String pArquivo)
{
try {
boolean status = mFtp.deleteFile(pArquivo);
return status;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
//Renomear arquivo
public boolean Rename(String from, String to)
{
try {
boolean status = mFtp.rename(from, to);
return status;
} catch (Exception e) {
Log.e(TAG, "Erro: Não pode renomear o arquivo: " + from + " para: " + to);
}
return false;
}
//Baixar um arquivo do servidor FTP
public boolean Download(String pDiretorioOrigem, String pArqOrigem, String pArqDestino)
{
boolean status = false;
try {
MudarDiretorio(pDiretorioOrigem);
//Cria o outputStream para ser passado como parametro
FileOutputStream desFileStream = new FileOutputStream(pArqDestino);;
//Tipo de arquivo
mFtp.setFileType(FTP.BINARY_FILE_TYPE);
//http://commons.apache.org/net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalActiveMode()
mFtp.enterLocalPassiveMode();
//Faz o download do arquivo
status = mFtp.retrieveFile(pArqOrigem, desFileStream);
//Fecho o output
desFileStream.close();
return status;
} catch (Exception e) {
Log.e(TAG, "Erro: Falha ao efetuar download. " + e.getMessage());
}
return status;
}
//Enviar arquivo para o servidor FTP
public boolean Upload(String pArqOrigem, String pArqDestino, String pDiretorioDestino)
{
boolean status = false;
try {
FileInputStream srcFileStream = new FileInputStream(pArqOrigem);
//muda o diretório para o destino específico
if (MudarDiretorio(pDiretorioDestino)) {
status = mFtp.storeFile(pArqDestino, srcFileStream);
}
srcFileStream.close();
return status;
} catch (Exception e) {
Log.e(TAG, "Erro: Falha ao efetuar Upload. " + e.getMessage());
}
return status;
}
//Encerrar a conexão com o servidor FTP
public boolean Desconectar()
{
try {
//mFtp.logout();
mFtp.disconnect();
mFtp = null;
return true;
} catch (Exception e) {
Log.e(TAG, "Erro: ao desconectar. " + e.getMessage());
}
return false;
}
//Efetuar conexão com o servidor FTP
public boolean Conectar(String pHost, String pUsuario, String pSenha, int pPorta)
{
try {
mFtp = new FTPClient();
// conectando no host
mFtp.connect(pHost, pPorta);
//verifica se a conexão está ok
if (FTPReply.isPositiveCompletion(mFtp.getReplyCode())) {
//efetua login
boolean status = mFtp.login(pUsuario, pSenha);
mFtp.setFileType(FTP.BINARY_FILE_TYPE);
mFtp.enterLocalPassiveMode();
return status;
}
} catch(Exception e) {
Log.e(TAG, "Erro: não foi possível conectar ao host " + pHost);
}
return false;
}
}
</pre>
<br />
Abaixo segue o arquivo TesteFTPActivity.java:<br />
<pre class="brush: java">package br.com.EscolaDeAndroid.FTP;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.EditText;
import android.widget.Toast;
public class TesteFTPActivity extends Activity {
clsFTP mClienteFTP;
EditText editText;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText = (EditText)findViewById(R.id.editText1);
String lstrArq = "";
try {
mClienteFTP = new clsFTP();
//Definindo o nome do arquivo que será gravado no SD
lstrArq = "/teste2.txt";
File lArquivo = new File(Environment.getExternalStorageDirectory(), lstrArq);
mClienteFTP.Conectar("ftp.seuendereco.com", "usuario", "senha", 21);
//Faz o download do arquivo passando o nome dele(dentro o servidor) e local onde ele vai ser guardado
mClienteFTP.Download("/nomedapasta", "teste.txt", lArquivo.toString());
//Desconecta do ftp
mClienteFTP.Desconectar();
//Efetua a leitura do arquivo
FileReader fileReader= new FileReader(lArquivo);
BufferedReader leitor= new BufferedReader(fileReader);
String linha = null;
//Loop para ler e carregar o editText
while((linha = leitor.readLine()) != null) {
editText.append(linha);
}
leitor.close();
fileReader.close();
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
}
</pre>
<br />
Abaixo segue o arquivo AndroidManifest.xml, onde deveremos adicionar as permissões para acessar a internet e gravar no SD:<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscolaDeAndroid.FTP"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".TesteFTPActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
</pre>
<br />
Abaixo segue o arquivo main.xml:<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:ems="10" >
<requestFocus />
</EditText>
</LinearLayout>
</pre>
<br />
Por enquanto é isso pessoal, espero que seja útil esse projeto para vocês, e caso necessitem, por exemplo, enviar um arquivo via FTP, dentro da classe clsFTP.java já possui esse e outros métodos.<br />
<br />
<br />
<br />
<div>
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!<br />Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com14tag:blogger.com,1999:blog-1139756238495061386.post-3725793472753851712012-05-10T17:32:00.000-07:002012-05-10T17:32:43.468-07:00Criando um Custom Dialog<br />
Olá Pessoal,<br />
<br />
<br />
Hoje vou mostrar como criar um Custom Dialog, este recurso pode ser utilizado quando você quer criar uma tela modal.<br />
<br />
Abaixo segue um print do projeto utilizado.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtIcVycjBUnlrMNKfjVqyRiwfRhaF9DbLI_EZsHDUCaueHOp10Y86c8KFsq74OPEQhRRIUxNdjj6Fuf-TlIydvQq9hIUxg1sVWUR3b4KYHIDSGck4dvU3qW65oY_UjAKOIdDVb9fuRLiYd/s1600/projeto.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtIcVycjBUnlrMNKfjVqyRiwfRhaF9DbLI_EZsHDUCaueHOp10Y86c8KFsq74OPEQhRRIUxNdjj6Fuf-TlIydvQq9hIUxg1sVWUR3b4KYHIDSGck4dvU3qW65oY_UjAKOIdDVb9fuRLiYd/s400/projeto.PNG" width="303" /></a></div>
<br />
Como de costume vou apresentar todos os fontes utilizados já com comentários para facilitar no aprendizado.<br />
<br />
Arquivo main.xml
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Retorno do custom dialog:"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/etRetorno"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/btnChamarDialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Chamar Dialog"
android:onClick="ChamarDialog_click"/>
</LinearLayout>
</pre>
<br />
Arquivo customdialog.xml
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
>
<TextView
android:id="@+id/tvMens"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_marginLeft="10dp"
android:text="Mensagem"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/etValor"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tvMens"
android:layout_below="@+id/tvMens"
android:layout_marginRight="10dp"
android:inputType="text"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/etValor"
android:orientation="horizontal"
android:background="#C4C4C4"
android:paddingTop="4dp"
android:layout_marginTop="10dp">
<Button
android:id="@+id/btn_Confirmar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Confirmar" />
<Button
android:id="@+id/btn_Cancelar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancelar" />
</LinearLayout>
</RelativeLayout>
</pre>
<br />
Arquivo CustomDialogActivity.java
<br />
<pre class="brush: java">package br.com.EscolaDeAndroid.CustomDialog;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class CustomDialogActivity extends Activity {
EditText etRetorno;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etRetorno = (EditText) findViewById(R.id.etRetorno);
}
//Método executado quando usuário clicar no botão
//Chamar Dialog
public void ChamarDialog_click(View v){
ExibeDialog();
}
private void ExibeDialog(){
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.customdialog);
//define o título do Dialog
dialog.setTitle("Busca de cliente:");
//instancia os objetos que estão no layout customdialog.xml
final Button confirmar = (Button) dialog.findViewById(R.id.btn_Confirmar);
final Button cancelar = (Button) dialog.findViewById(R.id.btn_Cancelar);
final EditText editText = (EditText) dialog.findViewById(R.id.etValor);
final TextView tvMens = (TextView) dialog.findViewById(R.id.tvMens);
tvMens.setText("Nome");
confirmar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
etRetorno.setText(editText.getText());
//finaliza o dialog
dialog.dismiss();
}
});
cancelar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//finaliza o dialog
dialog.dismiss();
}
});
//exibe na tela o dialog
dialog.show();
}
}
</pre>
<br />
Abaixo seguem o resultado de nosso projeto.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlICpuokQce8PyYQ6RLou6SQhnckBJCXBGrSmMNpEWQ2UvvSpSjRXlVXMbryplVAIIZ7B9aYhSU6p20cAhfxod2VAREAGDIEqtiXhwblcs5dfpqKo228ZzEq8oNlg3eM0uNuxyZI8iCGf/s1600/main.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="" border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlICpuokQce8PyYQ6RLou6SQhnckBJCXBGrSmMNpEWQ2UvvSpSjRXlVXMbryplVAIIZ7B9aYhSU6p20cAhfxod2VAREAGDIEqtiXhwblcs5dfpqKo228ZzEq8oNlg3eM0uNuxyZI8iCGf/s400/main.PNG" title="Main" width="243" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxy_oMxX_HUb9XqzLcNgYcvCnh6tWDpFOQw40PSNhSNhx14Sbw8C-ZzXiP2PpHUlCviKd0RY2jk3GNe5gfjp6mJDzHqM8Meq-uCKxjdm_Zv0dzR9tJg9seAyzuFdNX1T3vekhwaSgdm03h/s1600/Custom_Dialog.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxy_oMxX_HUb9XqzLcNgYcvCnh6tWDpFOQw40PSNhSNhx14Sbw8C-ZzXiP2PpHUlCviKd0RY2jk3GNe5gfjp6mJDzHqM8Meq-uCKxjdm_Zv0dzR9tJg9seAyzuFdNX1T3vekhwaSgdm03h/s400/Custom_Dialog.PNG" title="Custom Dialog" width="243" /></a></div>
<br />
<br />
Espero que seja útil para vocês este post e em breve estarei postando novidades.<br />
<br />
<br />
<div>
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com5tag:blogger.com,1999:blog-1139756238495061386.post-45061076989427133002012-05-08T17:40:00.000-07:002012-05-08T17:40:53.075-07:00Utilizando Shadow em TextViewOlá Pessoal,
<br />
<br />
<br />
Hoje vou mostrar como utilizar sombra (shadow) em nossos textviews, esse é um recusro muito interessante na questão visual principalmente por evitar utilizar uma imagem somente para criar um visual mais elaborado em nossos aplicativos.<br />
<br />
Antes já vou explicar os principais atributos da sombra (shadow):<br />
<br />
<b>android:shadowColor</b> - cor que será utilizada na sombra.<br />
<br />
<b>android:shadowDx</b> - define a posição horizontal da sombra, informando um valor negativo a sombra será alinhada a esquerda, informando um valor positivo a sombra será alinha a direita.<br />
<br />
<b>android:shadowDy</b> - define a posição vertical da sombra, informando um valor negativo a sombra será alinhada para baixo, informando um valor positivo a sombra será alinha para cima.<br />
<br />
<b>android:shadowRadius</b> - define o grau do esfumaçado da sombra, quanto maior o número mais esfumaçado será a sombra.<br />
<br />
<br />
Abaixo seguem alguns exemplos de sombra.<br />
<br />
Arquivo main.xml
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#EBEBEB" >
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - baixo direita"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="3"
android:shadowDy="3" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - baixo"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="0"
android:shadowDy="3" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - baixo esquerda"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="-3"
android:shadowDy="3" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - esquerda"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="-3"
android:shadowDy="0" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - superior esquerda"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="-3"
android:shadowDy="-3" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - superior"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="0"
android:shadowDy="-3" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - superior direita"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="3"
android:shadowDy="-3" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - direita"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="1"
android:shadowColor="#F13000"
android:shadowDx="3"
android:shadowDy="0" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - centro"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="3"
android:shadowColor="#F13000"
android:shadowDx="0"
android:shadowDy="0" />
<TextView
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Escola de Android - simples"
android:textColor="#000000"
android:textSize="18sp"
android:shadowRadius="0.01"
android:shadowColor="#F13000"
android:shadowDx="3"
android:shadowDy="3" />
</LinearLayout>
</pre>
<br />
<br />
Abaixo segue o resultado de nosso teste:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_55iBs3yYoB_CkHNfO4Ejim7oN8fzf-IUn6SvdnfrE2YdSJ143M2mskgTjt4mPxgw4zl4u99zu6lXe9pb5wItGYEC9yYzQLVafsMkG-dj4jp-NYyvbr-Fm4cGgD6qehnEV9RIuUYrwYqM/s1600/shadow.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_55iBs3yYoB_CkHNfO4Ejim7oN8fzf-IUn6SvdnfrE2YdSJ143M2mskgTjt4mPxgw4zl4u99zu6lXe9pb5wItGYEC9yYzQLVafsMkG-dj4jp-NYyvbr-Fm4cGgD6qehnEV9RIuUYrwYqM/s640/shadow.png" title="Shadow" width="388" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Shadow</td></tr>
</tbody></table>
<br />
Por enquanto é isso pessoal, com mais essa técnica podemos melhorar ainda nossas interfaces com o usuário e com isso criar aplicativos de maior qualidade.<br />
<br />
<br />
<div>
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com0tag:blogger.com,1999:blog-1139756238495061386.post-26991399929965896192012-04-29T10:46:00.000-07:002012-05-08T17:41:44.567-07:00Android - Criando um Splash Screen<br />
<div>
Olá Pessoal,<br />
<br />
Hoje vou apresentar como criar um Splash Screen para nosso aplicativos, isso é muito importante no quesito visual de seu aplicativo, principalmente quando você quiser impressionar seu cliente.<br />
<br />
Abaixo segue um print do projeto.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5RfDAVFBphZ74M1P_9-K0bPdS5P4OHjEj_u84ZbEWdVANLnQmDFKDxH-XC1OvUMJRdldY3giisBIBNNokBN68hKehLYWdwHuG50-yC1JAUUTdzETLq-m5gOeAnfRPS5Uxg2gKNQ9nZ3VC/s1600/projeto.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5RfDAVFBphZ74M1P_9-K0bPdS5P4OHjEj_u84ZbEWdVANLnQmDFKDxH-XC1OvUMJRdldY3giisBIBNNokBN68hKehLYWdwHuG50-yC1JAUUTdzETLq-m5gOeAnfRPS5Uxg2gKNQ9nZ3VC/s400/projeto.PNG" width="272" /></a></div>
<br />
<br />
Abaixo seguem os fontes utilizados no projeto.<br />
<br />
Arquivo AndroidManifest.xml
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscolaDeAndroid"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".SplashScreen"
android:theme="@android:style/Theme.NoTitleBar"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Principal" android:label="@string/app_name"/>
</application>
</manifest>
</pre>
<br />
Arquivo main.xml
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:text="Menu principal">
</TextView>
</LinearLayout>
</pre>
<br />
Arquivo splashscreen.xml
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/imagem">
</ImageView>
</LinearLayout>
</pre>
<br />
Arquivo SplashScreen.java
<br />
<pre class="brush: java">package br.com.EscolaDeAndroid;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
public class SplashScreen extends Activity{
private Thread mSplashThread;
private boolean mblnClicou = false;
/** Evento chamado quando a activity é executada pela primeira vez */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
//thread para mostrar uma tela de Splash
mSplashThread = new Thread() {
@Override
public void run() {
try {
synchronized(this){
//Espera por 5 segundos or sai quando
//o usuário tocar na tela
wait(5000);
mblnClicou = true;
}
}
catch(InterruptedException ex){
}
if (mblnClicou){
//fechar a tela de Splash
finish();
//Carrega a Activity Principal
Intent i = new Intent();
i.setClass(SplashScreen.this, Principal.class);
startActivity(i);
}
}
};
mSplashThread.start();
}
@Override
public void onPause()
{
super.onPause();
//garante que quando o usuário clicar no botão
//"Voltar" o sistema deve finalizar a thread
mSplashThread.interrupt();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//o método abaixo está relacionado a thread de splash
synchronized(mSplashThread){
mblnClicou = true;
//o método abaixo finaliza o comando wait
//mesmo que ele não tenha terminado sua espera
mSplashThread.notifyAll();
}
}
return true;
}
}
</pre>
<br />
Arquivo Principal.java
<br />
<pre class="brush: java">package br.com.EscolaDeAndroid;
import android.app.Activity;
import android.os.Bundle;
public class Principal extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
</pre>
<br />
Imagem utilizada no sistema, colocar na pastas drawable-hdpi:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOzLS251DRjLXBlYiKpKdOTSuQjb1kj1ktaT0YQAGm2ZG9b47d6ooDRdRR2P5s7ha5czZKhRMB_TS-fEdz6bzBQy-29rWdb3IyCoGtMbTp-LeTnMYX5FDVqWERidNNjIo8b-c42YnshPeH/s1600/imagem.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOzLS251DRjLXBlYiKpKdOTSuQjb1kj1ktaT0YQAGm2ZG9b47d6ooDRdRR2P5s7ha5czZKhRMB_TS-fEdz6bzBQy-29rWdb3IyCoGtMbTp-LeTnMYX5FDVqWERidNNjIo8b-c42YnshPeH/s1600/imagem.PNG" /></a></div>
<br />
Abaixo segue o resultado de nosso aplicativo:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmV49-QY5PEXwlNjoqJZ8uTH7-7X9JbWTYwXHEeGX7Pe7Q9-BobJRLji0V-nnxv8q4JmjHKR1U9XcDBheyCE4JKKQ97bdXa2_a8zKY4YmJowmJEGvv4Qw8975M3Qrrl6DXLT_woCcA154x/s1600/splash.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmV49-QY5PEXwlNjoqJZ8uTH7-7X9JbWTYwXHEeGX7Pe7Q9-BobJRLji0V-nnxv8q4JmjHKR1U9XcDBheyCE4JKKQ97bdXa2_a8zKY4YmJowmJEGvv4Qw8975M3Qrrl6DXLT_woCcA154x/s400/splash.PNG" title="Splash Screen" width="242" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Splash Screen</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7o8ReI39ckNnk_FLBW07_YCcx9EknKQXeSoB4V_P79aGMMUNsiROBl261mD_in2CMIFrmLyjLyr4itbWagZyv858LvPlYTNSBoEpfBOCTrVQHLg7uoRoIOPydo-amuyf1mvBh2K7olqtp/s1600/principal.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7o8ReI39ckNnk_FLBW07_YCcx9EknKQXeSoB4V_P79aGMMUNsiROBl261mD_in2CMIFrmLyjLyr4itbWagZyv858LvPlYTNSBoEpfBOCTrVQHLg7uoRoIOPydo-amuyf1mvBh2K7olqtp/s400/principal.PNG" title="Menu Principal" width="243" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Menu Princpal</td></tr>
</tbody></table>
<br />
O sistema apresentará a tela de Splash Screen por 5 segundos, ou até o usuário tocar na tela, em seguida será exibida a tela "Principal".<br />
<br />
Caso o usuário clique no botão "Voltar" enquanto está sendo exibida a tela Splash Screen, o sistema será encerrado.<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com5tag:blogger.com,1999:blog-1139756238495061386.post-3786585853876979252012-04-29T08:54:00.001-07:002012-04-29T08:54:19.170-07:00Android - Obter nome e versão do aplicativo<br />
<div>
Olá Pessoal,<br />
<br />
Hoje vou mostrar como obter informações simples mas muito úteis de seu aplicativo como, por exemplo, pegar automaticamente o nome do aplicativo, packagename, código da versão do aplicativo e o nome da versão.<br />
<br />
Essas informações são úteis, por exemplo, em uma tela "Sobre" ou "Splash" que exiba a versão de seu sistema para o usuário, isso facilita bastante no processo de manutenção, quando você desenvolvedor precisa saber se o usuário atualizou o sistema.<br />
<br />
Bem, como de costume vou apresentar todos os fontes necessário para este exemplo, e como todos já devem saber, todos os fontes seguem com comentários para facilitar no processo de aprendizagem.<br />
<br />
Arquivo AndroidManifest.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscolaDeAndroid.Informacoes"
android:versionCode="1"
android:versionName="Sanduiche de sorvete" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".InformacoesActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
</pre>
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Nome do aplicativo:"
android:background="@android:color/darker_gray"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/tvAppName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
/>
<TextView
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Nome do package:"
android:background="@android:color/darker_gray"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/tvPackageName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
/>
<TextView
android:id="@+id/textView3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Código da versão:"
android:background="@android:color/darker_gray"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/tvVersionCode"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
/>
<TextView
android:id="@+id/textView4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Nome da versão:"
android:background="@android:color/darker_gray"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/tvVersionName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
/>
</LinearLayout>
</pre>
<br />
Arquivo InformacoesActivity.java<br />
<pre class="brush: java">package br.com.EscolaDeAndroid.Informacoes;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.widget.TextView;
public class InformacoesActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//classe responsável por pegar todas as informações contidas no
//AndroidManifest.XML
PackageInfo pinfo = null;
//Instâncias dos objetos na tela (main.xml)
TextView AppName = (TextView)findViewById(R.id.tvAppName);
TextView PackageName = (TextView)findViewById(R.id.tvPackageName);
TextView VersionCode = (TextView)findViewById(R.id.tvVersionCode);
TextView VersionName = (TextView)findViewById(R.id.tvVersionName);
try {
pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Carrega na tela as informações obtidas no arquivo AndroidManifest.xml
AppName.setText(pinfo.applicationInfo.loadLabel(getPackageManager()).toString());
PackageName.setText(pinfo.packageName);
VersionCode.setText(String.valueOf(pinfo.versionCode));
VersionName.setText(pinfo.versionName);
}
}
</pre>
<br />
Abaixo segue o resultado de nosso exemplo:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd50QC1EaErmxPhRVkeGHAoYoP46lDf0YrJ-rGq5uweVy2omb6SeY7KpBwt5ChBWYbwYAiw405dzRusa8tp7RuenwkzmmSseMHIYHjQ5BVeRCAFeSP7IvqsJoytyiGyJWvBbLlagJbJSLg/s1600/activity.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd50QC1EaErmxPhRVkeGHAoYoP46lDf0YrJ-rGq5uweVy2omb6SeY7KpBwt5ChBWYbwYAiw405dzRusa8tp7RuenwkzmmSseMHIYHjQ5BVeRCAFeSP7IvqsJoytyiGyJWvBbLlagJbJSLg/s640/activity.PNG" title="Activity" width="390" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Activity</td></tr>
</tbody></table>
<br />
Por enquanto é isso pessoal, assim que eu tiver novas dicas postarei aqui no blog.<br />
<br />
Obrigado e até mais...<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com2tag:blogger.com,1999:blog-1139756238495061386.post-41046035176926916442012-04-28T04:36:00.000-07:002012-04-28T04:36:17.312-07:00Android - Remover barra de título<br />
<div>
Olá Pessoal,<br />
<br />
Hoje vou apresentar uma pequena dica, mas que pode ser bastante interessante em seus aplicativos, que é a remoção da barra de título de sua Activity, essa opção é definida por tela.<br />
<br />
Temos duas maneira de executar essa tarefa, pode ser definido no arquivo de AndroidManifest.XML através do atributo android:theme, ou dentro de cada classe java que represente um determinado arquivo de layout.<br />
<br />
Abaixo seguem as duas opções.<br />
<br />
Arquivo AndroidManifest.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscolaDeAndroid"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".HelloWorldActivity"
android:theme="@android:style/Theme.NoTitleBar"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
</pre>
<br />
Arquivo HelloWorldActivity.java<br />
<pre class="brush: java">package br.com.EscolaDeAndroid;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
public class HelloWorldActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//remove título desta Activity
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
}
}
</pre>
<br />
Abaixo segue um antes e depois:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfSnxluIn0_1MdClJRxx1eGB2nQoSqbreM4I-lLLBPUx4S_O7TbNGk_Br6uRxRZoqOZUVsbUBiu4FFWr_Mo8K8r5mAC264IXNBNZQS9Y9H5UNigc3qCTbbSW-YWKeb3K95YyCnNyyufF4K/s1600/titulo1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfSnxluIn0_1MdClJRxx1eGB2nQoSqbreM4I-lLLBPUx4S_O7TbNGk_Br6uRxRZoqOZUVsbUBiu4FFWr_Mo8K8r5mAC264IXNBNZQS9Y9H5UNigc3qCTbbSW-YWKeb3K95YyCnNyyufF4K/s400/titulo1.png" width="242" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivFq7f12rpNBI02P9sEeaTSZPcYKS9DXjxCBMaWdW4mhtLdTrSJaLNygvx4CXiMGl9BvGEA5A3bgsYAL8FD_TtYpVGbqHqmHFDJCgz28z3vfDeR9Xi54_mztfeMwJlbGCwTOOS5FPuxh8S/s1600/titulo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivFq7f12rpNBI02P9sEeaTSZPcYKS9DXjxCBMaWdW4mhtLdTrSJaLNygvx4CXiMGl9BvGEA5A3bgsYAL8FD_TtYpVGbqHqmHFDJCgz28z3vfDeR9Xi54_mztfeMwJlbGCwTOOS5FPuxh8S/s400/titulo2.png" width="243" /></a><br />
<br />
<br />
<b>Atenção:</b><br />
Não precisa executar as opções descritas acima, basta somente uma, apenas estou apresentando duas maneiras de remover o título de sua Activity.<br />
<br />
Por enquanto é isso, espero que tenham gostado, até mais...<br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com7tag:blogger.com,1999:blog-1139756238495061386.post-51173578248831491912012-04-26T17:24:00.000-07:002012-04-26T17:28:48.361-07:00Android - Utilizando Shared Preferences<br />
<div>
Olá Pessoal,<br />
<br />
<br />
Hoje vou apresentar a classe SharedPreferences, ela fornece um recurso muito útil para nossos aplicativos que é a de ler e salvar pequenas informações de nosso sistema, como por exemplo, salvar o nome do usuário de uma tela de login, e é justamente este exemplo que será apresentado, a interface está bem simplificada apenas para ilustrar o recurso de salvar e recuperar o nome do usuário quando entramos e saímos em nosso aplicativo.<br />
<br />
Como de costume abaixo seguem todos os fontes utilizados, eles já estão com comentários para facilitar no aprendizado.<br />
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Usuário:"
android:typeface="monospace"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/etUsuario"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/textView1" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/etUsuario"
android:text=" Senha:"
android:typeface="monospace"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/etSenha"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/etUsuario"
android:layout_alignParentRight="true"
android:layout_below="@+id/etUsuario"
android:inputType="textPassword" />
<CheckBox
android:id="@+id/chkSalvar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/etSenha"
android:text="Salvar preferência" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/chkSalvar"
android:onClick="btnFechar_Click"
android:text="Fechar programa" />
</RelativeLayout>
</LinearLayout>
</pre>
<br />
<br />
Arquivo PreferenceActivity.java<br />
<pre class="brush: java">package br.com.EscolaDeAndroid;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
public class PreferenceActivity extends Activity {
public static final String PREFS_NAME = "Preferences";
EditText etUsuario;
EditText etSenha;
/**Chamado quando a Activity é executada pela primeira vez.*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etUsuario = (EditText)findViewById(R.id.etUsuario);
etSenha = (EditText)findViewById(R.id.etSenha);
//Restaura as preferencias gravadas
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
etUsuario.setText(settings.getString("PrefUsuario", ""));
}
/**Chamado quando a Activity é encerrada.*/
@Override
protected void onStop(){
super.onStop();
//Caso o checkbox esteja marcado gravamos o usuário
CheckBox chkSalvar = (CheckBox)findViewById(R.id.chkSalvar);
if (chkSalvar.isChecked()){
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("PrefUsuario", etUsuario.getText().toString());
//Confirma a gravação dos dados
editor.commit();
}
}
//Evento click do botão Fechar prorama
public void btnFechar_Click(View v){
finish(); // fecha aplicativo
}
}
</pre>
<br />
<br />
Abaixo segue uma imagem do nosso projeto.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitgLTpUDrxjI4wsuJYCa_kws-5f9XjK4NSBt2nb8AUHgb8dUCPRkHDUp0amFc8fBKr3yU53T61rgCBHVce87Ywv4ePy7Rf7Oc9w4opjTOxNSHWlVV41ryIavfrFhcC1wo3q53QdVuKnn1i/s1600/sharedpreference.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitgLTpUDrxjI4wsuJYCa_kws-5f9XjK4NSBt2nb8AUHgb8dUCPRkHDUp0amFc8fBKr3yU53T61rgCBHVce87Ywv4ePy7Rf7Oc9w4opjTOxNSHWlVV41ryIavfrFhcC1wo3q53QdVuKnn1i/s1600/sharedpreference.png" title="Shared preferences" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Shared Preferences</td></tr>
</tbody></table>
<br />
<br />
Para o programa ter o efeito esperado é necessário digitar alguma coisa no campo "Usuário", marcar o checkbox "Salvar preferência" e emseguida clicar no botão "Fechar programa", depois disso é só executar novamente seu aplicativo.<br />
<br />
Bem, por enquanto é isso pessoal, espero que tenham gostado e em breve trarei mais novidades para vocês, obrigado e até mais.<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com6tag:blogger.com,1999:blog-1139756238495061386.post-1827421035489000612012-04-21T15:59:00.001-07:002012-04-21T15:59:38.240-07:00Android - Carregando ListView com SqLite<br />
<div>
Olá Pessoal,<br />
<br />
Hoje vou mostrar como carregar um ListView com informações vindas do SqLite, esse exemplo utiliza parte do código utilizado no exemplo de <a href="http://escoladeandroid.blogspot.com.br/2012/02/android-criando-uma-agenda-de-contatos.html">Agenda</a>.<br />
<br />
A seguir temos um print do projeto, para orientar onde devemos criar cada arquivo.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT8Wm5VO-Fqbh5keNEsFy1Ks_bbvw5WIUyv65f_er37tJq29tCtG8LEAwrTo9Ao7c1KmYOLZfTJbwrGWYNfYPwfVERzKt8fX0qGsjtJqpwdOqWvrS7pm_B8Bou8allTt0hTDJOXSj_3DmJ/s1600/projeto.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT8Wm5VO-Fqbh5keNEsFy1Ks_bbvw5WIUyv65f_er37tJq29tCtG8LEAwrTo9Ao7c1KmYOLZfTJbwrGWYNfYPwfVERzKt8fX0qGsjtJqpwdOqWvrS7pm_B8Bou8allTt0hTDJOXSj_3DmJ/s400/projeto.png" width="290" /></a></div>
<br />
Para facilitar no aprendizado todos os fontes apresentados seguem com comentários, e abaixo segue todo o fonte utilizado.<br />
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btnInserir"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Inserir registros"
android:onClick="btnInserir_Click"/>
<Button
android:id="@+id/btnCarregar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Carregar registros"
android:onClick="btnCarregar_Click" />
<ListView
android:id="@+id/listView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
</pre>
<br />
<br />
Arquivo row.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout
android:layout_width="fill_parent"
android:orientation="horizontal"
android:id="@+id/rowLayout"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/tvNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Nome"
android:layout_alignParentLeft="true"/>
<TextView
android:id="@+id/tvEndereco"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tvNome"
android:gravity="right"
android:text="Endereco" />
<TextView
android:id="@+id/tvTelefone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_alignParentLeft="true"
android:layout_below="@+id/tvEndereco"
android:text="Telefone"
/>
</RelativeLayout>
</pre>
<br />
<br />
Arquivo BaseDAO.java<br />
<pre class="brush: java">package br.com.EscolaDeAndroid.ListSqlite;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
//Classe responsável pela criação do Banco de Dados e tabelas
public class BaseDAO extends SQLiteOpenHelper {
public static final String TBL_AGENDA = "agenda";
public static final String AGENDA_ID = "_id";
public static final String AGENDA_NOME = "nome";
public static final String AGENDA_ENDERECO = "endereco";
public static final String AGENDA_TELEFONE = "telefone";
private static final String DATABASE_NAME = "agenda.db";
private static final int DATABASE_VERSION = 1;
//Estrutura da tabela Agenda (sql statement)
private static final String CREATE_AGENDA = "create table " +
TBL_AGENDA + "( " + AGENDA_ID + " integer primary key autoincrement, " +
AGENDA_NOME + " text not null, " +
AGENDA_ENDERECO + " text not null, " +
AGENDA_TELEFONE + " text not null);";
public BaseDAO(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database) {
//Criação da tabela
database.execSQL(CREATE_AGENDA);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Caso seja necessário mudar a estrutura da tabela
//deverá primeiro excluir a tabela e depois recriá-la
db.execSQL("DROP TABLE IF EXISTS " + TBL_AGENDA);
onCreate(db);
}
}
</pre>
<br />
<br />
Arquivo ListSqliteActivity.java<br />
<pre class="brush: java">package br.com.EscolaDeAndroid.ListSqlite;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class ListSqliteActivity extends Activity {
private SQLiteDatabase database;
private CursorAdapter dataSource;
//Atenção: é necessário inserir o PK (chave primária _id) como último campo
private static final String campos[] = {"nome", "endereco", "telefone", "_id"};
ListView listView;
BaseDAO helper;
/** Chamado quando a Activity é exeutada pela primeira vez. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) findViewById(R.id.listView1);
//cria instância da classe BaseDAO, responsável pela criação do Banco de Dados
helper = new BaseDAO(this);
//executa rotinas internas para abrir/utilizar o banco de dados
database = helper.getWritableDatabase();
}
public void btnInserir_Click(View v){
//insere dados no banco de dados
database.execSQL("INSERT INTO agenda (nome, endereco, telefone) VALUES " +
"('Escola de Android', 'R: João Figueiredo, 101', '(99)9999-9999')");
database.execSQL("INSERT INTO agenda (nome, endereco, telefone) VALUES " +
"('Projeto Teste', 'Av. Brasil, 500', '(12)3456-78901')");
Toast.makeText(this, "Registros inseridos com sucesso", Toast.LENGTH_SHORT).show();
}
public void btnCarregar_Click(View v){
//executa consulta geral de todos os registros cadastrados no banco de dados
Cursor contatos = database.query("agenda", campos, null, null, null, null, null);
if (contatos.getCount() > 0){
//cria cursor que será exibido na tela, nele serão exibidos
//todos os contatos cadastrados
dataSource = new SimpleCursorAdapter(this, R.layout.row, contatos,
campos, new int[] { R.id.tvNome, R.id.tvEndereco , R.id.tvTelefone });
//relaciona o dataSource ao próprio listview
listView.setAdapter(dataSource);
}else{
Toast.makeText(this, "Nenhum registro encontrado", Toast.LENGTH_SHORT).show();
}
}
//método executado quando o usuário clica no botão voltar do aparelho
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//deleta registros inseridos, simplesmente para limpar essa base que é de teste
database.execSQL("DELETE FROM AGENDA");
//fecha a conexão com o Banco de dados
database.close();
}
}
</pre>
<br />
<br />
Abaixo seguem as imagens do projeto em execução.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1sZ3lOm_GE2Q-FjEpjhE7-wPBMq7MOwenz4S3CG31efEn0jDBPNZ347ZBhP9dbcqgtY0_2aFceWNG1Q2LOf7dTMK08tu_e9Dfm49b5FibwEHtc6qrbxz6GVNMWHJWJI2Xi0cgKWbkQwtJ/s1600/list1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1sZ3lOm_GE2Q-FjEpjhE7-wPBMq7MOwenz4S3CG31efEn0jDBPNZ347ZBhP9dbcqgtY0_2aFceWNG1Q2LOf7dTMK08tu_e9Dfm49b5FibwEHtc6qrbxz6GVNMWHJWJI2Xi0cgKWbkQwtJ/s400/list1.png" width="245" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNLfqOmAFli3NX3O0xqb5uiOdM_RtQ-glBjeF_L4_y_WtCMnOFwdJNv7dMYzM5-5O9F4dLP_fp4vNgY1yoAcAKLW987F8fAQeFGXNnt51-qxGbTYTQpQUIOeKsHEjVMRl24z0xL4NMHw8j/s1600/list2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNLfqOmAFli3NX3O0xqb5uiOdM_RtQ-glBjeF_L4_y_WtCMnOFwdJNv7dMYzM5-5O9F4dLP_fp4vNgY1yoAcAKLW987F8fAQeFGXNnt51-qxGbTYTQpQUIOeKsHEjVMRl24z0xL4NMHw8j/s400/list2.png" width="245" /></a></div>
<br />
<br />
Para o programa funcionar é preciso primeiro clicar no botão "Inserir registros" com isso será exibida uma mensagem de "Registros incluídos com sucesso", em seguida deve ser clicado no botão<br />
"Carregar registros" para ser exibido a lista dos dados inseridos no Banco de Dados SqLite.<br />
<br />
Por enquanto é isso pessoal, espero que gostem e comentem, caso tenham alguma dúvida, crítica ou sugestão é só enviar.<br />
<br />
Em breve estarei apresentando mais exemplos sobre SqLite.<br />
<br />
<br />
<b>Posts relacionados:</b><br />
Criação de uma Agenda - <a href="http://escoladeandroid.blogspot.com.br/2012/02/android-criando-uma-agenda-de-contatos.html">http://escoladeandroid.blogspot.com.br/2012/02/android-criando-uma-agenda-de-contatos.html</a><br />
<br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com11tag:blogger.com,1999:blog-1139756238495061386.post-69426973075804282882012-04-19T16:56:00.001-07:002012-04-19T18:17:04.138-07:00Criando um formulário de login<br />
<div>
Olá Pessoal,<br />
<br />
Hoje vou apresentar o layout de um formulário de login, já estilizado, com Shape e Styles nos componentes utilizados.<br />
<br />
Utilizando o modelo proposto neste projeto podemos criar layouts mais sofisticados para nossos programas.<br />
<br />
Abaixo segue um print da estrutura do projeto.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFuBwEwktIHI_A7TmzFGOkxiv7iMGoZ7CyECXe2fwDNNV4gRvKSYIfWm_c9bgbJ2IlaBZ-5udZ6G2It7W7SF3gc5UdTr1BKCfTlVfS9Err3-MzI0v_CGPi5j6VEADl2RjE9Kp5c9az-J6o/s1600/projeto.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFuBwEwktIHI_A7TmzFGOkxiv7iMGoZ7CyECXe2fwDNNV4gRvKSYIfWm_c9bgbJ2IlaBZ-5udZ6G2It7W7SF3gc5UdTr1BKCfTlVfS9Err3-MzI0v_CGPi5j6VEADl2RjE9Kp5c9az-J6o/s1600/projeto.png" /></a></div>
<br />
<br />
Abaixo seguem todos os arquivos utilizados no projeto acima.<br />
<br />
<br />
Arquivo shapebutton.xml<br />
<pre class="brush: xml"> <?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#96A5CE"
android:endColor="#1D3472"
android:angle="270"/>
<stroke
android:width="1dp"
android:color="#1D3472" />
<corners
android:radius="7dp" />
<padding
android:left="15dp"
android:top="5dp"
android:right="15dp"
android:bottom="5dp" />
</shape>
</pre>
<br />
Arquivo shaplinear.xml<br />
<pre class="brush: xml"> <?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android">
<solid
android:color="#B9BFD1"/>
<padding
android:bottom="2dp"
android:left="2dp"
android:right="2dp"
android:top="2dp"/>
<corners
android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
</pre>
<br />
<br />
Arquivo shaplinear.xml
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#96A5CE"
android:endColor="#1D3472"
android:angle="270"/>
<padding
android:bottom="4dp"
android:left="4dp"
android:right="4dp"
android:top="4dp" />
<corners
android:bottomRightRadius="1dp"
android:bottomLeftRadius="1dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
</pre>
<br />
<br />
Arquivo styles.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TitleBarText">
<item name="android:id">@+id/title_text</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center_vertical</item>
<item name="android:textSize">20dp</item>
<item name="android:paddingLeft">12dip</item>
<item name="android:paddingRight">12dip</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@android:color/white</item>
<item name="android:singleLine">true</item>
<item name="android:ellipsize">end</item>
</style>
</resources>
</pre>
<br />
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical">
<LinearLayout
android:id="@+id/linearLayout1"
android:background="@drawable/shapelinear"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/shapetextview"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/login48" />
<TextView
style="@style/TitleBarText"
android:id="@+id/tvLogin"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="right|center_vertical"
android:text="Login" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_marginTop="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvUsuario"
android:textColor="#1D3472"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="right"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="Usuário : " />
<EditText
android:id="@+id/etUsuario"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_marginRight="10dp"
android:layout_height="wrap_content">
<requestFocus />
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout4"
android:layout_marginTop="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvSenha"
android:textColor="#1D3472"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="right"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="Senha : " />
<EditText
android:id="@+id/etSenhA"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_marginRight="10dp"
android:inputType="textPassword"
android:layout_height="wrap_content" >
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout5"
android:layout_marginTop="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:weightSum="3">
<CheckBox
android:id="@+id/chkLembrar"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_marginRight="10dp"
android:layout_height="wrap_content"
android:text="Lembrar usuário" />
</LinearLayout>
<RelativeLayout
android:id="@+id/relativeLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp" >
<Button
style="@style/TitleBarText"
android:id="@+id/btEntrar"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/checkBox1"
android:background="@drawable/shapebutton"
android:text="Entrar" />
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
</pre>
<br />
<br />
Abaixo temos o resultado de nosso projeto.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihCyeFhM-SlgSNppwxyMyOrV3WyeaOYo7s7yos3xL73HZx9w5F5AE7POV6XD30o7Xv-XxbOi5fitvZJXLRxuwTqlJk6VygcoYe1wPiczyeQcipH5bTbdjffbEVSTJzPU3phnoNOZhXOkCa/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihCyeFhM-SlgSNppwxyMyOrV3WyeaOYo7s7yos3xL73HZx9w5F5AE7POV6XD30o7Xv-XxbOi5fitvZJXLRxuwTqlJk6VygcoYe1wPiczyeQcipH5bTbdjffbEVSTJzPU3phnoNOZhXOkCa/s1600/login.png" /></a></div>
<br />
<br />
Por enquanto é isso pessoal, espero que tenham gostado, assim que tiver novidades eu postarei com certeza.<br />
<br />
<br />
Abaixo seguem outros links relacionados:<br />
Pattern DashBoard - <a href="http://escoladeandroid.blogspot.com.br/2012/04/pattern-dashboard.html">http://escoladeandroid.blogspot.com.br/2012/04/pattern-dashboard.html</a><br />
Shape - <a href="http://escoladeandroid.blogspot.com.br/2012/04/android-shape.html">http://escoladeandroid.blogspot.com.br/2012/04/android-shape.html</a><br />
<br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com10tag:blogger.com,1999:blog-1139756238495061386.post-81360938333933018382012-04-15T07:46:00.000-07:002012-04-17T18:48:44.728-07:00Pattern - DashboardOlá Pessoal,<br />
<br />
Vou mostrar como montar um Pattern DashBoard que é a tela inicial de seu sistema, nela pode conter conteúdo dinâmico ou estático, nela também são encontrados quais as principais opções de seu sistema, facilitando a navegação do usuário.<br />
<br />
Abaixo segue um print com a estrutura do projeto:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9CQZxF31S856-NnxGFotToZjbPqR6Tdu145c2mv3IvBuWEYK5ND0tkk4l_hyphenhyphen8sEIAz3APMTFjZKyA3GCGalGtXlnp_SgwOsmImOMlX-3FJCGEtr9i9qQAfhbRJz3pCXxnU9_9kjmooeZt/s1600/projeto.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9CQZxF31S856-NnxGFotToZjbPqR6Tdu145c2mv3IvBuWEYK5ND0tkk4l_hyphenhyphen8sEIAz3APMTFjZKyA3GCGalGtXlnp_SgwOsmImOMlX-3FJCGEtr9i9qQAfhbRJz3pCXxnU9_9kjmooeZt/s1600/projeto.png" /></a></div>
<br />
<br />
A seguir serão apresentados todos os fontes utilizados no sistema.<br />
<br />
Arquivo colors.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="title_background">#ffFF0000</color>
<color name="title_text">#ffffffff</color>
<color name="foreground">#ffffffff</color>
<color name="background">#ff000000</color>
</resources>
</pre>
<br />
Arquivo strings.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, DashBoardActivity!</string>
<string name="app_name">DashBoard</string>
<string name="home">Nome do seu programa</string>
<string name="consulta">Consulta</string>
<string name="sobre">Sobre</string>
<string name="config">Config.</string>
<string name="venda">Vendas</string>
<string name="rodape">Mensagem de rodapé</string>
</resources>
</pre>
<br />
Arquivo styles.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="HomeText">
<item name="android:layout_gravity">center_vertical</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_weight">0</item>
<item name="android:gravity">center_horizontal</item>
<item name="android:textSize"> 18sp</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/foreground</item>
</style>
<style name="TitleBar">
<item name="android:windowNoTitle">true</item>
<item name="android:id">@+id/title_container</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">45dip</item>
<item name="android:orientation">horizontal</item>
<item name="android:background">@color/title_background</item>
</style>
<style name="TitleBarLogo">
<item name="android:id">@+id/title_logo</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">fill_parent</item>
</style>
<style name="TitleBarText">
<item name="android:id">@+id/title_text</item>
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:layout_weight">1</item>
<item name="android:gravity">center_vertical</item>
<item name="android:textSize">18sp</item>
<item name="android:paddingLeft">12dip</item>
<item name="android:paddingRight">12dip</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@color/title_text</item>
<item name="android:singleLine">true</item>
<item name="android:ellipsize">end</item>
</style>
</resources>
</pre>
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
style="@style/TitleBar"
android:id="@+id/linearLayout1">
<ImageView
style="@style/TitleBarLogo"
android:id="@+id/img1"
android:src="@drawable/dashboard"
android:onClick="onClickHome"
android:contentDescription="@null"
android:layout_marginTop = "5dip"
android:layout_marginRight="5dip"
android:layout_marginLeft="5dip"
android:layout_marginBottom = "4dip"
android:paddingBottom = "2dip"
android:background="@null"
android:layout_gravity="center"
android:paddingLeft="5dip"
android:paddingRight="7dip" />
<ImageView
android:id="@+id/sep"
android:contentDescription="@null"
android:layout_width="1dp"
android:layout_height="fill_parent"
android:background="@drawable/separator"
android:layout_marginRight="7dip"/>
<TextView
style="@style/TitleBarText"
android:id="@+id/tv1"
android:paddingLeft = "8dip"
android:text="@string/home"/>
</LinearLayout>
<RelativeLayout
android:id="@+id/relativeLayout2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/llRodape"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/linearLayout1" >
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/LinearLayout2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/ivVenda"
android:layout_width="0dp"
android:layout_weight="1"
android:contentDescription="@null"
android:layout_height="wrap_content"
android:onClick="onClickVenda"
android:src="@drawable/venda" />
<ImageView
android:id="@+id/ivConsulta"
android:layout_width="0dp"
android:layout_weight="1"
android:contentDescription="@null"
android:layout_height="wrap_content"
android:onClick="onClickConsulta"
android:src="@drawable/consulta" />
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="25dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvVenda"
style="@style/HomeText"
android:layout_width="0dp"
android:layout_marginTop="0dip"
android:layout_weight="1"
android:text="@string/venda" />
<TextView
android:id="@+id/tvConsulta"
style="@style/HomeText"
android:layout_width="0dp"
android:layout_marginTop="0dip"
android:layout_weight="1"
android:text="@string/consulta" />
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout4"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/ivConfig"
android:layout_width="0dp"
android:layout_weight="1"
android:contentDescription="@null"
android:layout_height="wrap_content"
android:onClick="onClickConfig"
android:src="@drawable/config" />
<ImageView
android:id="@+id/ivSobre"
android:layout_width="0dp"
android:layout_weight="1"
android:contentDescription="@null"
android:layout_height="wrap_content"
android:onClick="onClickSobre"
android:src="@drawable/sobre" />
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout5"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="25dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvConfig"
style="@style/HomeText"
android:layout_width="0dp"
android:layout_marginTop="0dip"
android:layout_weight="1"
android:text="@string/config" />
<TextView
android:id="@+id/tvSobre"
style="@style/HomeText"
android:layout_width="0dp"
android:layout_marginTop="0dip"
android:layout_weight="1"
android:text="@string/sobre" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:id="@+id/llRodape"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:orientation="vertical" >
<TextView
style="@style/TitleBarText"
android:id="@+id/tvRodape"
android:layout_width="fill_parent"
android:text="@string/rodape"
android:background="@color/title_background"/>
</LinearLayout>
</RelativeLayout>
</pre>
<br />
Arquivo DashBoardActivity.java<br />
<pre class="brush: java">package br.com.EscolaDeAndroid;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
public class DashBoardActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClickVenda(View v){
trace("Venda");
}
public void onClickConsulta(View v){
trace("Consulta");
}
public void onClickConfig(View v){
trace("Configurações");
}
public void onClickSobre(View v){
trace("Sobre");
}
public void onClickHome(View v){
trace("Home");
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
}
</pre>
<br />
No exemplo apresentado o sistema ainda não efetua nenhuma tarefa, apensa exibe uma mensagem quando o usuário clicar em alguma das imagens, inclusive na imagem do DashBoard, mas o principal desse projeto é ensinar como criar criar esse tipo de layout.<br />
<br />
Como resultado temos a seguinte imagem:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7tEq_-dtmlGL0mC3dkmhyDlHvjAyFY6e976r0S1LxkYEPXWWiTXUaYiQvOwAsOx6rurU7s9xwHTPlGjZox12MRs-P1b3tVlXBpfMHmib3MhtedDxUj5chyrtEzNiIq8qYBafEEHAB3DWu/s1600/layout1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7tEq_-dtmlGL0mC3dkmhyDlHvjAyFY6e976r0S1LxkYEPXWWiTXUaYiQvOwAsOx6rurU7s9xwHTPlGjZox12MRs-P1b3tVlXBpfMHmib3MhtedDxUj5chyrtEzNiIq8qYBafEEHAB3DWu/s1600/layout1.png" /></a></div>
<br />
Abaixo seguem as imagens utilizadas nos botões: <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXpdE_pQOgHoipZMU2DhTzyxQklVvFZH6T02LYnUkKkuMGoYxAt-on-Akdip7BWk8lUYa8AduQqvMOH4GnBWpOJMo0xqDipNO_C7eD4J85HB2vzY0NMFp9_ujTs6zF52mix93NLP44TwxE/s1600/config.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXpdE_pQOgHoipZMU2DhTzyxQklVvFZH6T02LYnUkKkuMGoYxAt-on-Akdip7BWk8lUYa8AduQqvMOH4GnBWpOJMo0xqDipNO_C7eD4J85HB2vzY0NMFp9_ujTs6zF52mix93NLP44TwxE/s1600/config.png" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqp5XlWqrl-N1Lic8u19a7FePMdDdzlOvH5i205LSZ5YInwGKI_bvgMqpyCaNBmvDOBegoRWo6kfmtNRRPrY-bJ7QA_vFbjgIbK35Pkm-ZdLbDvHr4p1BLX3M9hF_QkIyoChEyogGhyn-/s1600/consulta.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwqp5XlWqrl-N1Lic8u19a7FePMdDdzlOvH5i205LSZ5YInwGKI_bvgMqpyCaNBmvDOBegoRWo6kfmtNRRPrY-bJ7QA_vFbjgIbK35Pkm-ZdLbDvHr4p1BLX3M9hF_QkIyoChEyogGhyn-/s1600/consulta.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUSVD4myhDmL45LMVSHt-ZJYabyednzC_H0kekJFZw6kkr2M7mDIGpXuTUaeIpvr2vZctl3vPQ43y4iRkEIGxxuqyLHUKlMtMbG3ITDxVjxuD5TkZswsc58aMIlS6qPjpv5Jig40f9uule/s1600/sobre.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUSVD4myhDmL45LMVSHt-ZJYabyednzC_H0kekJFZw6kkr2M7mDIGpXuTUaeIpvr2vZctl3vPQ43y4iRkEIGxxuqyLHUKlMtMbG3ITDxVjxuD5TkZswsc58aMIlS6qPjpv5Jig40f9uule/s1600/sobre.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4nr8GEbIwgGEg9madmDX6k8ndfCWeqReklPdfpqzNEB8ff3LBsIpVR3wW8BQziFjE5mK0xdQp1NoW8Mnskq8ZzVliGe1VtzT3zkGv35udoIyEKnXQ0ncT4p89fGFVppa253Fb-kC8D0lz/s1600/venda.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4nr8GEbIwgGEg9madmDX6k8ndfCWeqReklPdfpqzNEB8ff3LBsIpVR3wW8BQziFjE5mK0xdQp1NoW8Mnskq8ZzVliGe1VtzT3zkGv35udoIyEKnXQ0ncT4p89fGFVppa253Fb-kC8D0lz/s1600/venda.png" /></a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6phPDXJ7TXZxL45Rq7Ecy3Zvn_5ahtz6FW_nfEMb0rcQol__KXrd10gx9oGO6S83a-jt5qc8LA0TCasE1EH_affBbcl0CGXchclt0rzPEl0sAvfXll3zODpcBGIQ7LyXDssYLN97ISe7z/s1600/dashboard.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6phPDXJ7TXZxL45Rq7Ecy3Zvn_5ahtz6FW_nfEMb0rcQol__KXrd10gx9oGO6S83a-jt5qc8LA0TCasE1EH_affBbcl0CGXchclt0rzPEl0sAvfXll3zODpcBGIQ7LyXDssYLN97ISe7z/s1600/dashboard.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7AyRUq8BOcg2faA0KMzGmpRnLVS0tIWLCryCOQvd_dceSMY6m2gGVjhKNebGDiRRHsSwCW-8ccC-gUBCq1Fs3H9qn240W5IkPkF1zHXIOpm5m5HluANl2p7lsPo6_6zpFV-JHoecltvpl/s1600/separator.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7AyRUq8BOcg2faA0KMzGmpRnLVS0tIWLCryCOQvd_dceSMY6m2gGVjhKNebGDiRRHsSwCW-8ccC-gUBCq1Fs3H9qn240W5IkPkF1zHXIOpm5m5HluANl2p7lsPo6_6zpFV-JHoecltvpl/s1600/separator.png" /></a> <br />
<br />
<br />
<div>
Em breve estarei postando outros exemplos de Patterns.<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com1tag:blogger.com,1999:blog-1139756238495061386.post-84223793873119226432012-04-10T18:07:00.002-07:002012-04-17T18:57:00.097-07:00Android - Shape<div>
Olá Pessoal,<br />
<br />
<br />
Hoje vou apresentar alguns exemplo de utilização de shape esse que é o recurso responsável por criar efeitos gradientes, cantos arredondados entre outros em nosso componentes.<br />
<br />
Para criar um shape devemos primeiro criar a pasta drawable dentro da pasta res.<br />
<br />
Para esse projeto irei criar um shape para cada componente (LinearLayout, Button, TextView e TextView2).<br />
<br />
Abaixo segue um print da estrutura do projeto.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYC-7N-0oNHjNMhCureX3TEzhe7GE2h1cOyxk24XVzftCNIbLuXOILHhdYJFyLCMjJoQnxVnC2v6ouENZ94Yao1s4rCyDgbUpujEiW0O6ERbCsT06-pXpUE8Y0EQE3v7l_F0IiXOyRoJoo/s1600/projeto.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYC-7N-0oNHjNMhCureX3TEzhe7GE2h1cOyxk24XVzftCNIbLuXOILHhdYJFyLCMjJoQnxVnC2v6ouENZ94Yao1s4rCyDgbUpujEiW0O6ERbCsT06-pXpUE8Y0EQE3v7l_F0IiXOyRoJoo/s1600/projeto.PNG" /></a></div>
<br />
<br />
Imagem utilizada de background do layout lunai.png:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWiY4_qFnLaijtsfRFQLRuKhacANSVz9R-ZmvdiimeQq9VE9E1Ci8Y5aBFOA8J03CsRJ6-sqBIhIYZygstP9UD3dWDiNaJqXI3O5FtUImYwcoS_YRCnrHPK8-qklHwLQSQt1j9RBlmnpRq/s1600/lunai.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWiY4_qFnLaijtsfRFQLRuKhacANSVz9R-ZmvdiimeQq9VE9E1Ci8Y5aBFOA8J03CsRJ6-sqBIhIYZygstP9UD3dWDiNaJqXI3O5FtUImYwcoS_YRCnrHPK8-qklHwLQSQt1j9RBlmnpRq/s320/lunai.png" width="320" /></a></div>
<br />
<br />
<br />
Abaixo seguem todos os arquivos utilizados.<br />
<br />
Arquivo shapebutton.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#FFFAFA"
android:endColor="#00008B"
android:angle="270" />
<stroke
android:width="2dp"
android:color="#ffffff" />
<corners
android:radius="50dp" />
<padding
android:left="15dp"
android:top="15dp"
android:right="15dp"
android:bottom="15dp" />
</shape>
</pre>
<br />
Arquivo shapelinear.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#DDff0000"
android:endColor="#DDFFA500"
android:angle="0"/>
<corners
android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
</pre>
<br />
<br />
Arquivo shapetextview.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#551A8B" />
<padding
android:bottom="4dp"
android:left="4dp"
android:right="4dp"
android:top="4dp" />
<corners
android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
</pre>
<br />
Arquivo shapetextview2.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#80000000" />
<padding
android:bottom="4dp"
android:left="4dp"
android:right="4dp"
android:top="4dp" />
<corners
android:bottomRightRadius="7dp"
android:bottomLeftRadius="7dp"
android:topLeftRadius="7dp"
android:topRightRadius="7dp"/>
</shape>
</pre>
<br />
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/lunai"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:background="@drawable/shapelinear"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="TextView com fundo cheio"
android:background="@drawable/shapetextview"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="Botão Padrão 1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:text="Botão Padrão 2" />
</LinearLayout>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/linearLayout1"
android:layout_below="@+id/linearLayout1"
android:background="@drawable/shapebutton"
android:layout_marginTop="20dp"
android:text="Botão com fundo gradiente e borda branca" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/linearLayout1"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:background="@drawable/shapetextview2"
android:text="textview com fundo transparente"
android:textColor="@android:color/white" />
</RelativeLayout>
</pre>
<br />
Abaixo segue uma imagem com o resultado do layout.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9sg0fEAgqw9K41-ZGwmxqiF6G8lnRxKcVzRgWlSad1GPlgIiOiGDB2tAVffA2Yf6v14cQ0TqkYB0MSxavqlbFW-UNyCSuDEsvLv4SHoK2Imzd0igCP5jfXRWJVqCw6J1-2zYFeq5C4LCP/s1600/shape.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9sg0fEAgqw9K41-ZGwmxqiF6G8lnRxKcVzRgWlSad1GPlgIiOiGDB2tAVffA2Yf6v14cQ0TqkYB0MSxavqlbFW-UNyCSuDEsvLv4SHoK2Imzd0igCP5jfXRWJVqCw6J1-2zYFeq5C4LCP/s1600/shape.PNG" /></a></div>
<br />
<br />
Agora uma breve explicação sobre os principais atributos de um shape:<br />
<br />
Stroke = desenha uma borda sobre o componente<br />
Corners = define os canots arredondados<br />
Solid = define a cor de fundo do componente<br />
<br />
Por enquanto é isso pessoal, com esses exemplos passados já podemos criar projetos mais elegantes.<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com2tag:blogger.com,1999:blog-1139756238495061386.post-6941552453009162902012-04-06T08:07:00.003-07:002012-04-15T08:12:38.083-07:00Android - Layout RelativeLayout<div>Olá, Pessoal<br />
<br />
Seguindo a série sobre layout vou apresentar agora mais um tipo de layout, o RelativeLayout.<br />
<br />
Com ele podemos posicionar os componentes um em relação ao outro, ou seja, adicionamos um textview na tela e depois podemos adicionar um edittext, abaixo, acima, ou do lado desse textview.<br />
<br />
Abaixo seguem as principais propriedades que podemos utilizar com esse tipo de layout.<br />
<br />
android:layout_below = posiciona o componente abaixo do componente indicado<br />
android:layout_above = posiciona o componente acima do componente indicado<br />
android:layout_toRightOf = posiciona o componente a direita do componente indicado<br />
android:layout_toLeftOf = posiciona o componente a esquerda do componente indicado<br />
android:layout_alignParentTop = posiciona o componente no topo do componente indicado<br />
android:layout_alignParentBottom = posiciona o componente abaixo do componente indicado <br />
<br />
Abaixo seguem alguns exemplos de utilização.<br />
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Código" />
<EditText
android:id="@+id/etCodigo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/textView1" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/etNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/etCodigo"
android:layout_alignParentRight="true"
android:layout_below="@+id/etCodigo" />
<TextView
android:id="@+id/tvNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignTop="@+id/etNome"
android:text="Nome" />
<Button
android:id="@+id/btnConfirmar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/etNome"
android:text="Confirmar" />
<Button
android:id="@+id/btnCancelar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/btnConfirmar"
android:layout_alignBottom="@+id/btnConfirmar"
android:layout_toLeftOf="@+id/btnConfirmar"
android:text="Cancelar" />
</RelativeLayout>
</pre><br />
Como resultado temos a seguinte imagem.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4J8drMWTl4Rb5myLNPjo9eXduo7r6aI1XPouSX3BqTwcLVnNz8Peqni8HUG1jtulGD-IWEPW5KTY3OhXFX9Dpw0qkE_tVn6V2NljSzmL5QpeHavOMDuW8oRY7RAXwpWOBJ_OK5_HY8RK6/s1600/relative1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4J8drMWTl4Rb5myLNPjo9eXduo7r6aI1XPouSX3BqTwcLVnNz8Peqni8HUG1jtulGD-IWEPW5KTY3OhXFX9Dpw0qkE_tVn6V2NljSzmL5QpeHavOMDuW8oRY7RAXwpWOBJ_OK5_HY8RK6/s1600/relative1.png" /></a></div><br />
Abaixo outro exemplo de relative layout.<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/tvCodigo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Código" />
<EditText
android:id="@+id/etCodigo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/tvCodigo" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/tvNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/etCodigo"
android:text="Nome" />
<EditText
android:id="@+id/etNome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/tvNome" />
<TextView
android:id="@+id/tvObs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/etNome"
android:text="Observação" />
<EditText
android:id="@+id/etObs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/tvObs" />
</RelativeLayout>
</pre><br />
Como resultado temos a seguinte imagem.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdM2Y8VVN3Pg15NOlqBzz2DDudTjhjFMiBAV_5ewnko4DJ_YdrfNEE4Q3Cfwfr4TYZmU0HRVmpwqjeEn0gnSHsgvtBjnHfNY-RUyPpuCKqjt71lJL9Qju6quBy3a357v499QW3E0TbOQxy/s1600/relative2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdM2Y8VVN3Pg15NOlqBzz2DDudTjhjFMiBAV_5ewnko4DJ_YdrfNEE4Q3Cfwfr4TYZmU0HRVmpwqjeEn0gnSHsgvtBjnHfNY-RUyPpuCKqjt71lJL9Qju6quBy3a357v499QW3E0TbOQxy/s1600/relative2.png" /></a></div><br />
Abaixo segue um exemplo apenas para visualizar as possibilidades.<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Button2" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:text="Button3" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:text="Button4" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Button5" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button5"
android:layout_toLeftOf="@+id/button5"
android:text="Button6" />
<Button
android:id="@+id/button7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button5"
android:layout_toRightOf="@+id/button5"
android:text="Button7" />
<Button
android:id="@+id/button9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button5"
android:layout_toLeftOf="@+id/button5"
android:text="Button9" />
<Button
android:id="@+id/button8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button5"
android:layout_toRightOf="@+id/button5"
android:text="Button8" />
<Button
android:id="@+id/button10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button9"
android:layout_alignRight="@+id/button7"
android:layout_below="@+id/button7"
android:text="Button10" />
</RelativeLayout>
</pre><br />
Abaixo segue o resultado.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMsYXMIdeRLcReKEbLE_b2nRbkt80NwUSpcx-byYAJdKmkqfGIbG3elKC2cv0DA9_SKISTj7aOQTGzon5SH4TyytKPLnCzCs4pAQ71oC7mzfTlVRK1WWWRAW9jFOML8MQ3WQBryyFqOzts/s1600/relative3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMsYXMIdeRLcReKEbLE_b2nRbkt80NwUSpcx-byYAJdKmkqfGIbG3elKC2cv0DA9_SKISTj7aOQTGzon5SH4TyytKPLnCzCs4pAQ71oC7mzfTlVRK1WWWRAW9jFOML8MQ3WQBryyFqOzts/s1600/relative3.png" /></a></div><br />
Por enquanto é isso pessoal, assim que eu fizer exemplo mais interessantes sobre RelativeLayout eu posto aqui no blog.<br />
<br />
<br />
Posts relacionados:<br />
LinearLayout - <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-layout-linearlayout.html">http://escoladeandroid.blogspot.com.br/2012/03/android-layout-linearlayout.html</a><br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div><br />
</div><br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com0tag:blogger.com,1999:blog-1139756238495061386.post-31099406501623014032012-03-30T17:00:00.007-07:002012-04-15T08:12:48.112-07:00Android - Layout LinearLayoutOlá, Pessoal<br />
<br />
Vou iniciar uma série de tutorias a respeito de layout, hoje começarei com o LinearLayout, esse que é o mais básico de todos os tipos de layout utilizados no Android.<br />
<br />
Atualmente existem duas variações do LinearLayout, que são:<br />
1. Horizontal -> todos os widgets adicionados dentro desse layout são colocados um do lado do outro.<br />
2. Vertical -> todos os widgets adicionados dentro de layout são colocados um abaixo do outro.<br />
<br />
Dentro de um LinearLayout podemos conter vários widgets, e inclusive conter outros LinearLaytouts que contenham outros widgets.<br />
<br />
As principais propriedades do layout LinearLayout são:<br />
1. layout_width -> largura do layout<br />
2. layout_height -> altura do layout<br />
3. orientation -> vertical ou horizontal<br />
4. layout_gravity -> define se o layout será exibido no topo, rodapé, centralizado, etc...<br />
<br />
Abaixo temos um exemplo de LinearLayut aninhado, que pode ser utilizado como base para cadastro qualquer:<br />
<?xml version="1.0" encoding="utf-8"?><br />
<pre class="brush: xml"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout1"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvCodigo"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="right"
android:text="Código :" />
<EditText
android:id="@+id/etCodigo"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="4"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvNome"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="right"
android:text="Nome :" />
<EditText
android:id="@+id/etNome"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="4"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right">
<Button
android:id="@+id/btnConfirmar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Confirmar" />
<Button
android:id="@+id/btnCancelar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancelar" />
</LinearLayout>
</LinearLayout>
</pre><br />
Como resultado temos a seguinte imagem:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfmg2XoUgpWRhdUVQCTv28a6Gg-ZARgqeb7W03uwgawEf6SxIhMty3lMZH7lsuT4Spy4sgHTG-afzV2gfGHzNU-Fr3clfaYpDWvLKnWSQ5aCPweKM1kycC-SOI2pty20CVtCi_exdcNmOf/s1600/linear1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfmg2XoUgpWRhdUVQCTv28a6Gg-ZARgqeb7W03uwgawEf6SxIhMty3lMZH7lsuT4Spy4sgHTG-afzV2gfGHzNU-Fr3clfaYpDWvLKnWSQ5aCPweKM1kycC-SOI2pty20CVtCi_exdcNmOf/s1600/linear1.PNG" /></a></div><br />
<br />
Abaixo temos uma pequena variação do exemplo acima, a mudança é que agora os botões estão alinhados ao rodapé da tela, e que também eles estão ocupando toda a largura da tela.<br />
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout1"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvCodigo"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="right"
android:text="Código :" />
<EditText
android:id="@+id/etCodigo"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="4"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvNome"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:gravity="right"
android:text="Nome :" />
<EditText
android:id="@+id/etNome"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="4"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="bottom" >
<Button
android:id="@+id/btnConfirmar"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Confirmar" />
<Button
android:id="@+id/btnCancelar"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Cancelar" />
</LinearLayout>
</LinearLayout>
</pre><br />
Como resultado temos a imagem abaixo:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4pNQ5nUFWNYA0BBE9fBO-WOY3NzHEw0cv_F-K_myQITfLpS-Ks1QVt3Wk3BZ3ibhOjQfoVBeWevu7tozzZ3vC0GFav8uVrs-sk9O_Kg02EbungECy6ovn1tXZ-MbOuNgqP_5nTeYUencI/s1600/linear2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4pNQ5nUFWNYA0BBE9fBO-WOY3NzHEw0cv_F-K_myQITfLpS-Ks1QVt3Wk3BZ3ibhOjQfoVBeWevu7tozzZ3vC0GFav8uVrs-sk9O_Kg02EbungECy6ovn1tXZ-MbOuNgqP_5nTeYUencI/s1600/linear2.PNG" /></a></div><br />
<br />
O exemplo abaixo mostra como criar uma tela de menu principal ou dashboard.<br />
<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:baselineAligned="false"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|center_horizontal"
android:weightSum="6"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/lin1"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="Opções:"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/btnIncluir"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Incluir" />
<Button
android:id="@+id/btnConsultar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Consultar" />
<Button
android:id="@+id/btnAlterar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Alterar" />
<Button
android:id="@+id/btnExcluir"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Excluir" />
</LinearLayout>
</LinearLayout>
</pre><br />
Como resultado temos a seguinte imagem:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUYmFHejmmWY-AicT2PZUrYLMoMPxsGhjJjS7JPNlG-TVUKJsxkexIYECfTEJIxoCqVOxUHkJex2ZGDUoGjlmKV955aHLUex1ACsw1CE3ELqjfw0LKekJElm73mD97BQpEpZmRRJGM58vf/s1600/menu3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUYmFHejmmWY-AicT2PZUrYLMoMPxsGhjJjS7JPNlG-TVUKJsxkexIYECfTEJIxoCqVOxUHkJex2ZGDUoGjlmKV955aHLUex1ACsw1CE3ELqjfw0LKekJElm73mD97BQpEpZmRRJGM58vf/s1600/menu3.png" /></a></div><br />
<br />
A seguir mais um exemplo de como criar uma tela de cadastro.<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#2a2a2a"
android:orientation="horizontal" >
<Button
android:id="@+id/btnConfirmar"
android:layout_weight="1"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Confirmar" />
<Button
android:id="@+id/btnCancelar"
android:layout_weight="1"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancelar" />
</LinearLayout>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Codigo:" />
<EditText
android:id="@+id/edtCodigo"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Nome:" />
<EditText
android:id="@+id/edtNome"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Endereço:" />
<EditText
android:id="@+id/edtEndereco"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</pre>Como resultado temos a seguinte imagem:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG9Ljf0cyVXUDTerFz3QxbgUI0Vil9DxT0l9zopRWOpX-AYAE1IE88lJP1qnd8DXF8oWeb-rS1IQFxgA2ERYJv4mxbUxCrDNib2dsW4lRq2PCkW1NzEMmGPm2q-aiDzguVipgRZKLjRwCt/s1600/menu4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG9Ljf0cyVXUDTerFz3QxbgUI0Vil9DxT0l9zopRWOpX-AYAE1IE88lJP1qnd8DXF8oWeb-rS1IQFxgA2ERYJv4mxbUxCrDNib2dsW4lRq2PCkW1NzEMmGPm2q-aiDzguVipgRZKLjRwCt/s1600/menu4.png" /></a></div><br />
<br />
<br />
<br />
Esse é o início para montar uma tela em Android, em breve estarei apresentando outros tipos de layouts e quem sabe aumentando os exemplos utilizados nesse tutorial.<br />
<br />
<br />
Posts relacionados:<br />
RelativeLayout - <a href="http://escoladeandroid.blogspot.com.br/2012/04/android-layout-relativelayout.html">http://escoladeandroid.blogspot.com.br/2012/04/android-layout-relativelayout.html</a> <br />
<br />
<br />
<div>Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div><br />
</div><br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com1tag:blogger.com,1999:blog-1139756238495061386.post-82710703679236567032012-03-29T17:26:00.001-07:002012-04-26T17:30:25.864-07:00Android - ListView Parte 8Olá, Pessoal<br />
<br />
Estou aqui mais uma vez para apresentar mais um tipo de (ListView) Lista de Itens, agora irei mostrar como criar um separador em nossas listas.<br />
<br />
Neste projeto terá a opção de incluir dinamicamente mais Itens ou Separadores.<br />
<br />
Abaixo seguem todos os fontes utilizados nesse projeto, como já de costume os fontes estão todos com diversos comentários para facilitar no entendimento.<br />
<br />
Abaixo temos uma imagem que mostra os arquivos utilizados no projeto:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSTQlSXIkUykZDSNMFWLS02rjw0XCjG1XMx27nNvZraMrKZjVvb7O0u8S_gCr4yUwdHKj7yumHO_Zq_-m-ycBiRQcO9frdUC1OGBvOw6bHWNn0Cpv3jBthyLGeA8iTFbzOzlfsL8x7WZYg/s1600/projeto.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSTQlSXIkUykZDSNMFWLS02rjw0XCjG1XMx27nNvZraMrKZjVvb7O0u8S_gCr4yUwdHKj7yumHO_Zq_-m-ycBiRQcO9frdUC1OGBvOw6bHWNn0Cpv3jBthyLGeA8iTFbzOzlfsL8x7WZYg/s1600/projeto.png" /></a></div>
<br />
<br />
Arquivo EstadoPojo.java<br />
<pre class="brush:java">package br.com.empresa;
public class EstadoPojo {
private long status;
private String estado;
private String capital;
public EstadoPojo()
{
}
public EstadoPojo(long pStatus, String pEstado, String pCapital)
{
this.status = pStatus;
this.estado = pEstado;
this.capital = pCapital;
}
public void setStatus(long status) {
this.status = status;
}
public long getStatus() {
return status;
}
public void setEstado(String nome) {
this.estado = nome;
}
public String getEstado() {
return estado;
}
public void setCapital(String endereco) {
this.capital = endereco;
}
public String getCapital() {
return capital;
}
}
</pre>
<br />
Arquivo main.java<br />
<pre class="brush:java">package br.com.ListSep;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
public class main extends Activity {
EstadosAdapter adapter;
private List<Object> lsEstados = new ArrayList<Object>();
/** Chamado quando a activity é chamada pela primeira vez */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try{
setContentView(R.layout.main);
ListView list = (ListView) findViewById(R.id.lvEstados2);
lsEstados.add("Norte");
lsEstados.add(new EstadoPojo(1, "Amazonas", "Manaus"));
lsEstados.add(new EstadoPojo(1, "Roraima", "Boa Vista"));
lsEstados.add(new EstadoPojo(1, "Acre", "Rio Branco"));
lsEstados.add("Sudeste");
lsEstados.add(new EstadoPojo(1, "São Paulo", "São Paulo"));
lsEstados.add(new EstadoPojo(1, "Minas Gerais", "Belo Horizonte"));
lsEstados.add(new EstadoPojo(1, "Rio de Janeiro", "Rio de Janeiro"));
lsEstados.add(new EstadoPojo(1, "Espírito Santo", "Vitória"));
adapter = new EstadosAdapter(this, lsEstados);
list.setAdapter(adapter);
//aqui apenas um exemplo de que podemos inserir mais itens em nossa
//lista, mesmo depois que já passamos o adapter para o obeto list
lsEstados.add("Sul");
lsEstados.add(new EstadoPojo(1, "Paraná", "Curitiba"));
adapter.notifyDataSetChanged();
}catch (Exception e) {
showToast("Erro: " + e.getMessage());
}
}
public void btnEstado_click(View v)
{
EditText etEstado = (EditText) findViewById(R.id.etEstado);
EditText etCapital = (EditText) findViewById(R.id.etCapital);
lsEstados.add(new EstadoPojo(1, etEstado.getText().toString(), etCapital.getText().toString()));
/*
Caso seja necessário incluir o item em uma posição determinada
basta efetuar como o exemplo abaixo, apenas mudando o valor "1"
para o valor que você desejar
*/
//lsEstados.add(1, new EstadoPojo(1, etEstado.getText().toString(), etCapital.getText().toString()));
adapter.notifyDataSetChanged();
}
public void btnCapital_click(View v)
{
//Cria o AlertDialog
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Região");
//alert.setMessage("Message");
//Cria uma caixa de texto para ser inserida dentro do AlertDialog
final EditText input = new EditText(this);
alert.setView(input);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
lsEstados.add(String.valueOf(input.getText()));
adapter.notifyDataSetChanged();
}
});
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//Cancelado.
}
});
alert.show();
}
private void showToast(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
//Garantir que quando finalizar o programa seja
//limpado todos os itens da coleção
lsEstados = new ArrayList<Object>();
}
}
</pre>
<br />
Arquivo EstadosAdapter.java<br />
<pre class="brush:java">package br.com.ListSep;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class EstadosAdapter extends BaseAdapter {
private List<Object> lsEstados;
Context context;
int ITEM_VIEW_ESTADO = 0;
final int ITEM_VIEW_SEPARADOR = 1;
final int ITEM_VIEW_COUNT = 2;
//Classe utilizada para instanciar os objetos do XML
private LayoutInflater inflater;
public EstadosAdapter(Context context, List<Object> pObjects) {
this.lsEstados = pObjects;
this.context = context;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final EstadoPojo item) {
this.lsEstados.add(item);
//Atualizar a lista caso seja adicionado algum item
notifyDataSetChanged();
}
@Override
public int getCount() {
return lsEstados.size();
}
@Override
public Object getItem(int position) {
return lsEstados.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return ITEM_VIEW_COUNT;
}
//Rotina responsável por identificar se o item da Lista
//é um Separador ou um item "normal"
@Override
public int getItemViewType(int position) {
return (lsEstados.get(position) instanceof String) ? ITEM_VIEW_SEPARADOR
: ITEM_VIEW_ESTADO;
}
@Override
public boolean isEnabled(int position) {
//Caso o item clicado seja o Separador, nesse caso
//não retornamos nada
return getItemViewType(position) != ITEM_VIEW_SEPARADOR;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
try{
final int type = getItemViewType(position);
if (convertView == null) {
convertView = inflater.inflate(type == ITEM_VIEW_SEPARADOR ?
R.layout.separator : R.layout.list_row, null);
}
if (type == ITEM_VIEW_SEPARADOR) {
//Informa o texto que será exibido no Separador
((TextView) convertView).setText((String) getItem(position));
} else {
final EstadoPojo estado = (EstadoPojo) getItem(position);
//Informa os valores que serão exibidos no Estado e Capital
TextView tvEstado = (TextView) convertView.findViewById(R.id.txtEstado);
tvEstado.setText(estado.getEstado());
TextView tvCapital = (TextView) convertView.findViewById(R.id.txtCapital);
tvCapital.setText(estado.getCapital());
}
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
return convertView;
}
public void toast (String msg)
{
Toast.makeText (context, msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
}
</pre>
<br />
Arquivo list_row.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="Estado"
android:id="@+id/txtEstado"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="30sp">
</TextView>
<TextView
android:text="Capital"
android:id="@+id/txtCapital"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="30sp">
</TextView>
</LinearLayout>
</pre>
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<EditText
android:inputType="text"
android:id="@+id/etEstado"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Estado">
</EditText>
<EditText
android:inputType="text"
android:id="@+id/etCapital"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Capital">
</EditText>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btnEstado"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onClick="btnEstado_click"
android:text="Adicionar Estado"
android:layout_weight="0.5">
</Button>
<Button
android:id="@+id/btnCapital"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:onClick="btnCapital_click"
android:text="Adicionar Região"
android:layout_weight="0.5">
</Button>
</LinearLayout>
<ListView
android:id="@+id/lvEstados2"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</ListView>
</LinearLayout>
</pre>
<br />
Arquivo separator.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_header_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="2dip"
android:paddingBottom="2dip"
android:paddingLeft="5dip"
style="@style/listSeparatorTextViewStyle"
android:text="Separador"
/>
</pre>
<br />
Arquivo colors.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#fff</color>
<color name="black">#000</color>
<color name="red">#c6360a</color>
<color name="green">#688f2b</color>
<color name="orange">#f48905</color>
<color name="dark_blue">#003366</color>
<color name="grey">#888888</color>
</resources>
</pre>
<br />
Arquivo styles.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="UTF-8"?>
<resources>
<style
name="listSeparatorTextViewStyle" parent="@android:attr/listSeparatorTextViewStyle">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">fill_parent</item>
<item name="android:textSize">15dip</item>
<item name="android:paddingTop">2dip</item>
<item name="android:paddingBottom">3dip</item>
<item name="android:paddingLeft">5dip</item>
<item name="android:paddingRight">10dip</item>
<item name="android:textAppearance">@android:style/TextAppearance.Small</item>
<item name="android:shadowColor">#111111</item>
<item name="android:shadowRadius">1</item>
<item name="android:shadowDy">1</item>
<item name="android:textStyle">bold</item>
<item name="android:textColor">@android:color/white</item>
<item name="android:background">@color/dark_blue</item>
</style>
</resources>
</pre>
<br />
<br />
Funcionamento do programa:<br />
1º - Clicando no botão "Adicionar Região" será exibido um AlertDialog solicitando um texto que no nosso exemplo seria uma região do Brasil, confirmando a operação o sistema irá adicionar no final da lista um Separador com o texto informando.<br />
2º - Clicando no botão "Adicionar Estado" o sistema irá inserir um item no final da lista com os valores informados nas duas caixas de texto.<br />
<br />
Como resultado temos a figura abaixo:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh37l3AEg23y6YqWDWlJLTAVi6zUkDKBqnOyIn2IOrJQrCbUmnxdx3Z4FcGS7-TnvxBWd71vVfIDfK4G1wRcjnmbilN2VLeSrDPBtLsYSb-0t87HECV46Z33HtejSuE8qW_HLw8TipH7ENS/s1600/ListView_Separador.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh37l3AEg23y6YqWDWlJLTAVi6zUkDKBqnOyIn2IOrJQrCbUmnxdx3Z4FcGS7-TnvxBWd71vVfIDfK4G1wRcjnmbilN2VLeSrDPBtLsYSb-0t87HECV46Z33HtejSuE8qW_HLw8TipH7ENS/s1600/ListView_Separador.png" title="ListView" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<br />
<br />
<br />
<br />
<div>
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html">http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html</a></div>
<div>
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html</a><br />
Parte 3 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html</a><br />
Parte 4 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html</a><br />
Parte 5 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html</a><br />
Parte 6 : <a href="http://escoladeandroid.blogspot.com.br/2011/12/android-listview-parte-6.html">http://escoladeandroid.blogspot.com.br/2011/12/android-listview-parte-6.html</a><br />
Parte 7 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html</a></div>
<div>
<br />
Trabalhando com Banco de Dados SQLite:<br />
<a href="http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html">http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html</a></div>
<br />
<br />
<div>
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com4tag:blogger.com,1999:blog-1139756238495061386.post-53596366865052377352012-03-16T18:51:00.007-07:002012-04-26T17:30:49.130-07:00Android - ListView Parte 7Olá,<br />
<br />
Vou apresentar mais uma opção de lista de itens, nesse caso, atendendo a pedidos vou criar uma lista de itens e de acordo com um determinado parâmetro a cor do texto será diferente da cor padrão utilizada em todos os itens da lista.<br />
<br />
A lista será criada com base em alguns Estados brasileiros e para isso será criada uma classe de POJO para guardar as informações de Estado, Capital e um Status.<br />
<br />
O campo de Status servirá para identificar se o estado será pintado com uma cor diferente da cor padrão, caso o campo Status seja igual a "1" a cor dos dados será vermelha caso seja igual a "2" a cor dos dados será branca.<br />
<br />
Será necessário criar um Adapter customizado para efetuar esse processo.<br />
<br />
Abaixo seguem os fontes utilizados nesse projeto:<br />
<br />
Arquivo EstadoPojo.java<br />
<pre class="brush:java">package br.com.empresa;
public class EstadoPojo {
private long status;
private String estado;
private String capital;
public void setStatus(long status) {
this.status = status;
}
public long getStatus() {
return status;
}
public void setEstado(String nome) {
this.estado = nome;
}
public String getEstado() {
return estado;
}
public void setCapital(String endereco) {
this.capital = endereco;
}
public String getCapital() {
return capital;
}
}
</pre>
<br />
Arquivo main.java<br />
<pre class="brush:java">package br.com.empresa;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
public class main extends ListActivity {
private SpecialAdapter mAdapter;
public void onListItemClick(ListView parent, View v, int position, long id) {
toast("Você clicou no item : " + String.valueOf(position));
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//definindo variável do tipo EstadoPOJO
EstadoPojo estado;
mAdapter = new SpecialAdapter(this);
//criando a variável estado e atribuindo os valores desejados
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Minas Gerais");
estado.setCapital("Belo Horizonte");
//adicionando o estado ao Adapter
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Rio Grande do Sul");
estado.setCapital("Porto Alegre");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(1);
estado.setEstado("Rio Grande do Norte");
estado.setCapital("Natal");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Amazonas");
estado.setCapital("Manaus");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(1);
estado.setEstado("Pará");
estado.setCapital("Belém");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Paraná");
estado.setCapital("Curitiba");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("São Paulo");
estado.setCapital("São Paulo");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Goiás");
estado.setCapital("Goiânia");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Santa Catarina");
estado.setCapital("Florianópolis");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Bahia");
estado.setCapital("Salvador");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Ceará");
estado.setCapital("Fortaleza");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(1);
estado.setEstado("Piauí");
estado.setCapital("Teresina");
mAdapter.addItem(estado);
estado = new EstadoPojo();
estado.setStatus(2);
estado.setEstado("Rondônia");
estado.setCapital("Porto Velho");
mAdapter.addItem(estado);
setListAdapter(mAdapter);
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
}
</pre>
<br />
Arquivo SpecialAdapter.java<br />
<pre class="brush:java">package br.com.empresa;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class SpecialAdapter extends BaseAdapter {
private List<EstadoPojo> mData = new ArrayList<EstadoPojo>();
//Classe utilizada para instanciar os objetos do XML
private LayoutInflater mInflater;
Context context;
public SpecialAdapter(Context context) {
this.context = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final EstadoPojo item) {
mData.add(item);
//Atualizar a lista caso seja adicionado algum item
notifyDataSetChanged();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public EstadoPojo getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//O ViewHolder irá guardar a instâncias dos objetos do estado_row
ViewHolder holder;
//Quando o objeto convertView não for nulo nós não precisaremos inflar
//os objetos do XML, ele será nulo quando for a primeira vez que for carregado
if (convertView == null) {
convertView = mInflater.inflate(R.layout.main, null);
//Cria o Viewholder e guarda a instância dos objetos
holder = new ViewHolder();
holder.textEstado = (TextView)convertView.findViewById(R.id.txtEstado);
holder.textCapital = (TextView)convertView.findViewById(R.id.txtCapital);
convertView.setTag(holder);
} else {
//pega o ViewHolder para ter um acesso rápido aos objetos do XML
//ele sempre passará por aqui quando,por exemplo, for efetuado uma rolagem na tela
holder = (ViewHolder)convertView.getTag();
}
holder.textEstado.setText("Estado :" + (CharSequence) mData.get(position).getEstado());
holder.textCapital.setText("Capital :" + (CharSequence) mData.get(position).getCapital());
//Modifica a cor do texto de acordo com a propriedade Status
if (mData.get(position).getStatus() == 1)
{
holder.textEstado.setTextColor(context.getResources().getColor(R.color.red));
holder.textCapital.setTextColor(context.getResources().getColor(R.color.red));
}else{
holder.textEstado.setTextColor(context.getResources().getColor(R.color.white));
holder.textCapital.setTextColor(context.getResources().getColor(R.color.white));
}
return convertView;
}
//Criada esta classe estática para guardar a referência dos objetos abaixo
public static class ViewHolder {
public TextView textEstado;
public TextView textCapital;
}
}
</pre>
<br />
Arquivo main.xml<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="TextView"
android:id="@+id/txtEstado"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="30sp">
</TextView>
<TextView
android:text="TextView"
android:id="@+id/txtCapital"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="30sp">
</TextView>
</LinearLayout>
</pre>
<br />
Como resultado temos a seguinte imagem:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA-cMw-QeQnJ_WU-VSIcDDvVVxkdQe8-KS5V-BaUNecIXocxOTtYvzuwX6qarJBkEg9c44KhDVWxRtMNffPoagn2MAuNU3FU36W7VqIv1zjtRGwYsuGGFRDLKKVGYVPo5P2_Pxcyo8KVxt/s1600/listview7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA-cMw-QeQnJ_WU-VSIcDDvVVxkdQe8-KS5V-BaUNecIXocxOTtYvzuwX6qarJBkEg9c44KhDVWxRtMNffPoagn2MAuNU3FU36W7VqIv1zjtRGwYsuGGFRDLKKVGYVPo5P2_Pxcyo8KVxt/s1600/listview7.png" title="ListView" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<br />
<br />
<br />
Por enquanto é isso espero que tenham gostado e em breve estarei postando mais discas e tutoriais sobre listview e layout.<br />
<br />
<br />
<div>
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html">http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html</a></div>
<div>
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html</a><br />
Parte 3 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html</a><br />
Parte 4 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html</a><br />
Parte 5 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html</a><br />
Parte 6 : <a href="http://escoladeandroid.blogspot.com.br/2011/12/android-listview-parte-6.html">http://escoladeandroid.blogspot.com.br/2011/12/android-listview-parte-6.html</a><br />
Parte 8 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html</a></div>
<div>
<br />
Trabalhando com Banco de Dados SQLite:<br />
<a href="http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html">http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html</a></div>
<br />
<br />
<div>
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com3tag:blogger.com,1999:blog-1139756238495061386.post-19967914695286194582012-02-26T10:44:00.003-08:002012-04-17T18:58:20.740-07:00Android - Criando menuOlá<br />
<br />
Hoje vamos aprender como criar um Menu manualmente, como todos devem saber é de grande importância em qualquer aplicativo se ter um menu com as opções que forem necessárias ao aplicativo.<br />
<br />
Para isso devemos implementar dois métodos que já são nativos a qualquer Activity.<br />
<br />
Abaixo segue o fonte necessário para criar um menu.<br />
<br />
Arquivo main.xml, layout da única tela apresentada nesse projeto:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:text="Escola de Android - criando menu"/>
</LinearLayout>
</pre>
<br />
<br />
Arquivo main.java:<br />
<pre class="brush:java">package br.com.EscolaDeAndroid.Menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;
public class main extends Activity {
//definição das constantes utilizadas na criação do menu
private static final int ARQUIVO = 0;
private static final int EDITAR = 1;
private static final int FORMATAR = 2;
private static final int ARQ_NOVO = 3;
private static final int ARQ_SALVAR = 4;
private static final int EDITAR_RECORTAR = 5;
private static final int EDITAR_COPIAR = 6;
private static final int FORMATAR_FONTE = 7;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//o método abaixo é disparado quando o usuário
//clicar no botão "Menu" do aparelho
@Override
public boolean onCreateOptionsMenu(Menu menu) {
try
{
//cria o menu e submenus
SubMenu menuArquivo = menu.addSubMenu(ARQUIVO, 0, 0, "Arquivo");
SubMenu menuEditar = menu.addSubMenu(EDITAR, 1, 0, "Editar");
MenuItem menuFormatar = menu.add(FORMATAR, FORMATAR_FONTE, 0, "Formatar");
//define uma tecla de atalho para o menu, nesse caso a
//tecla de atalho é a letra "F"
menuFormatar.setShortcut('0', 'F');
//adiciona um ícone ao menu
//menuFormatar.setIcon(R.drawable.icon);
menuFormatar.setIcon(android.R.drawable.ic_menu_edit);
//caso seja necessário desabilitar o menu Arquivo
//abaixo segue exemplo
//menu.findItem(ARQUIVO).setEnabled(false);
menuArquivo.add(ARQUIVO, ARQ_NOVO, 0, "Novo");
menuArquivo.add(ARQUIVO, ARQ_SALVAR, 1, "Salvar");
menuArquivo.setIcon(android.R.drawable.ic_menu_more);
//caso seja necessário desabilitar um subitem do menu Arquivo
//abaixo segue exemplo
//menuArquivo.findItem(ARQ_NOVO).setEnabled(false);
menuEditar.add(EDITAR, EDITAR_RECORTAR, 0, "Recortar");
menuEditar.add(EDITAR, EDITAR_COPIAR, 1, "Copiar");
//caso seja necessário desabilitar um subitem do menu Editar
//abaixo segue exemplo
//menuEditar.findItem(EDITAR_COPIAR).setEnabled(false);
}
catch (Exception e) {
trace("Erro : " + e.getMessage());
}
return super.onCreateOptionsMenu(menu);
}
//o método abaixo é disparado quando o usuário clicar
//em algum dos itens do menu
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//de acordo com o item selecionado você executará
//a função desejada
switch (item.getItemId()) {
case ARQ_NOVO:
trace("Você selecionou o menu Novo");
break;
case ARQ_SALVAR:
trace("Você selecionou o menu Salvar");
break;
case EDITAR_COPIAR:
trace("Você selecionou o menu Copiar");
break;
case EDITAR_RECORTAR:
trace("Você selecionou o menu Recortar");
break;
case FORMATAR_FONTE:
trace("Você selecionou o menu Formatar");
break;
}
return true;
}
private void trace (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
}
</pre>
<br />
<br />
Neste exemplo utilizado temos as seguintes opções:<br />
1. menu simples<br />
2. menu com submenu<br />
3. habilitar e desabilitar itens do menu<br />
4. inserir imagens<br />
5. parametrizar tecla de atalho<br />
<br />
Como resultado temos as imagens abaixo:<br />
Clicando no botão Menu de seu aparelho será apresentado o Menu raiz, se clicar no item "Arquivo", será exibido um submenu com as opções "Novo" e "Salvar", se clicar na opção "Novo", será exibido a mensagem que você clicou no Menu "Novo".<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmu6xLjy_R7VGMur3cCO1v1ulL4Lr0C-jBTKpIJL3PnirXmTmg1Bdczlw5ovHIXsNpoNuRfPgPuQLmAXofM2_Jd4hhh5OqRZfgLSI-HQbwfnQxAvj_Xd28vjbFmyfnM-quTez9nXwwvFSe/s1600/menu.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmu6xLjy_R7VGMur3cCO1v1ulL4Lr0C-jBTKpIJL3PnirXmTmg1Bdczlw5ovHIXsNpoNuRfPgPuQLmAXofM2_Jd4hhh5OqRZfgLSI-HQbwfnQxAvj_Xd28vjbFmyfnM-quTez9nXwwvFSe/s400/menu.png" width="270" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZUZ3Czbu5F5eBvTetggSR2tF8hyKT1i375NnkCAnrSU6jnx3mpKHFcHGxgrkgBCmJ2nfhR7JMPd9th06bKJQX9bw3JBU_WhSd4DBoyEbtMXRRIiBfQX0Z1XKzTBCrQL_iRrNF6HG2Co-/s1600/menu1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJZUZ3Czbu5F5eBvTetggSR2tF8hyKT1i375NnkCAnrSU6jnx3mpKHFcHGxgrkgBCmJ2nfhR7JMPd9th06bKJQX9bw3JBU_WhSd4DBoyEbtMXRRIiBfQX0Z1XKzTBCrQL_iRrNF6HG2Co-/s400/menu1.png" width="271" /></a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlY80hfmU6Las6ziL05r2OkiJQzbkumIhAEgA6aNmuoico8YYQFhOVFP1YvqP2YgBL4aDc52_SB39xGXQj67mHb4hgmDOFSOmq3Uiqqz7LzqdsnQFj_lrFBiQpNbvJppyWZ9r6iUZUtJC3/s1600/menu2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlY80hfmU6Las6ziL05r2OkiJQzbkumIhAEgA6aNmuoico8YYQFhOVFP1YvqP2YgBL4aDc52_SB39xGXQj67mHb4hgmDOFSOmq3Uiqqz7LzqdsnQFj_lrFBiQpNbvJppyWZ9r6iUZUtJC3/s400/menu2.png" width="271" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Espero que seja útil para você este tutorial.<br />
<br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com9tag:blogger.com,1999:blog-1139756238495061386.post-48841840943011135432012-02-23T15:52:00.001-08:002012-04-17T18:58:36.387-07:00Android - ProgressDialogOlá,<br />
<br />
Hoje irei mostrar como utilizar a classe ProgressDialog, ela é de grande utilidade em nosso sistemas, principalmente quando o sistema precisa efetuar alguma operação mais demorada e não deixar o usuário com aquela sensação de que o sistema travou.<br />
<br />
Existem dois tipos de ProgressDialog que podem ser utilizados:<br />
1 - Loop infinito - Quando você não consegue precisar quando a operação vai terminar, exemplo uma consulta a base de dados que seja muito demorada<br />
2 - Loop finito - Quando por exemplo, você sabe exatamente a quantidade de registros que o seu sistema irá processar.<br />
<br />
Como já de costume todos os fontes abaixo estão com vários comentários para facilitar o aprendizado.<br />
<br />
Arquivo main.xml, layout da única tela apresentada nesse projeto:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:text="Progress 1"
android:id="@+id/button1"
android:onClick="Progress1_Click"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
<Button
android:text="Progress 2"
android:id="@+id/button2"
android:onClick="Progress2_Click"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
</pre>
<br />
Arquivo main.java:<br />
<pre class="brush:java">package br.com.EscaloDeAndroid.Progress;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class main extends Activity {
private ProgressDialog mprogressDialog;
private Handler mhandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mhandler = new Handler();
}
//o botão abaixo irá simular um processo em que não sabemos quanto tempo
//ele irá demorar
public void Progress1_Click(View v)
{
//cria o progress dialog
mprogressDialog = ProgressDialog.show(main.this, "Aguarde", "Processando...");
new Thread() {
public void run() {
//criando instância de classe para executar um método qualquer
teste lteste = new teste();
try{
//esse é apenas um método de teste que pode ser demorado
lteste.Esperar(10);
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
//encerra progress dialog
mprogressDialog.dismiss();
}
}.start();
}
//o botão abaixo irá simular uma barra com progressão
//e poderemos monitorar seu progresso
public void Progress2_Click(View v)
{
mprogressDialog = new ProgressDialog(this);
mprogressDialog.setCancelable(true);
mprogressDialog.setMessage("Processando...");
//define o estilo como horizontal que nesse caso signifca que terá
//barra de progressão/contagem
mprogressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//reseta o progress para zero e em seguida define o valor máximo
mprogressDialog.setProgress(0);
mprogressDialog.setMax(8); //esse valor deverá ser definido de acordo com sua necessidade
//apresnta o progressbar
mprogressDialog.show();
new Thread() {
public void run() {
//criando instância de classe para executar um método qualquer
teste lteste = new teste();
try{
while (mprogressDialog.getProgress() < mprogressDialog.getMax()) {
//esse é apenas um método de teste que pode ser demorado
lteste.Esperar(1);
mprogressDialog.incrementProgressBy(1);
}
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
//Exibe mensagem apenas informando o fim da execução da thread
mhandler.post(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Acabou", Toast.LENGTH_LONG).show();
}
});
//encerra progress dialog
mprogressDialog.dismiss();
}
}.start();
}
}
</pre>
<br />
<br />
Abaixo segue o arquivo teste.java:<br />
<pre class="brush:java">package br.com.EscaloDeAndroid.Progress;
public class teste extends Thread {
public void Esperar(int pintSegundos)
{
try {
//simulando um processo demorado
Thread.sleep(pintSegundos * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
</pre>
<br />
Como resultado temos as seguintes imagens:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiip8kUZSbPTSewtk5RamNsLnBLANF6gjxousVBo2Ug6b1yQpzmTbfYgc3Bdp9T-zTHHHk8Bri8IWhG0gSVxIaZThtEMzT5pN5CgYbYvP1Qpvvup4VjKqzBDbvVNsQH902luXdyhte3oX7s/s1600/ProgressDialog1.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiip8kUZSbPTSewtk5RamNsLnBLANF6gjxousVBo2Ug6b1yQpzmTbfYgc3Bdp9T-zTHHHk8Bri8IWhG0gSVxIaZThtEMzT5pN5CgYbYvP1Qpvvup4VjKqzBDbvVNsQH902luXdyhte3oX7s/s400/ProgressDialog1.JPG" width="272" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc350xiwshRbF1uPghyphenhyphenwTNoPoYiREh8SjigPMi5cdp5iWmn9D_W1177ggQkwGhiZFwcejKrwBrpaO8FPkHgXAw7mpq-SektdxJzX16Ji7VC6KWizoC2sqValCTnl6m0g94rbZvfQii2LdF/s1600/ProgressDialog2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc350xiwshRbF1uPghyphenhyphenwTNoPoYiREh8SjigPMi5cdp5iWmn9D_W1177ggQkwGhiZFwcejKrwBrpaO8FPkHgXAw7mpq-SektdxJzX16Ji7VC6KWizoC2sqValCTnl6m0g94rbZvfQii2LdF/s400/ProgressDialog2.JPG" width="271" /></a><br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com5tag:blogger.com,1999:blog-1139756238495061386.post-23918636452131771032012-02-09T15:48:00.001-08:002012-04-13T20:00:16.469-07:00Android - Trabalhando com arquivo texto Parte 1Olá<br />
<br />
Hoje iremos começar mais uma série de artigos e estes agora serão voltados a manipulação de arquivos, nesse projeto serão criadas três rotinas que são:<br />
1º - criação de arquivos<br />
2º - leitura de arquivos<br />
3º - obter o System Root (diretório de armazenamento externo do Android)<br />
<br />
Um detalhe importante para esse projeto é que será necessário habilitar a permissão WRITE_EXTERNAL_STORAGE no arquivo de manifest, é graças a essa permissão que seu aplicativo pode gravar arquivos no SD Card.<br />
<br />
Como já de costume todos os fontes abaixo estão com vários comentários para facilitar o aprendizado.<br />
<br />
<br />
Arquivo main.xml, layout da única tela apresentada nesse projeto:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:text="Root:"
android:id="@+id/txtRoot2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="Nome do arquivo:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edtNomeArq"
android:text="teste.txt"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<TextView
android:text="Texto do arquivo a ser salvo:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edtSalvar"
android:text="Escrever arquivo"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<TextView
android:text="Arquivo lido:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:id="@+id/edtLer"
android:text=""
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<Button
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:onClick="click_Salvar"
android:text="Salvar" />
<Button
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:onClick="click_Ler"
android:text="Abrir" />
<Button
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:onClick="click_Limpar"
android:text="Limpar" />
</LinearLayout>
</LinearLayout>
</pre><br />
Arquivo AndroidManifest.xml, contém configurações iniciais do aplicativo:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscolaDeAndroid.ArquivoTexto"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
</pre><br />
<br />
Arquivo main.java, classe que contém todo o fonte necessário para este projeto:<br />
<pre class="brush:java">package br.com.EscolaDeAndroid.ArquivoTexto;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class main extends Activity {
private TextView txtRoot;
private TextView txtNomeArq;
private TextView txtSalvar;
private TextView txtLer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
setContentView(R.layout.main);
txtRoot = (TextView) findViewById(R.id.txtRoot2);
txtNomeArq = (TextView) findViewById(R.id.edtNomeArq);
txtSalvar = (TextView) findViewById(R.id.edtSalvar);
txtLer = (TextView) findViewById(R.id.edtLer);
txtRoot.append(GetRoot());
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void click_Salvar(View v)
{
SalvarArquivo();
}
public void click_Ler(View v)
{
LerArquivo();
}
public void click_Limpar(View v)
{
txtNomeArq.setText("teste.txt");
txtSalvar.setText("");
txtLer.setText("");
}
//Exibir o diretório de armazenamento externo do Android
private String GetRoot()
{
File root = android.os.Environment.getExternalStorageDirectory();
return root.toString();
}
private void SalvarArquivo()
{
String lstrNomeArq;
File arq;
byte[] dados;
try
{
//pega o nome do arquivo a ser gravado
lstrNomeArq = txtNomeArq.getText().toString();
arq = new File(Environment.getExternalStorageDirectory(), lstrNomeArq);
FileOutputStream fos;
//transforma o texto digitado em array de bytes
dados = txtSalvar.getText().toString().getBytes();
fos = new FileOutputStream(arq);
//escreve os dados e fecha o arquivo
fos.write(dados);
fos.flush();
fos.close();
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
private void LerArquivo()
{
String lstrNomeArq;
File arq;
String lstrlinha;
try
{
//pega o nome do arquivo a ser lido
lstrNomeArq = txtNomeArq.getText().toString();
//limpa a caixa de texto que irá receber os dados do arquivo
txtLer.setText("");
arq = new File(Environment.getExternalStorageDirectory(), lstrNomeArq);
BufferedReader br = new BufferedReader(new FileReader(arq));
//efetua uma leitura linha a linha do arquivo a carrega
//a caixa de texto com a informação lida
while ((lstrlinha = br.readLine()) != null) {
if (!txtLer.getText().toString().equals(""))
{
txtLer.append("\n");
}
txtLer.append(lstrlinha);
}
} catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
}
</pre><br />
Abaixo temos o resultado prático de nosso projeto:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirTeRJwe4YTWKLgpJeDe8007YGIHX5FxxFTmHFCTH-eQ0NpWE5CKHK2nOaHJe7spzSHDE3hRo5xE42DafdoGcJb6PiUwXt5r6l-IWLlfYU2FE00xgNJ8rqynno_UgQmsw2bTTLNRLFZZpV/s1600/textfile.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirTeRJwe4YTWKLgpJeDe8007YGIHX5FxxFTmHFCTH-eQ0NpWE5CKHK2nOaHJe7spzSHDE3hRo5xE42DafdoGcJb6PiUwXt5r6l-IWLlfYU2FE00xgNJ8rqynno_UgQmsw2bTTLNRLFZZpV/s1600/textfile.png" /></a></div><br />
<br />
O funcionamento do projeto será o seguinte:<br />
1º - na primeira caixa de texto será o local onde o usuário irá informar o nome do arquivo a ser salvo, por padrão o nome do arquivo será teste.txt, mas o usuário poderá informar o nome que desejar.<br />
2º - na segunda caixa de texto será para digitar o conteúdo de nosso arquivo, em seguida o usuário deve clicar no botão "Salvar" para efetuar a gravação do arquivo.<br />
3º - clicando no botão "Abrir" o sistema irá buscar o arquivo de acordo com a primeira caixa de texto e exibir o conteúdo na terceira caixa de texto.<br />
4º - clicando no botão "Limpar" o aplicativo limpará a segunda e a terceira caixa de texto.<br />
<br />
Obs.: não fiz tratamento de erro do tipo, arquivo não encontrado, se deseja substituir o arquivo já existente, esses serão temas para os próximos artigos.<br />
<br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div><br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com17tag:blogger.com,1999:blog-1139756238495061386.post-66030088532014675322012-02-06T16:29:00.001-08:002012-04-13T20:00:30.353-07:00Android - Gerando gráficos com Google Chart APIOlá,<br />
<br />
<br />
Atualmente todo aplicativo comercial que se preze necessita exibir dados em formas de gráficos e hoje vou mostrar como desenvolver gráficos para Android utilizando a Api Google Chart, a princípio é muito fácil, para isto basta utilizar um controle WebView e habilitar a permissão para utilização de INTERNET.<br />
<br />
No projeto apresentado abaixo os dados do gráfico estão fixos no fonte, cabe a você montar em seu aplicativo uma string dinâmica com dados reais e passar como URL no método loadUrl do componente WebView, abaixo seguem todos os fontes utilizados no sistema.<br />
<br />
<br />
Arquivo main.xml, layout da única tela apresentada nesse projeto:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<WebView
android:id="@+id/wvGrafico"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center"/>
</LinearLayout>
</pre><br />
Arquivo AndroidManifest.xml, contém configurações iniciais do aplicativo:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.EscoladeAndroid.Grafico"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="org.achartengine.GraphicalActivity"/>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
</pre><br />
Arquivo main.java, classe que irá exibir o gráfico:<br />
<pre class="brush:java">package br.com.EscoladeAndroid.Grafico;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.Toast;
public class main extends Activity {
WebView wvGrafico;
String strURL;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
strURL = "https://chart.googleapis.com/chart?" +
"cht=lc&" + //define o tipo do gráfico "linha"
"chxt=x,y&" + //imprime os valores dos eixos X, Y
"chs=300x300&" + //define o tamanho da imagem
"chd=t:10,45,5,10,13,26&" + //valor de cada coluna do gráfico
"chl=Jan|Fev|Mar|Abr|Mai|Jun&" + //rótulo para cada coluna
"chdl=Vendas&" + //legenda do gráfico
"chxr=1,0,50&" + //define o valor de início e fim do eixo
"chds=0,50&" + //define o valor de escala dos dados
"chg=0,5,0,0&" + //desenha linha horizontal na grade
"chco=3D7930&" + //cor da linha do gráfico
"chtt=Vendas+x+1000&" + //cabeçalho do gráfico
"chm=B,C5D4B5BB,0,0,0"; //fundo verde
//Abaixo seguem outros exemplo de gráfico:
//strURL = "https://chart.googleapis.com/chart?cht=lc&chxt=x,y&chs=300x300&chd=t:10,45,5,10,13,26&chl=Janeiro|Fevereiro|Marco|Abril|Maio|Junho&chdl=Vendas%20&chxr=1,0,50&chds=0,25&chg=0,5,0,0&chco=3D7930&chtt=Vendas+x+1000&chm=v,FF0000,0,::.10,4";
//strURL = "http://chart.apis.google.com/chart?cht=bhg&chs=550x400&chd=t:100,50,115,80|10,20,15,30&chxt=x,y&chxl=1:|Janeiro|Fevereiro|Marco|Abril&chxr=0,0,120&chds=0,120&chco=4D89F9&chbh=35,0,15&chg=8.33,0,5,0&chco=0A8C8A,EBB671&chdl=Vendas|Compras";
//strURL = "https://chart.googleapis.com/chart?cht=lc&chxt=x,y&chs=700x350&chd=t:10,45,5,10|30,35,30,15|10,10.5,30,35&chl=Janeiro|Fevereiro|Marco|Abril&chdl=Vendas|Compras|Outros&chxr=1,0,50&chds=0,50&chg=0,5,0,0&chco=DA3B15,3072F3,000000&chtt=grafico+de+vendas";
//strURL = "https://chart.googleapis.com/chart?cht=p3&chs=200x90&chd=t:40,45,5,10&chl=Jan|Fev|Mar|Abr";
//strURL = "http://chart.apis.google.com/chart?chxl=0:|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec&chxt=x,y&chs=300x300&cht=r&chco=FF0000&chd=t:63,64,67,73,77,81,85,86,85,81,74,67,63&chls=2,4,0&chm=B,FF000080,0,0,0";
wvGrafico = (WebView)findViewById(R.id.wvGrafico);
wvGrafico.loadUrl(strURL);
}
}
</pre><br />
Ao executar esse aplicativo teremos a seguinte imagem:<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIYYGSzNR2Xa-jUDCPb0nNp2ApesaTGb0ShV0f5Y3zjZpFTR6v8e9A2kIutlLHEh31kmFYWD3AciPXRpzJBD3te_4QZ4prKA7EuX260zjE51LxaTZ5nUPAunv4cZl-iNsaYUemq1zKQDJh/s1600/chart.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIYYGSzNR2Xa-jUDCPb0nNp2ApesaTGb0ShV0f5Y3zjZpFTR6v8e9A2kIutlLHEh31kmFYWD3AciPXRpzJBD3te_4QZ4prKA7EuX260zjE51LxaTZ5nUPAunv4cZl-iNsaYUemq1zKQDJh/s1600/chart.png" /></a></div><br />
<br />
Agora vamos ver uma pequena explicação sobre cada um dos principais atributos de nosso gráfico:<br />
<br />
<div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Type (cht)</b> : tipo de gráfico que será utilizado (pizza (p, p3, pc), barra (bhs, bvs, bhg, bvg, bvo), linha (lc, ls, lxy))</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Size (chs)</b> : define o tamanho em pixels para seu gráfico (width x height) </div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Data (chd)</b> : dados que você irá apresentar em seu gráfico</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Colour (chco)</b> : cor ou cores que serão utilizados em seu gráfico deve-se utilizar a representação Hex (RRGGBB)</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Labels (chl)</b> : define os rótulos que seu gráfico terá, normalmente você irá utilizar um rótulo para cada Dado utilizados em (chd)</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Grid Lines (chg)</b> : desenha linhas dentro de seu gráfico para facilitar e leitura de cada gráfico, esse atributo possui 4 parâmetros que são chg = <verticalGridLines>, <horizontalGridLines>, <lineSize>, <gapSize></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Char Title (chtt)</b> : define o título do gráfico</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Legend (chdl)</b> : define a legenda do gráfico, normalmente será definida por uma barra lateral vertical</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Data Scale (chds)</b> : define os valores de mínimo e máximo para o gráfico, qualquer valor maior que o máximo será exibido como se fosse o máximo.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Char Axis Range (chxr)</b> : determina de início e fim do eixo, esse atributo possui três parâmetros, o primeiro determina qual eixo está sendo utilizado, o segundo e o terceiro definem a própria faixa de atuação do gráfico</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Chart Shape Markers (chm</b>) : Preenche o conteúdo do gráfico com uma cor definida, exemplo: (chm=B,C5D4B5BB,0,0,0) ou (chm=v,FF0000,0,::.10,4)</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b>Char Visible Axis (chxt)</b> : mostra os números dos eixos X,Y</div><br />
<br />
<br />
Referência:<br />
<a href="http://code.google.com/intl/pt-BR/apis/chart/image/docs/gallery/chart_gall.html">http://code.google.com/intl/pt-BR/apis/chart/image/docs/gallery/chart_gall.html</a> <br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div><br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com8tag:blogger.com,1999:blog-1139756238495061386.post-33397051455242598552012-02-04T10:27:00.001-08:002012-04-17T18:58:53.447-07:00Ganhar dinheiro com Android - Parte 3Olá<br />
<br />
Mais uma vez estou aqui escrevendo sobre como ganhar dinheiro com Android, bem..., consegui receber meu primeiro pagamento referente meu jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> o pagamento saiu agora em Janeiro de 2012, depois de 6 meses com o aplicativo publicado no Google Market, ele me rendeu US$24,96 até o dia 12/01/2012.<br />
<br />
Pretendo em breve criar uma segunda versão do mesmo jogo, só que desta pago e sem propaganda para ver se o retorno é maior, assim que possível eu posto mais novidades sobre esse assunto.<br />
<br />
Agora explicando como foi que recebi meu pagamento, eu acompanho todos os dias o site do AdMob para ver quanto cliques são realizados em meu aplicativo e um dia vi que o AdMob tinha liberado um pagamento para mim, em seguida criei uma conta no PayPal e depois eu a vinculei com a minha conta do AdMob depois disso foi só esperar uns dois ou três dias úteis e meu pagamento caiu na minha conta bancaria.<br />
<br />
Abaixo segue uma imagem do PayPal sobre a liberação do pagamento.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlyAGaFjdG8iBrckbshGqYoC7sECT-4kLwynQ22cfofKi54Z2R5uEym8bz5tIH-pJQHo7-dHvdS3Ljqajlup-V_mXhzgyUhCAq2I0OZqK2bMSiuSIm-XVU-Po508816cxBffDxypZ-R757/s1600/paypal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="403" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlyAGaFjdG8iBrckbshGqYoC7sECT-4kLwynQ22cfofKi54Z2R5uEym8bz5tIH-pJQHo7-dHvdS3Ljqajlup-V_mXhzgyUhCAq2I0OZqK2bMSiuSIm-XVU-Po508816cxBffDxypZ-R757/s640/paypal.jpg" width="640" /></a></div>
<br />
<br />
Sei que o valor é baixo, mas nem por isso me desanimo, oque eu queria era conhecer todo o fluxo desde o desenvolvimento, publicação, propaganda e recebimento e consegui verificar que ele funciona.<br />
<br />
Por enquanto é isso.<br />
<br />
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/08/ganhar-dinheiro-com-android.html">http://escoladeandroid.blogspot.com/2011/08/ganhar-dinheiro-com-android.html</a> <br />
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/ganhar-dinheiro-com-android-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/ganhar-dinheiro-com-android-parte-2.html</a><br />
<br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br />
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com4tag:blogger.com,1999:blog-1139756238495061386.post-5371732408711987722012-02-04T06:37:00.005-08:002012-04-24T18:54:00.903-07:00Android - Criando uma Agenda de Contatos com SQLiteOlá,<br />
<br />
Hoje apresentarei para vocês como trabalhar com o Banco de Dados SQLite, serão apresentadas as operações básicas de um banco de dados (inclusão, exclusão, alteração e consulta) o projeto é uma Agenda de Contatos e ele está separado em camadas e cada camada está dentro de uma package, abaixo seguem as camadas utilizadas:<br />
<br />
<b>Camadas:</b><br />
1. UI - User Interface, responsável pela interação entre o usuário e o sistema.<br />
2. POJO - Plain Old Java Objects, responsável pelo transporte dos dados entre o BD, regras de negócio e o usuário.<br />
2. DAO - Data Access Object, responsável pela persistência dos dados.<br />
<br />
Abaixo segue uma figura com a estrutura e todos os arquivos que criaremos nesse projeto:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmGMfLasSRUC26SIgaFJmqOEL6sftZ-nnFKaEGbG3DDBYGuEc6HM5uwcSLtOKUg83PA30PEBjf1kxwpGiBoALYFPzRsk9aR2vQXngiA05gA24OgsL6RKxRCateivurmJQ5-XbaIuTbXN-6/s1600/projeto1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmGMfLasSRUC26SIgaFJmqOEL6sftZ-nnFKaEGbG3DDBYGuEc6HM5uwcSLtOKUg83PA30PEBjf1kxwpGiBoALYFPzRsk9aR2vQXngiA05gA24OgsL6RKxRCateivurmJQ5-XbaIuTbXN-6/s1600/projeto1.JPG" /></a></div>
<br />
<br />
Além das camadas o projeto também utiliza um Adapter customizado (ContatoAdapter), para poder apresentar mais de uma linha de informação para cada item de nossa ListView, pois na mesma tela presentaremos todos os contatos cadastrados.<br />
<br />
Abaixo vou apresentar todos os fontes e xml criados nesse projeto, todos os fontes estarão com vários comentários para auxiliar no bom entendimento do projeto.<br />
<br />
Iremos começar pelos arquivos xml:<br />
<br />
Arquivo arrays.xml, contém os itens que serão apresentados no ContextMenu:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="menu">
<item>Editar</item>
<item>Excluir</item>
</string-array>
</resources>
</pre>
<br />
<br />
Arquivo main.xml, layout da tela de consulta dos Contatos:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Adicionar"
android:onClick="onClick"/>
</LinearLayout>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
</pre>
<br />
Layout gráfico do main.xml<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx5Ms2rlPM35sle87Rxp1H63clYhEA0Xw4YWs4Gbc38TTsBH2YKAG4Q8jeqLdxtxbfvVlJSG91_I0HF90BWoHz-oXA-bUWEnHN1sA3uY0ibprooYjHLyQStr2RRJddiOvIer6FcJnUMBbn/s1600/layout1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx5Ms2rlPM35sle87Rxp1H63clYhEA0Xw4YWs4Gbc38TTsBH2YKAG4Q8jeqLdxtxbfvVlJSG91_I0HF90BWoHz-oXA-bUWEnHN1sA3uY0ibprooYjHLyQStr2RRJddiOvIer6FcJnUMBbn/s1600/layout1.JPG" /></a></div>
<br />
<br />
Arquivo contato.xml, layout da tela de inclusão e alteração do Contato:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txtAux1"
android:text="Nome :"
android:gravity="right"
android:width="70dip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="10dip"
>
</TextView>
<EditText
android:id="@+id/edtNome"
android:layout_marginLeft="5dip"
android:text="Nome contato"
android:width="190dip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_toRightOf="@+id/txtAux1">
</EditText>
<TextView
android:id="@+id/txtAux3"
android:text="Endereço :"
android:width="70dip"
android:gravity="right"
android:layout_marginTop="10dip"
android:layout_centerVertical="@+id/txtAux2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_below="@+id/edtNome"
android:layout_alignParentLeft="true">
</TextView>
<EditText
android:id="@+id/edtEndereco"
android:layout_marginLeft="5dip"
android:text="Endereco contato"
android:width="190dip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_below="@+id/edtNome"
android:layout_toRightOf="@+id/txtAux3">
</EditText>
<TextView
android:id="@+id/txtAux5"
android:text="Telefone :"
android:width="70dip"
android:gravity="right"
android:layout_marginTop="10dip"
android:layout_centerVertical="@+id/txtAux2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_below="@+id/edtEndereco"
android:layout_alignParentLeft="true">
</TextView>
<EditText
android:id="@+id/edtTelefone"
android:layout_marginLeft="5dip"
android:text="Telefone contato"
android:width="190dip"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_below="@+id/edtEndereco"
android:layout_toRightOf="@+id/txtAux5">
</EditText>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/edtTelefone"
android:gravity="center_vertical">
<Button
android:text="Confirmar"
android:layout_width="0dip"
android:layout_weight="1.0"
android:layout_height="wrap_content"
android:id="@+id/btnConfirmar"
android:layout_below="@+id/edtTelefone"
android:onClick="btnConfirmar_click"
android:layout_alignParentLeft="true">
</Button>
<Button
android:text="Cancelar"
android:layout_height="wrap_content"
android:layout_width="0dip"
android:layout_weight="1.0"
android:id="@+id/btnCancelar"
android:layout_below="@+id/edtTelefone"
android:onClick="btnCancelar_click"
android:layout_alignParentRight="true">
</Button>
</LinearLayout>
</RelativeLayout>
</pre>
<br />
Layout gráfico do contato.xml<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvjcNfU-rZCAep53Tr_-K0RptBIKKCl879TT2i7PuDXw30gvO51Gp5gTmVCOzPdYSSe3Foyz-80EhJub3de2LmGgQw-K46BCNS4KDMSmT0K6MCl8gY0DM0baoglb9u0W54w6K3DOuP6J6h/s1600/layout2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvjcNfU-rZCAep53Tr_-K0RptBIKKCl879TT2i7PuDXw30gvO51Gp5gTmVCOzPdYSSe3Foyz-80EhJub3de2LmGgQw-K46BCNS4KDMSmT0K6MCl8gY0DM0baoglb9u0W54w6K3DOuP6J6h/s1600/layout2.JPG" /></a></div>
<br />
<br />
Arquivo contato_row.xml, layout de item do ListView utilizado no ContatoAdapter:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/LinearLayout02"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/txtNome"
android:text="Nome">
</TextView>
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/txtEndereco"
android:text="Endereço"
android:layout_below="@+id/txtNome">
</TextView>
<TextView
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:id="@+id/txtTelefone"
android:text="Telefone"
android:layout_below="@+id/txtEndereco">
</TextView>
</RelativeLayout>
</LinearLayout>
</pre>
<br />
Layout gráfico do contato_row.xml:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmNdgvjE2gZO3jrStskxaHOJgR9MQLqQc3Ik2HLg5R1OUl7l4j-xc9Xyta6ng3rejfL2GO6hoDNM4PZu_OCII6FFiD8S4nlwO9u26a_-5TcznfzgdpeUAKPdcL2-RIktaJJrksZrgU595v/s1600/layout3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmNdgvjE2gZO3jrStskxaHOJgR9MQLqQc3Ik2HLg5R1OUl7l4j-xc9Xyta6ng3rejfL2GO6hoDNM4PZu_OCII6FFiD8S4nlwO9u26a_-5TcznfzgdpeUAKPdcL2-RIktaJJrksZrgU595v/s1600/layout3.JPG" /></a></div>
<br />
<br />
Arquivo AndroidManifest.xml, arquivo de configuração utilizado pelo Android:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.Agenda.UI"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".main"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ContatoUI" android:label="@string/app_name"/>
</application>
</manifest>
</pre>
<br />
Agora irei apresentar as classes que esse projeto irá utilizar.<br />
<br />
Arquivo main.java, primeiro classe a ser executada no projeto:<br />
<pre class="brush:java">package br.com.Agenda.UI;
import java.util.List;
import br.com.Agenda.DAO.ContatoAdapter;
import br.com.Agenda.DAO.ContatoDAO;
import br.com.Agenda.POJO.ContatoVO;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
public class main extends ListActivity{
private static final int INCLUIR = 0;
private static final int ALTERAR = 1;
private ContatoDAO lContaoDAO; //instância responsável pela persistência dos dados
List<ContatoVO> lstContatos; //lista de contatos cadastrados no BD
ContatoAdapter adapter; //Adapter responsável por apresentar os contatos na tela
boolean blnShort = false;
int Posicao = 0; //determinar a posição do contato dentro da lista lstContatos
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lContaoDAO = new ContatoDAO(this);
lContaoDAO.open();
lstContatos = lContaoDAO.Consultar();
adapter = new ContatoAdapter(this, lstContatos);
setListAdapter(adapter);
registerForContextMenu(getListView());
}
// Este evento será chamado pelo atributo onClick
// que está definido no botão criado no arquivo main.xml
public void onClick(View view) {
switch (view.getId()) {
case R.id.add:
InserirContato();
break;
}
}
//Rotina executada quando finalizar a Activity ContatoUI
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
ContatoVO lAgendaVO = null;
try
{
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK)
{
//obtem dados inseridos/alterados na Activity ContatoUI
lAgendaVO = (ContatoVO)data.getExtras().getSerializable("agenda");
//o valor do requestCode foi definido na função startActivityForResult
if (requestCode == INCLUIR)
{
//verifica se digitou algo no nome do contato
if (!lAgendaVO.getNome().equals(""))
{
//necessário abrir novamente o BD pois ele foi fechado no método onPause()
lContaoDAO.open();
//insere o contato no Banco de Dados SQLite
lContaoDAO.Inserir(lAgendaVO);
//insere o contato na lista de contatos em memória
lstContatos.add(lAgendaVO);
}
}else if (requestCode == ALTERAR){
lContaoDAO.open();
//atualiza o contato no Banco de Dados SQLite
lContaoDAO.Alterar(lAgendaVO);
//atualiza o contato na lista de contatos em memória
lstContatos.set(Posicao, lAgendaVO);
}
//método responsável pela atualiza da lista de dados na tela
adapter.notifyDataSetChanged();
}
}
catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
private void InserirContato(){
try
{
//a variável "tipo" tem a função de definir o comportamento da Activity
//ContatoUI, agora a variável tipo está definida com o valor "0" para
//informar que será uma inclusão de Contato
Intent it = new Intent(this, ContatoUI.class);
it.putExtra("tipo", INCLUIR);
startActivityForResult(it, INCLUIR);//chama a tela e incusão
}
catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
@Override
protected void onResume() {
//quando a Activity main receber o foco novamente abre-se novamente a conexão
lContaoDAO.open();
super.onResume();
}
@Override
protected void onPause() {
//toda vez que o programa peder o foco fecha-se a conexão com o BD
lContaoDAO.close();
super.onPause();
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
try
{
//Criação do popup menu com as opções que termos sobre
//nossos Contatos
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
if (!blnShort)
{
Posicao = info.position;
}
blnShort = false;
menu.setHeaderTitle("Selecione:");
//a origem dos dados do menu está definido no arquivo arrays.xml
String[] menuItems = getResources().getStringArray(R.array.menu);
for (int i = 0; i<menuItems.length; i++) {
menu.add(Menu.NONE, i, i, menuItems[i]);
}
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
//Este método é disparado quando o usuário clicar em um item do ContextMenu
@Override
public boolean onContextItemSelected(MenuItem item) {
ContatoVO lAgendaVO = null;
try
{
int menuItemIndex = item.getItemId();
//Carregar a instância POJO com a posição selecionada na tela
lAgendaVO = (ContatoVO) getListAdapter().getItem(Posicao);
if (menuItemIndex == 0){
//Carregar a Activity ContatoUI com o registro selecionado na tela
Intent it = new Intent(this, ContatoUI.class);
it.putExtra("tipo", ALTERAR);
it.putExtra("agenda", lAgendaVO);
startActivityForResult(it, ALTERAR); //chama a tela de alteração
}else if (menuItemIndex == 1){
//Excluir do Banco de Dados e da tela o registro selecionado
lContaoDAO.Excluir(lAgendaVO);
lstContatos.remove(lAgendaVO);
adapter.notifyDataSetChanged(); //atualiza a tela
}
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
return true;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
//por padrão o ContextMenu, só é executado através de LongClick, mas
//nesse caso toda vez que executar um ShortClick, abriremos o menu
//e também guardaremos qual a posição do itm selecionado
Posicao = position;
blnShort = true;
this.openContextMenu(l);
}
}
</pre>
<br />
Arquivo ContaoUI.java, classe que irá controlar a tela de cadastro de contato:<br />
<pre class="brush:java">package br.com.Agenda.UI;
import br.com.Agenda.POJO.ContatoVO;
import br.com.Agenda.UI.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class ContatoUI extends Activity {
private static final int INCLUIR = 0;
//private static final int ALTERAR = 1;
ContatoVO lContatoVO;
EditText txtNome;
EditText txtEndereco;
EditText txtTelefone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contato);
try
{
final Bundle data = (Bundle) getIntent().getExtras();
int lint = data.getInt("tipo");
if (lint == INCLUIR)
{
//quando for incluir um contato criamos uma nova instância
lContatoVO = new ContatoVO();
}else{
//quando for alterar o contato carregamos a classe que veio por Bundle
lContatoVO = (ContatoVO)data.getSerializable("agenda");
}
//Criação dos objetos da Activity
txtNome = (EditText)findViewById(R.id.edtNome);
txtEndereco = (EditText)findViewById(R.id.edtEndereco);
txtTelefone = (EditText)findViewById(R.id.edtTelefone);
//Carregando os objetos com os dados do Contato
//caso seja uma inclusão ele virá carregado com os atributos text
//definido no arquivo main.xml
txtNome.setText(lContatoVO.getNome());
txtEndereco.setText(lContatoVO.getEndereco());
txtTelefone.setText(lContatoVO.getTelefone());
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void btnConfirmar_click(View view)
{
try
{
//Quando confirmar a inclusão ou alteração deve-se devolver
//o registro com os dados preenchidos na tela e informar
//o RESULT_OK e em seguida finalizar a Activity
Intent data = new Intent();
lContatoVO.setNome(txtNome.getText().toString());
lContatoVO.setEndereco(txtEndereco.getText().toString());
lContatoVO.setTelefone(txtTelefone.getText().toString());
data.putExtra("agenda", lContatoVO);
setResult(Activity.RESULT_OK, data);
finish();
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void btnCancelar_click(View view)
{
try
{
//Quando for simplesmente cancelar a operação de inclusão
//ou alteração deve-se apenas informar o RESULT_CANCELED
//e em seguida finalizar a Activity
setResult(Activity.RESULT_CANCELED);
finish();
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public void toast (String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
}
</pre>
<br />
<br />
Arquivo ContatoVO.java, será a classe responsável pelo transporte dos dados do Contato entre o usuário e o Banco de Dados SQLite:<br />
<pre class="brush:java">package br.com.Agenda.POJO;
import java.io.Serializable;
//Classe responsável pelo transporte dos dados entre a
//interface(tela) e Banco de Dados
public class ContatoVO implements Serializable {
private static final long serialVersionUID = 1L;
private long id;
private String nome;
private String endereco;
private String telefone;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String value) {
this.nome = value;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String value) {
this.endereco = value;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String value) {
this.telefone = value;
}
// Will be used by the ArrayAdapter in the ListView
@Override
public String toString() {
return nome;
}
}
</pre>
<br />
<br />
Arquivo BaseDAO.java, representará o DBHelper, responsável pela criação do próprio Banco de Dados:<br />
<pre class="brush:java">package br.com.Agenda.DAO;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
//Classe responsável pela criação do Banco de Dados e tabelas
public class BaseDAO extends SQLiteOpenHelper {
public static final String TBL_AGENDA = "agenda";
public static final String AGENDA_ID = "_id";
public static final String AGENDA_NOME = "nome";
public static final String AGENDA_ENDERECO = "endereco";
public static final String AGENDA_TELEFONE = "telefone";
private static final String DATABASE_NAME = "agenda.db";
private static final int DATABASE_VERSION = 1;
//Estrutura da tabela Agenda (sql statement)
private static final String CREATE_AGENDA = "create table " +
TBL_AGENDA + "( " + AGENDA_ID + " integer primary key autoincrement, " +
AGENDA_NOME + " text not null, " +
AGENDA_ENDERECO + " text not null, " +
AGENDA_TELEFONE + " text not null);";
public BaseDAO(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database) {
//Criação da tabela
database.execSQL(CREATE_AGENDA);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Caso seja necessário mudar a estrutura da tabela
//deverá primeiro excluir a tabela e depois recriá-la
db.execSQL("DROP TABLE IF EXISTS " + TBL_AGENDA);
onCreate(db);
}
}
</pre>
<br />
<br />
Arquivo ContatoDAO.java, responsável pela persistência dos dados do Contato no Banc de Dados:<br />
<pre class="brush:java">package br.com.Agenda.DAO;
import java.util.ArrayList;
import java.util.List;
import br.com.Agenda.POJO.ContatoVO;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
public class ContatoDAO {
private SQLiteDatabase database;
private BaseDAO dbHelper;
//Campos da tabela Agenda
private String[] colunas = {BaseDAO.AGENDA_ID,
BaseDAO.AGENDA_NOME,
BaseDAO.AGENDA_ENDERECO,
BaseDAO.AGENDA_TELEFONE };
public ContatoDAO(Context context) {
dbHelper = new BaseDAO(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public long Inserir(ContatoVO pValue) {
ContentValues values = new ContentValues();
//Carregar os valores nos campos do Contato que será incluído
values.put(BaseDAO.AGENDA_NOME, pValue.getNome());
values.put(BaseDAO.AGENDA_ENDERECO, pValue.getEndereco());
values.put(BaseDAO.AGENDA_TELEFONE, pValue.getTelefone());
return database.insert(BaseDAO.TBL_AGENDA, null, values);
}
public int Alterar(ContatoVO pValue) {
long id = pValue.getId();
ContentValues values = new ContentValues();
//Carregar os novos valores nos campos que serão alterados
values.put(BaseDAO.AGENDA_NOME, pValue.getNome());
values.put(BaseDAO.AGENDA_ENDERECO, pValue.getEndereco());
values.put(BaseDAO.AGENDA_TELEFONE, pValue.getTelefone());
//Alterar o registro com base no ID
return database.update(BaseDAO.TBL_AGENDA, values, BaseDAO.AGENDA_ID + " = " + id, null);
}
public void Excluir(ContatoVO pValue) {
long id = pValue.getId();
//Exclui o registro com base no ID
database.delete(BaseDAO.TBL_AGENDA, BaseDAO.AGENDA_ID + " = " + id, null);
}
public List<ContatoVO> Consultar() {
List<ContatoVO> lstAgenda = new ArrayList<ContatoVO>();
//Consulta para trazer todos os dados da tabela Agenda ordenados pela coluna Nome
Cursor cursor = database.query(BaseDAO.TBL_AGENDA, colunas,
null, null, null, null, BaseDAO.AGENDA_NOME);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
ContatoVO lContatoVO = cursorToContato(cursor);
lstAgenda.add(lContatoVO);
cursor.moveToNext();
}
//Tenha certeza que você fechou o cursor
cursor.close();
return lstAgenda;
}
//Converter o Cursor de dados no objeto POJO ContatoVO
private ContatoVO cursorToContato(Cursor cursor) {
ContatoVO lContatoVO = new ContatoVO();
lContatoVO.setId(cursor.getLong(0));
lContatoVO.setNome(cursor.getString(1));
lContatoVO.setEndereco(cursor.getString(2));
lContatoVO.setTelefone(cursor.getString(3));
return lContatoVO;
}
}
</pre>
<br />
<br />
Arquivo ContatoAdapter.java, classe responsável por apresentar na tela em forma de ListView os contatos que estão memória que foram extraídos do Banco de Dados SQLite:<br />
<pre class="brush:java">package br.com.Agenda.DAO;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;
import br.com.Agenda.POJO.ContatoVO;
import br.com.Agenda.UI.R.id;
import br.com.Agenda.UI.R.layout;
public class ContatoAdapter extends BaseAdapter {
private Context context;
private List<ContatoVO> lstContato;
private LayoutInflater inflater;
public ContatoAdapter(Context context, List<ContatoVO> listAgenda) {
this.context = context;
this.lstContato = listAgenda;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
//Atualizar ListView de acordo com o lstContato
@Override
public void notifyDataSetChanged() {
try{
super.notifyDataSetChanged();
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
}
public int getCount() {
return lstContato.size();
}
//Remover item da lista
public void remove(final ContatoVO item) {
this.lstContato.remove(item);
}
//Adicionar item na lista
public void add(final ContatoVO item) {
this.lstContato.add(item);
}
public Object getItem(int position) {
return lstContato.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup viewGroup) {
try
{
ContatoVO contato = lstContato.get(position);
//O ViewHolder irá guardar a instâncias dos objetos do estado_row
ViewHolder holder;
//Quando o objeto convertView não for nulo nós não precisaremos inflar
//os objetos do XML, ele será nulo quando for a primeira vez que for carregado
if (convertView == null) {
convertView = inflater.inflate(layout.contato_row, null);
//Cria o Viewholder e guarda a instância dos objetos
holder = new ViewHolder();
holder.tvNome = (TextView) convertView.findViewById(id.txtNome);
holder.tvEndereco = (TextView) convertView.findViewById(id.txtEndereco);
holder.tvTelefone = (TextView) convertView.findViewById(id.txtTelefone);
convertView.setTag(holder);
} else {
//pega o ViewHolder para ter um acesso rápido aos objetos do XML
//ele sempre passará por aqui quando,por exemplo, for efetuado uma rolagem na tela
holder = (ViewHolder) convertView.getTag();
}
holder.tvNome.setText(contato.getNome());
holder.tvEndereco.setText(contato.getEndereco());
holder.tvTelefone.setText(contato.getTelefone());
return convertView;
}catch (Exception e) {
trace("Erro : " + e.getMessage());
}
return convertView;
}
public void toast (String msg)
{
Toast.makeText (context, msg, Toast.LENGTH_SHORT).show ();
}
private void trace (String msg)
{
toast (msg);
}
//Criada esta classe estática para guardar a referência dos objetos abaixo
static class ViewHolder {
public TextView tvNome;
public TextView tvEndereco;
public TextView tvTelefone;
}
}
</pre>
<br />
Agora vamos ao resultado final desse projeto, abaixo serão apresentadas alguma figuras do comportamento do sistema.<br />
<br />
1. Quando o sistema for executado pela primeira vez, ele deverá apresentar uma tela preta e apenas o botão para adicionar Contato.<br />
2. Clicando no botão Adicionar o sistema deverá abrir a tela para inclusão de Contato, o usuário deverá informar os dados para cadastro e clicar em Confirmar.<br />
3. Confirmando a inclusão do Contato, ao voltar para a primeira tela o sistema deverá apresentar automaticamente o contato cadastrado.<br />
4. Clicando na primeira tela sobre um Contato cadastrado o sistema deverá apresentar uma caixa com as opções de Editar e Excluir o Contato ficando a cargo do usuário escolher a opção desejado.<br />
<br />
Abaixo seguem as telas:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6AICrX9Mv2jqm6Bp1XloX_ptgaEpcz_todpOuK7wRb5CB2Z_s419eg0IInFO9lJAwj18jAsy447GbKYpfOSUkA4MiZQyvGeKCp3xBvv3WlpWgCbQwYVWvw1MiVZH6LYZcBlSXGqeQb1PI/s1600/Agenda.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6AICrX9Mv2jqm6Bp1XloX_ptgaEpcz_todpOuK7wRb5CB2Z_s419eg0IInFO9lJAwj18jAsy447GbKYpfOSUkA4MiZQyvGeKCp3xBvv3WlpWgCbQwYVWvw1MiVZH6LYZcBlSXGqeQb1PI/s320/Agenda.JPG" width="217" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLaCUl4rH8_v9qPfpf-bl0oJUkdumEikGWB_unCb71UeViFlo_1BV04fP3YNeszPYL-yaRqFFbT0PiJx6jlP2IjmcLpCmJxrTmYNu_Aw9aFhutI9IUmbLDgF3cEBWpSnzDR0MrWVh5u-iE/s1600/Contato.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLaCUl4rH8_v9qPfpf-bl0oJUkdumEikGWB_unCb71UeViFlo_1BV04fP3YNeszPYL-yaRqFFbT0PiJx6jlP2IjmcLpCmJxrTmYNu_Aw9aFhutI9IUmbLDgF3cEBWpSnzDR0MrWVh5u-iE/s320/Contato.JPG" width="218" /></a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKMg5vOpJGlTqjdC6syh_bTzieR3Awx2siKVOkAK8qJLD1EAjnJUY0OFezkcvExKUIcXKeyzXJIPaWkRXQ4DFfFuBnlSIo_p2iV4_LzAw1wld-oSMWDmeHDNN4Q3MupSK8REMF3Exb6xbO/s1600/ListaContato.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKMg5vOpJGlTqjdC6syh_bTzieR3Awx2siKVOkAK8qJLD1EAjnJUY0OFezkcvExKUIcXKeyzXJIPaWkRXQ4DFfFuBnlSIo_p2iV4_LzAw1wld-oSMWDmeHDNN4Q3MupSK8REMF3Exb6xbO/s320/ListaContato.JPG" width="218" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQy02HbNaiJTyJccnC0P7-LIHd8Xvlqm69MuL7d7yXnYyPJKN1hifbz7p1MjDYB_RmRIqGVOe1a_uJw1Syr7q7iYs0VK39BaSAHcDhidAKI_bShljPvqbqbpbeFoL0we2Ne8FwWioQG7N7/s1600/ListaContato2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQy02HbNaiJTyJccnC0P7-LIHd8Xvlqm69MuL7d7yXnYyPJKN1hifbz7p1MjDYB_RmRIqGVOe1a_uJw1Syr7q7iYs0VK39BaSAHcDhidAKI_bShljPvqbqbpbeFoL0we2Ne8FwWioQG7N7/s320/ListaContato2.JPG" width="218" /></a><br />
<br />
<br />
Vou terminando por aqui, caso tenham dúvidas, postem comentários, espero que tenham gostado do projeto apresentado ele é bem simples mas será a base para você criar projetos mais sofisticados.<br />
<br />
<br />
Outras opções sobre ListView:<br />
<br />
<div>
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html">http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html</a></div>
<div>
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html</a><br />
Parte 3 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html</a><br />
Parte 4 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html</a><br />
Parte 5 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html</a><br />
Parte 6 : <a href="http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html">http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html</a> </div>
Parte 7 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html</a><br />
Parte 8 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html</a><br />
<br />
Carregando ListView com SqLite : <a href="http://escoladeandroid.blogspot.com.br/2012/04/android-carregando-listview-com-sqlite.html">http://escoladeandroid.blogspot.com.br/2012/04/android-carregando-listview-com-sqlite.html</a><br />
<br />
<br />
<div>
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com30tag:blogger.com,1999:blog-1139756238495061386.post-23860802853802115962011-12-10T09:46:00.003-08:002012-04-26T17:37:48.598-07:00Android - ListView Parte 6Olá,<br />
<br />
Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 6.<br />
<br />
Hoje daremos sequência na parte 5, iremos ver como mudar a cor do listview, utilizar o AlertDialog e implementar mais performance no nosso custom Adapter.<br />
<br />
O fonte será parecido com o último post.<br />
<br />
Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:<br />
<br />
Arquivo estados.java:<br />
<pre class="brush:java">package br.com.empresa;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class list12 extends Activity {
//Criamos uma lista de Estados baseados na classe Estado
private List<estado> lstEstados;
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list12);
list = (ListView) findViewById(R.id.ListView12);
//Iniciamos a lista de Estados
//no método add já inserimos um novo registro de cada Estados desejado
lstEstados = new ArrayList<estado>();
lstEstados.add(new Estado("Sao Paulo", "Sao Paulo", R.drawable.saopaulo));
lstEstados.add(new Estado("Rio de Janeiro", "Rio de Janeiro", R.drawable.riodejaneiro));
lstEstados.add(new Estado("Minas Gerais", "Belo Horizonte", R.drawable.minasgerais));
lstEstados.add(new Estado("Rio Grande do Sul", "Porto Alegre", R.drawable.riograndedosul));
lstEstados.add(new Estado("Santa Catarina", "Florianópolis", R.drawable.santacatarina));
lstEstados.add(new Estado("Paraná", "Curitiba", R.drawable.parana));
lstEstados.add(new Estado("Mato Grosso", "Cuiabá", R.drawable.matogrosso));
lstEstados.add(new Estado("Amazonas", "Manaus", R.drawable.amazonas));
//Criação do Adapter e passamos a nossa lista de Estados para ele
EstadoAdapter adapter = new EstadoAdapter(this, lstEstados);
//referenciamos a função que será invocada quando o usuário
//clicar em algum item da lista
list.setOnItemClickListener(onItemClick_List);
list.setAdapter(adapter);
//caso seja preciso adicionar mais algum item na lista você
//pode utilizar também a forma abaixo
adapter.addItem(new Estado("Bahia", "Salvador", R.drawable.bahia));
}
OnItemClickListener onItemClick_List = new OnItemClickListener() {
public void onItemClick(AdapterView arg0, View view, int position, long index) {
//Pegar o item clicado
showToast("Você clicou no estado : " + lstEstados.get(position).getEstado());
}
};
//Quando tecla no botão voltar o sistema irá apresentar
//uma caixa de diálogo quetionando se realmente desej sair
@Override
public void onBackPressed() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Deseja sair?")
.setCancelable(false)
.setIcon(android.R.drawable.ic_dialog_alert) // ícone de alerta
.setTitle("Atenção:") //título do caixa de diálogo
//Evento disparado se clicar no botão Sim
.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
list12.this.finish(); //Fecha o Activity
}
})
//Event disparado se clicar no botão Não
.setNegativeButton("Não", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel(); //Cancela a caixa de diálogo e volta a tela anterior
}
});
AlertDialog alert = builder.create();
alert.show(); //Chama a caixa de diálogo
}
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
</pre>
<br />
<br />
Arquivo EstadoAdapter.java:<br />
<pre class="brush:java">package br.com.empresa;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class EstadoAdapter extends BaseAdapter{
private List<estado> listEstados;
Context context;
//Classe utilizada para instanciar os objetos do XML
private LayoutInflater inflater;
public EstadoAdapter(Context context, List<estado> plistEstados) {
this.listEstados = plistEstados;
this.context = context;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final Estado item) {
this.listEstados.add(item);
//Atualizar a lista caso seja adicionado algum item
notifyDataSetChanged();
}
@Override
public int getCount() {
return listEstados.size();
}
@Override
public Object getItem(int position) {
return listEstados.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
Estado estadoVO = listEstados.get(position);
//O ViewHolder irá guardar a instâncias dos objetos do estado_row
ViewHolder holder;
//Quando o objeto convertView não for nulo nós não precisaremos inflar
//os objetos do XML, ele será nulo quando for a primeira vez que for carregado
if (convertView == null) {
convertView = inflater.inflate(R.layout.estado_row, null);
//Cria o Viewholder e guarda a instância dos objetos
holder = new ViewHolder();
holder.bandeira = (ImageView) convertView.findViewById(R.id.bandeira);
holder.tvEstado = (TextView) convertView.findViewById(R.id.tvEstado);
holder.tvCapital = (TextView) convertView.findViewById(R.id.tvCapital);
convertView.setTag(holder);
} else {
//pega o ViewHolder para ter um acesso rápido aos objetos do XML
//ele sempre passará por aqui quando,por exemplo, for efetuado uma rolagem na tela
holder = (ViewHolder) convertView.getTag();
}
holder.bandeira.setImageResource(estadoVO.getBandeira());
holder.tvEstado.setText(estadoVO.getEstado());
holder.tvCapital.setText(estadoVO.getCapital());
return convertView;
}
//Criada esta classe estática para guardar a referência dos objetos abaixo
static class ViewHolder {
public ImageView bandeira;
public TextView tvEstado;
public TextView tvCapital;
}
}
</pre>
<br />
Abaixo segue o código fonte do arquivo estados.xml:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="@+id/ListView12"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</ListView>
</LinearLayout>
</pre>
<br />
<br />
Abaixo segue o código fonte do arquivo estado_row.xml:<br />
Atenção: neste arquivo abaixo você fará referência a o outros dois arquivos (list_gb.xml e text_bg.xml) através das propriedades android:background="@color/list_bg" e style="@style/FontBold"<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:background="@color/list_bg"
android:id="@+id/LinearLayout01"
android:layout_height="wrap_content"
android:layout_margintop="10dp"
android:layout_width="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:id="@+id/LinearLayout02"
android:layout_height="wrap_content"
android:layout_marginbottom="3dp"
android:layout_margintop="3dp"
android:layout_width="fill_parent">
<ImageView
android:focusable="false"
android:id="@+id/bandeira"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/icon"/>
<TextView
style="@style/FontBold"
android:id="@+id/lblEstado"
android:layout_torightof="@+id/bandeira"
android:text="Estado : "/>
<TextView
style="@style/FontBold"
android:id="@+id/tvEstado"
android:layout_torightof="@+id/lblEstado"
android:text="nome do estado"/>
<TextView
style="@style/FontPadrao"
android:id="@+id/lblCapital"
android:layout_below="@+id/lblEstado"
android:layout_torightof="@+id/bandeira"
android:text="Capital : "/>
<TextView
style="@style/FontPadrao"
android:id="@+id/tvCapital"
android:layout_below="@+id/lblEstado"
android:layout_torightof="@+id/lblCapital"
android:text="nome da capital"/>
</ImageView>
</RelativeLayout>
</LinearLayout>
</pre>
<br />
Abaixo segue o código fonte do arquivo list_bg.xml (este arquivo deverá ficar na pasta res\color):<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/white"
android:state_pressed="false"
android:state_selected="false"/>
<item
android:drawable="@color/black"
android:state_pressed="true"/>
<item
android:drawable="@color/black"
android:state_pressed="false"
android:state_selected="true"/>
</selector>
</pre>
<br />
<br />
Abaixo segue o código fonte do arquivo text_bg.xml (este arquivo deverá ficar na pasta res\color):<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:color="@color/black"
android:state_pressed="false"
android:state_selected="false"/>
<item
android:color="@color/white"
android:state_pressed="true"/>
<item
android:color="@color/white"
android:state_pressed="false"
android:state_selected="true"/>
</selector>
</pre>
<br />
Abaixo segue o código fonte do arquivo styles.xml (este arquivo deverá ficar na pasta res\values):<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="FontBold" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">wrap_content
<item name="android:layout_height">wrap_content
<item name="android:textStyle">bold
<item name="android:focusable">false
<item name="android:typeface">sans
<item name="android:textSize">16sp
<item name="android:textColor">@color/text_bg
</style>
<style name="FontPadrao" parent="@android:style/TextAppearance.Medium">
<item name="android:layout_width">wrap_content
<item name="android:layout_height">wrap_content
<item name="android:focusable">false
<item name="android:typeface">sans
<item name="android:textSize">13sp
<item name="android:textColor">@color/text_bg
</style>
</resources>
</pre>
<br />
Abaixo segue o código fonte do arquivo colors.xml (deverá ficar na pasta res\values):<br />
<pre class="brush: xml"><?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#fff</color>
<color name="black">#000</color>
<color name="red">#c6360a</color>
<color name="green">#688f2b</color>
<color name="orange">#f48905</color>
<color name="dark_blue">#003366</color>
<color name="grey">#888888</color>
</resources>
</pre>
<br />
Os arquivos acima serão os responsáveis por mudar a cor listview e dos textview que ele possui, ele deverão ficar na pasta res\color, conforme figura abaixo:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuXJsP0B0OS51avImSMnLZdD9cwAfyQslGbjMO1Zy26I2vFXKreK2YN207FF5edfL7-xvcmbXXij6b61vbuAT3jaue2UloEg7qw6anZOgCFYafTE5u7sP64zmgdJOU8SqOzYwazDD-Zmbg/s1600/fig1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuXJsP0B0OS51avImSMnLZdD9cwAfyQslGbjMO1Zy26I2vFXKreK2YN207FF5edfL7-xvcmbXXij6b61vbuAT3jaue2UloEg7qw6anZOgCFYafTE5u7sP64zmgdJOU8SqOzYwazDD-Zmbg/s1600/fig1.jpg" /></a></div>
<br />
<br />
Abaixo segue o resultado de nosso programa:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAWzSIxe8Tlryt06zm28cATmxuC3PWjD58GXqLthgdFop-kiyFeqlXkhl314XWqdLfdmuJozzQUvKgYhbEKxahqmwm3vylX-u1rL6Yj4VAY9VC-rZ5RLvpoeoSukvzzxy08yJLiVlsJTpQ/s1600/fig2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAWzSIxe8Tlryt06zm28cATmxuC3PWjD58GXqLthgdFop-kiyFeqlXkhl314XWqdLfdmuJozzQUvKgYhbEKxahqmwm3vylX-u1rL6Yj4VAY9VC-rZ5RLvpoeoSukvzzxy08yJLiVlsJTpQ/s320/fig2.jpg" title="ListView" width="218" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF_MboN5WvmDbnsP104UbM07giqORR5gS3DorpfGzdWxWrndtsZ1pfBSkXYSn391hOdL1eCWoYVYsowqMDgfz-oPRs1YDgoe6IpAE9ihz0tzvleySkP1b9zLrLN5RpwRDaVonHvoK9qxgu/s1600/fig3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF_MboN5WvmDbnsP104UbM07giqORR5gS3DorpfGzdWxWrndtsZ1pfBSkXYSn391hOdL1eCWoYVYsowqMDgfz-oPRs1YDgoe6IpAE9ihz0tzvleySkP1b9zLrLN5RpwRDaVonHvoK9qxgu/s320/fig3.jpg" title="ListView" width="217" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<br />
<br />
<b>Abaixo segue algumas dicas para melhor entendimento do fonte:</b><br />
<br />
<ol>
<li>Arquivo style.xml - atributos dos textview que utilizamos em nosso fonte</li>
<li>Arquivo list_bg.xml - definição de cores do nosso listview</li>
<li>Arquivo text_bg.xml - definição das cores dos textview utilizados no arquivo estado_row.xml</li>
<li>Utilização da classe ViewHolder no arquivo EstadoAdapter.java para aumentar a performance ao carregar os itens da lista.</li>
<li>Utilização da classe AlertDialog para exibir ao usuário a opção de escolher entre duas ações.</li>
</ol>
<br />
<br />
Por enquanto é isso espero que tenham gostado e em breve estarei postando mais discas e tutoriais sobre listview e layout.<br />
<br />
<br />
<div>
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html">http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html</a></div>
<div>
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html</a><br />
Parte 3 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html</a><br />
Parte 4 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html</a><br />
Parte 5 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html</a><br />
Parte 7: <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html</a><br />
Parte 8 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html</a> </div>
<div>
<br />
Trabalhando com Banco de Dados SQLite:<br />
<a href="http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html">http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html</a> <br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br /></div>
<br />
<br />
Desenv com qualidade!Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com10tag:blogger.com,1999:blog-1139756238495061386.post-5767212773130127282011-12-08T11:02:00.003-08:002012-04-26T17:39:41.441-07:00Android - ListView Parte 5Olá,<br />
<br />
Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 5.<br />
<br />
Hoje iremos ver como criar um listview com ícone e mais de uma linha de texto para cada registro do ListView.<br />
<br />
Nesse caso precisaremos criar um BaseAdapter customizado que irá receber uma lista de Estados e criar dois arquivos de layout XML, um sendo o principal que conterá as linha da lista e o outro sendo as próprias linhas da lista.<br />
<br />
Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:<br />
<br />
Arquivo estados.java:<br />
<pre class="brush:java">package br.com.empresa;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class estados extends Activity {
//Criamos uma lista de Estados baseados na classe Estado
private List<estado> lstEstados = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.estados);
ListView list = (ListView) findViewById(R.id.ListView12);
//Iniciamos a lista de Estados
//no método add já inserimos um novo registro de cada Estados desejado
lstEstados = new ArrayList<estado>();
lstEstados.add(new Estado("Sao Paulo", "Sao Paulo", R.drawable.saopaulo));
lstEstados.add(new Estado("Rio de Janeiro", "Rio de Janeiro", R.drawable.riodejaneiro));
lstEstados.add(new Estado("Minas Gerais", "Belo Horizonte", R.drawable.minasgerais));
lstEstados.add(new Estado("Rio Grande do Sul", "Porto Alegre", R.drawable.riograndedosul));
lstEstados.add(new Estado("Santa Catarina", "Florianópolis", R.drawable.santacatarina));
lstEstados.add(new Estado("Paraná", "Curitiba", R.drawable.parana));
lstEstados.add(new Estado("Mato Grosso", "Cuiabá", R.drawable.matogrosso));
lstEstados.add(new Estado("Amazonas", "Manaus", R.drawable.amazonas));
//Criação do Adapter e passamos a nossa lista de Estados para ele
EstadoAdapter adapter = new EstadoAdapter(this, lstEstados);
//referenciamos a função que será invocada quando o usuário
//clicar em algum item da lista
list.setOnItemClickListener(onItemClick_List);
list.setAdapter(adapter);
//caso seja preciso adicionar mais algum item na lista você
//pode utilizar também a forma abaixo
adapter.addItem(new Estado("Bahia", "Salvador", R.drawable.bahia));
}
OnItemClickListener onItemClick_List = new OnItemClickListener() {
public void onItemClick(AdapterView arg0, View view, int position, long index) {
//Pegar o item clicado
showToast("Você clicou no estado : " + lstEstados.get(position).getEstado());
}
};
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
</pre>
<br />
Arquivo Estado.java (classe POJO):<br />
<pre class="brush:java">package br.com.empresa;
public class Estado {
private String estado;
private String capital;
private int bandeira;
public Estado(String estado, String capital, int bandeira) {
super();
this.estado = estado;
this.capital = capital;
this.bandeira = bandeira;
}
public String getEstado() {
return estado;
}
public void setEstado(String estado) {
this.estado = estado;
}
public String getCapital() {
return capital;
}
public void setCapital(String capital) {
this.capital = capital;
}
public int getBandeira() {
return bandeira;
}
public void setBandeira(int bandeira) {
this.bandeira = bandeira;
}
}
</pre>
<br />
Arquivo EstadoAdapter.java:<br />
<pre class="brush:java">package br.com.empresa;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class EstadoAdapter extends BaseAdapter{
private List<estado> listEstados;
//Classe utilizada para instanciar os objetos do XML
private LayoutInflater inflater;
public EstadoAdapter(Context context, List<estado> plistEstados) {
this.listEstados = plistEstados;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItem(final Estado item) {
this.listEstados.add(item);
//Atualizar a lista caso seja adicionado algum item
notifyDataSetChanged();
}
@Override
public int getCount() {
return listEstados.size();
}
@Override
public Object getItem(int position) {
return listEstados.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
//Pega o registro da lista e trasnfere para o objeto estadoVO
Estado estadoVO = listEstados.get(position);
//Utiliza o XML estado_row para apresentar na tela
convertView = inflater.inflate(R.layout.estado_row, null);
//Instância os objetos do XML
ImageView bandeira = (ImageView)convertView.findViewById(R.id.bandeira);
TextView tvEstado = (TextView)convertView.findViewById(R.id.tvEstado);
TextView tvCapital = (TextView)convertView.findViewById(R.id.tvCapital);
//pega os dados que estão no objeto estadoVO e transfere para os objetos do XML
bandeira.setImageResource(estadoVO.getBandeira());
tvEstado.setText(estadoVO.getEstado());
tvCapital.setText(estadoVO.getCapital());
return convertView;
}
}
</pre>
<br />
Abaixo segue o código fonte do arquivo estados.xml:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:id="@+id/ListView12"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</ListView>
</LinearLayout>
</pre>
<br />
<br />
Abaixo segue o código fonte do arquivo estado_row.xml:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_height="wrap_content"
android:layout_margintop="10dp"
android:layout_width="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:id="@+id/LinearLayout02"
android:layout_height="wrap_content"
android:layout_marginbottom="3dp"
android:layout_margintop="3dp"
android:layout_width="fill_parent">
<ImageView
android:focusable="false"
android:id="@+id/bandeira"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src="@drawable/icon">
</ImageView>
<TextView
android:id="@+id/lblEstado"
android:layout_height="wrap_content"
android:layout_torightof="@+id/bandeira"
android:layout_width="wrap_content"
android:text="Estado : "
android:textsize="16sp"
android:textstyle="bold">
</TextView>
<TextView
android:focusable="false"
android:id="@+id/tvEstado"
android:layout_height="wrap_content"
android:layout_torightof="@+id/lblEstado"
android:layout_width="wrap_content"
android:text="nome do estado"
android:textsize="16sp"
android:textstyle="bold">
</TextView>
<TextView
android:focusable="false"
android:id="@+id/lblCapital"
android:layout_below="@+id/lblEstado"
android:layout_height="wrap_content"
android:layout_torightof="@+id/bandeira"
android:layout_width="wrap_content"
android:text="Capital : "
android:textsize="13sp"
android:textstyle="bold">
</TextView>
<TextView
android:focusable="false"
android:id="@+id/tvCapital"
android:layout_below="@+id/lblEstado"
android:layout_height="wrap_content"
android:layout_torightof="@+id/lblCapital"
android:layout_width="wrap_content"
android:text="nome da capital"
android:textsize="13sp">
</TextView>
</RelativeLayout>
</LinearLayout>
</pre>
<br />
Abaixo seguem as figuras que foram utilizadas no sistema na pasta res\drawable-ldpi:<br />
<table align="center" border="0" cellpadding="1" cellspacing="1" style="width: 500px;"><tbody>
<tr><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyx9HNdNKLa1VdyMT99OFk_A-oKSMJkOKR2I-CXTA9_GrzFkDTfehhEIeGRaqcB5prO1kuHwNFv809I7_OjvvWOrJ_2_ASG8Oz5m44-f4Q6nwlZEhoqgJimPw5Uk7ij06YYhzHP-FSC5sj/s1600/saopaulo.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyx9HNdNKLa1VdyMT99OFk_A-oKSMJkOKR2I-CXTA9_GrzFkDTfehhEIeGRaqcB5prO1kuHwNFv809I7_OjvvWOrJ_2_ASG8Oz5m44-f4Q6nwlZEhoqgJimPw5Uk7ij06YYhzHP-FSC5sj/s1600/saopaulo.png" /></a></div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xGVKIBB_HA8-CMTVhABD50Q9aj1w8DGs8VNKxFIqIKjHqBW4Eia_UTamMMAgNcH0d1y2RP3UEoNbS2LU3op_RM98Vtw1llwDMVPLekFcVytWYjtUUHQbvJHyeDQMjR3-7ghwcAn1WxaV/s1600/riodejaneiro.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3xGVKIBB_HA8-CMTVhABD50Q9aj1w8DGs8VNKxFIqIKjHqBW4Eia_UTamMMAgNcH0d1y2RP3UEoNbS2LU3op_RM98Vtw1llwDMVPLekFcVytWYjtUUHQbvJHyeDQMjR3-7ghwcAn1WxaV/s1600/riodejaneiro.png" /></a></div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUvS_HKXNdXCYCnCA0XgejJUULn8MxvR_DwLzDppK2kDECyOPskolG0aWnp9TId7YgmSwxO8rY-Gy3WcTfZYKlhM2Yiqpf4h97CgLSjDZTjGa3QTwdlZcRnxawwdIn54nfI8E7P79CTceY/s1600/minasgerais.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUvS_HKXNdXCYCnCA0XgejJUULn8MxvR_DwLzDppK2kDECyOPskolG0aWnp9TId7YgmSwxO8rY-Gy3WcTfZYKlhM2Yiqpf4h97CgLSjDZTjGa3QTwdlZcRnxawwdIn54nfI8E7P79CTceY/s1600/minasgerais.png" /></a></div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSROfX90tmEbpuPc03Xx5o1Tg3zwfhqOJ9F4qDIUPhvIcr3gfapbqTzD-3XSJbzVNGydpc_f0f68ii7vUz2SOf4qV_Dm5F8zGh7Le2P3rKYjYGPZh_ENL5DU-gw5uVTWXhIPAfdV2_9YP1/s1600/riograndedosul.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSROfX90tmEbpuPc03Xx5o1Tg3zwfhqOJ9F4qDIUPhvIcr3gfapbqTzD-3XSJbzVNGydpc_f0f68ii7vUz2SOf4qV_Dm5F8zGh7Le2P3rKYjYGPZh_ENL5DU-gw5uVTWXhIPAfdV2_9YP1/s1600/riograndedosul.png" /></a></div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhf0gxFlmnz_7xOyL-ymYlRfp8HrkKZL4CHm34GFgK4Dn-vCX-qWILJQ0SXuA1eVi0VhFEkwxGJBWiK8ZWV5UhQ_N8tP7MmJrL2Zb0hGHtEXBRN0Q7lQ9yuhP9O5y1tI9-k9wR4TTN2Gk2/s1600/santacatarina.png" imageanchor="1" style="margin-left: 0em; margin-right: 0em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhf0gxFlmnz_7xOyL-ymYlRfp8HrkKZL4CHm34GFgK4Dn-vCX-qWILJQ0SXuA1eVi0VhFEkwxGJBWiK8ZWV5UhQ_N8tP7MmJrL2Zb0hGHtEXBRN0Q7lQ9yuhP9O5y1tI9-k9wR4TTN2Gk2/s1600/santacatarina.png" /></a></div>
</td></tr>
</tbody></table>
<br />
<table align="center" border="0" cellpadding="1" cellspacing="1" style="width: 500px;"><tbody>
<tr><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Dkbxq3MOisSQU1kLuJCM532cvrDElGF13xp4zTDEGAbEponetZTGoplEGeMgBU3hvplOYZvq3-6JfKz-BSGcX3EIuQrxM7gESfwIsrcUQKCEfF9u7MmrGf5Aom72TJWWTw5IRbcHMllU/s1600/bandeirapr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Dkbxq3MOisSQU1kLuJCM532cvrDElGF13xp4zTDEGAbEponetZTGoplEGeMgBU3hvplOYZvq3-6JfKz-BSGcX3EIuQrxM7gESfwIsrcUQKCEfF9u7MmrGf5Aom72TJWWTw5IRbcHMllU/s1600/bandeirapr.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLMmT9V7anyRzoa_7fOLMUo5yJYcsCCgwkkyC458WIeZYEcTWr2pKq6lgluluP5vc-LZHfJg3S_Raeh0hMQlyepIyfAJ3bC8aQFDVlwssBkzitkxec36dAIkno1XwwOk8D7f2UGVthE8M/s1600/matogrosso.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrLMmT9V7anyRzoa_7fOLMUo5yJYcsCCgwkkyC458WIeZYEcTWr2pKq6lgluluP5vc-LZHfJg3S_Raeh0hMQlyepIyfAJ3bC8aQFDVlwssBkzitkxec36dAIkno1XwwOk8D7f2UGVthE8M/s1600/matogrosso.png" /></a></div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Hg32aPDoCvmz4_Z4ze2ru1xlOWeDYbQrIaChKA_WyEGHhKC_uaYQmKzgxm55HyloBoLuEJy8FrdkZwkGBDs5XW-5LbPLgqzKTBJ9mdOFSG3Q6IspwSanBBEm0FynkhhaoQDz37ZvkXCO/s1600/amazonas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Hg32aPDoCvmz4_Z4ze2ru1xlOWeDYbQrIaChKA_WyEGHhKC_uaYQmKzgxm55HyloBoLuEJy8FrdkZwkGBDs5XW-5LbPLgqzKTBJ9mdOFSG3Q6IspwSanBBEm0FynkhhaoQDz37ZvkXCO/s1600/amazonas.png" /></a></div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNRM7AskLE2uZcyCup8AApaNegOOngvvXB2e0Fwrwfxh4NlMvAEkDo9nJ5RF90a28xOU8Clwjvz2tf-tM3A9cTRku7JrbrI2sm3uGy4HKwX3OsDKDEs7AZH9Zod9kSr6awdp6wCDpcR90x/s1600/bahia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNRM7AskLE2uZcyCup8AApaNegOOngvvXB2e0Fwrwfxh4NlMvAEkDo9nJ5RF90a28xOU8Clwjvz2tf-tM3A9cTRku7JrbrI2sm3uGy4HKwX3OsDKDEs7AZH9Zod9kSr6awdp6wCDpcR90x/s1600/bahia.png" /></a></div>
</td></tr>
</tbody></table>
<br />
<div>
Abaixo segue o resultado do nosso sistema:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKz7EW6suFgQe6zbhqEEBuDUX-mt3NfLDUOyjUChKS0LdhNVzLHALNBXGcGULNF_vaI6TBvtgW-EBBoj6ml30XnNi9ssyWMsGh9P1NhvSZNSfkyxZlmueKsMNARxbuknGr19IJhOfY1XUf/s1600/fig1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKz7EW6suFgQe6zbhqEEBuDUX-mt3NfLDUOyjUChKS0LdhNVzLHALNBXGcGULNF_vaI6TBvtgW-EBBoj6ml30XnNi9ssyWMsGh9P1NhvSZNSfkyxZlmueKsMNARxbuknGr19IJhOfY1XUf/s400/fig1.jpg" title="ListView" width="271" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
<br /></div>
<div>
<div>
Em breve estarei postando mais opções relacionadas a layout e listview.</div>
<div>
<br /></div>
<div>
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html">http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html</a></div>
<div>
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html</a><br />
Parte 3 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html</a><br />
Parte 4 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html</a><br />
Parte 6 : <a href="http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html">http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html</a><br />
Parte 7 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html</a><br />
Parte 8 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html</a> </div>
<div>
<br />
<br />
Trabalhando com Banco de Dados SQLite:<br />
<a href="http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html">http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html</a><br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<br />
<br />
<div id="crosscol-wrapper" style="text-align: center;">
<b:section class="crosscol" id="crosscol" showaddelement="no"><br />
<b:widget id="AdSense5" locked="false" title="" type="AdSense"><br />
</b:widget></b:section></div>
<br />
Desenv com qualidade!</div>
</div>Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com7tag:blogger.com,1999:blog-1139756238495061386.post-16187757769685260152011-12-06T16:08:00.004-08:002012-04-26T17:41:37.822-07:00Android - ListView Parte 4Olá,<br />
<br />
Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 4.<br />
<br />
O exemplo de hoje será mostrado como podemos efetuar uma busca em um listview (search listview), esse recurso é bem interessante quando você já possui uma coleção de dados carregados em seu list e quer efetuar uma busca em cima desta lista.<br />
<br />
Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:<br />
<br />
Arquivo consulta.java<br />
<pre class="brush:java">package br.com.empresa;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class consulta extends Activity
{
private ListView lv;
private EditText et;
private String[] lstEstados;
private ArrayList<String> lstEstados_Encontrados = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.consulta);
lv = (ListView) findViewById(R.id.lvEstados);
et = (EditText) findViewById(R.id.etProcurar);
lstEstados = new String[] {"São Paulo", "Rio de Janeiro", "Minas Gerais", "Rio Grande do Sul",
"Santa Catarina", "Paraná", "Mato Grosso", "Amazonas"};
//Carrega o listview com todos os itens
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, lstEstados));
CarregarEncontrados();
//Adiciona um TextWatcher ao TextView cujos métodos são chamados sempre
//que este TextView sofra alterações.
et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s)
{
// Abstract Method of TextWatcher Interface.
}
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
// Abstract Method of TextWatcher Interface.
}
//Evento acionado quando o usuário teclar algo
//na caixa de texto "Procurar"
public void onTextChanged(CharSequence s, int start, int before, int count)
{
CarregarEncontrados();
//Carrega o listview com os itens encontrados
lv.setAdapter(new ArrayAdapter<String>(consulta.this, android.R.layout.simple_list_item_1, lstEstados_Encontrados));
}
});
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView arg0, View view, int position, long index) {
Mensagem("Você clicou no estado : " + lstEstados_Encontrados.get(position).toString());
}
});
}
public void CarregarEncontrados()
{
int textlength = et.getText().length();
//Limpa o array com os estados encontrados
//para poder efetuar nova busca
lstEstados_Encontrados.clear();
for (int i = 0; i < lstEstados.length; i++)
{
if (textlength <= lstEstados[i].length())
{
//Verifica se existe algum item no array original
//caso encontre é adicionado no array de encontrados
if(et.getText().toString().equalsIgnoreCase((String)lstEstados[i].subSequence(0, textlength)))
{
lstEstados_Encontrados.add(lstEstados[i]);
}
}
}
}
private void Mensagem(String msg)
{
Toast.makeText (getApplicationContext(), msg, Toast.LENGTH_SHORT).show ();
}
}
</pre>
<br />
Abaixo segue o código fonte do arquivo consulta.xml:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<EditText
android:hint="Procurar"
android:id="@+id/etProcurar"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</EditText>
<ListView
android:id="@+id/lvEstados"
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</ListView>
</LinearLayout>
</pre>
<br />
O segredo (se é que tem) deste fonte está no evento onTextChanged que é disparado toda vez que o usuário digita alguma coisa na caixa de texto de busca e com isso efetuamos um loop no array de estados e verificamos se oque o usuário digitou existem em algum dos itens, caso tenha adicionamos no array de "encontrados" e em seguida carreamos nosso adapter com esse array de encontrados.<br />
<br />
Como resultado temos as imagens a seguir, mostrando a tela inicial e quando o usuário digitar alguma coisa na caixa de texto:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAReTvPDt5N-5yIq2OBVw1OdebRt3x_Lz4n6yf6qfvPkKQ1zCfn7VXa45nQznbPywDKk453menbxX_kDE9NfH_J9O0lXsdkBLp45hGVjz-FPrmrHlrkE5HOa29j0hxKrCiFqH7_94bPaq8/s1600/fig3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAReTvPDt5N-5yIq2OBVw1OdebRt3x_Lz4n6yf6qfvPkKQ1zCfn7VXa45nQznbPywDKk453menbxX_kDE9NfH_J9O0lXsdkBLp45hGVjz-FPrmrHlrkE5HOa29j0hxKrCiFqH7_94bPaq8/s320/fig3.jpg" title="ListView" width="218" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEginvgtcLOLBtUGr1kr6mh607hz9DPP1xGd_76dT809q_U8PCHNcvUFHitAmL0eRPIlaN-XZslmZz8h-WlY5SbmReFJkSwlVoKgGnAWDaAanepjv6gk_A-DvR1pTisN9A0VoV-443LnRSn6/s1600/fig4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEginvgtcLOLBtUGr1kr6mh607hz9DPP1xGd_76dT809q_U8PCHNcvUFHitAmL0eRPIlaN-XZslmZz8h-WlY5SbmReFJkSwlVoKgGnAWDaAanepjv6gk_A-DvR1pTisN9A0VoV-443LnRSn6/s320/fig4.jpg" title="ListView" width="218" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<br />
<br />
<div>
Em breve estarei postando mais opções relacionadas a layout e listview.</div>
<div>
<br /></div>
<div>
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html">http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html</a></div>
<div>
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html</a><br />
Parte 3 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-3.html</a><br />
Parte 5 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html</a><br />
Parte 6 : <a href="http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html">http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html</a><br />
Parte 7 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html</a><br />
Parte 8 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html</a> </div>
<div>
<br />
<br />
Trabalhando com Banco de Dados SQLite:<br />
<a href="http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html">http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html</a><br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
<div>
Desenv com qualidade!</div>Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com12tag:blogger.com,1999:blog-1139756238495061386.post-61913857040403985742011-12-01T18:11:00.003-08:002012-04-26T17:42:05.389-07:00Android - ListView Parte 3Olá,<br />
<br />
Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 3.<br />
<br />
O exemplo de hoje será uma variação da <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">parte 2</a>, onde será criado um ListView com alguns estados brasileiros com múltipla escolha, a diferença está por conta do layout, que terá fixo no rodapé dois botões, que irão informar ao usuário quais estados foram marcados e quais não foram marcados.<br />
<br />
Vamos por logo a mão na massa, abaixo segue o código fonte do arquivo lista3.java:<br />
<br />
<pre class="brush:java">package br.com.empresa;
import android.app.Activity;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class list3 extends Activity {
private String[] lstEstados;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.lista3);
listView = (ListView) findViewById(R.id.lista3);
//Criar um array de String
lstEstados = new String[] {"São Paulo", "Rio de Janeiro", "Minas Gerais", "Rio Grande do Sul", "Santa Catarina", "Paraná", "Mato Grosso", "Amazonas"};
//Criar um ArrayAdapter do tipo String, que vai fazer aparecer as Strings acima
//em seu ListView do tipo que checked
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_checked, lstEstados);
//Associar o adapter ao listview
listView.setAdapter(adapter);
}
//Este evento foi definido no arquivo de layout xml
public void btnMarcados_click(View view){
String lstrEstadosSelecionados = "";
//Cria um array com os itens selecionados no listview
SparseBooleanArray checked = listView.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++){
//pega os itens marcados
lstrEstadosSelecionados += lstEstados[checked.keyAt(i)] + ",";
}
Toast.makeText(this, "Estados marcados : " + lstrEstadosSelecionados, Toast.LENGTH_LONG).show();
}
//Este evento foi definido no arquivo de layout xml
public void btnDesmarcados_click(View view){
String lstrEstadosSelecionados = "";
for (int i = 0; i < listView.getCount(); i++){
//pega os itens desmarcados
if (listView.isItemChecked(i) == false){
lstrEstadosSelecionados += lstEstados[i] + ",";
}
}
Toast.makeText(this, "Estados desmarcados : " + lstrEstadosSelecionados, Toast.LENGTH_LONG).show();
}
}
</pre>
<br />
Para esse exemplo será necessário criar um arquivo de layout, até porque estaremos incluindo dois botões nesse layout e eles ficarão fixos no rodapé do layout.<br />
<br />
Abaixo segue o código fonte do arquivo lista3.xml:<br />
<pre class="brush:xml"><?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_height="fill_parent"
android:layout_width="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView
android:choiceMode="multipleChoice"
android:id="@+id/lista3"
android:layout_above="@+id/buttons"
android:layout_alignParentTop="true"
android:layout_height="fill_parent"
android:layout_width="fill_parent"/>
<LinearLayout
android:id="@+id/buttons"
android:layout_alignParentBottom="true"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal">
<Button
android:id="@+id/btnMarcados"
android:layout_height="wrap_content"
android:layout_weight="50"
android:layout_width="fill_parent"
android:onClick="btnMarcados_click"
android:text="Marcados"/>
<Button
android:id="@+id/btnDesmarcados"
android:layout_height="wrap_content"
android:layout_weight="50"
android:layout_width="fill_parent"
android:onClick="btnDesmarcados_click"
android:text="Desmarcados"/>
</LinearLayout>
</RelativeLayout>
</pre>
<br />
<br />
Para explicação do layout xml acima temos o seguinte:<br />
<ul>
<li>Criamos um LinearLayout com 2 botões dentro de um RelativeLayout que contém o ListView</li>
<li>ListView android:choiceMode="multipleChoice" - Informamos que teremos seleção em nossa lista</li>
<li>ListView android:layout_alignParentTop="true" - O ListView ficará alinhado no topo de nosso xml</li>
<li>Button android:onClick="btnMarcados_click" - Dizemos qual função irá receber o evento click do botão</li>
<li>Button android:layout_weight="50" - Dizemos que o tamanho do botão será de 50% da tela</li>
</ul>
<div>
<br /></div>
<div>
Como resultado final teremos a seguinte tela:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBU9-CvrkDYP6pYQXkI6f9DrNNYbwwdjNbYQqsK0VLbj_9PwSN0FQo_ctZ4N4e_J3RdS57aK9sgNhBTXQQuq_v4MBGggvN4Abz4kjjMTOjswhgQ2LvPeqemFMo-Mhi2MVzl1-a42enDeKw/s1600/fig12.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBU9-CvrkDYP6pYQXkI6f9DrNNYbwwdjNbYQqsK0VLbj_9PwSN0FQo_ctZ4N4e_J3RdS57aK9sgNhBTXQQuq_v4MBGggvN4Abz4kjjMTOjswhgQ2LvPeqemFMo-Mhi2MVzl1-a42enDeKw/s400/fig12.jpg" title="ListView" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ListView</td></tr>
</tbody></table>
<div>
<br /></div>
<div>
Em breve estarei postando mais opções relacionadas a layout e listview.</div>
<div>
<br /></div>
<div>
Parte 1 : <a href="http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html">http://escoladeandroid.blogspot.com/2011/10/trabalhando-com-listview-parte-1.html</a></div>
<div>
Parte 2 : <a href="http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html">http://escoladeandroid.blogspot.com/2011/11/trabalhando-com-listview-parte-2.html</a><br />
Parte 4 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-4.html</a><br />
Parte 5 : <a href="http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html">http://escoladeandroid.blogspot.com/2011/12/trabalhando-com-listview-parte-5.html</a></div>
<div>
Parte 6 : <a href="http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html">http://escoladeandroid.blogspot.com/2011/12/android-listview-parte-6.html</a><br />
Parte 7 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-7.html</a><br />
Parte 8 : <a href="http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html">http://escoladeandroid.blogspot.com.br/2012/03/android-listview-parte-8.html</a> <br />
<br />
<br />
Trabalhando com Banco de Dados SQLite:<br />
<a href="http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html">http://escoladeandroid.blogspot.com/2012/02/android-criando-uma-agenda-de-contatos.html</a><br />
<br />
<br />
Desenvolvi o jogo <a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result">Circus Puzzle Free</a> ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://market.android.com/details?id=br.com.escoladeandroid&feature=search_result" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9b783vwQQNtpSiM35ZC3CbEClJowpjNrdOBZW84Tm28UmQYaNR6hEGiEvSSTunjKVW_XGzdXdc_wotLCgN5mcxNW5XRrUsPKT6EZcnFipIfvio94wMt33Q7YX-bDrUq9VYxtJKP3ey-VI/s320/Propaganda.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
<div>
Desenv com qualidade!</div>Marcio de Souzahttp://www.blogger.com/profile/18284629415888547404noreply@blogger.com3