terça-feira, 12 de junho de 2012

Efetuando download via FTP

Olá pessoal,

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.

Como de costume vou apresentar todos os fontes utilizados já com comentários para facilitar no aprendizado.

Abaixo segue um print dos arquivos do projeto:


Abaixo segue o arquivo clsFTP.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;
    }    
}

Abaixo segue o arquivo TesteFTPActivity.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);
    }    
}

Abaixo segue o arquivo AndroidManifest.xml, onde deveremos adicionar as permissões para acessar a internet e gravar no SD:
<?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>

Abaixo segue o arquivo main.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>

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.



Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

quinta-feira, 10 de maio de 2012

Criando um Custom Dialog


Olá Pessoal,


Hoje vou mostrar como criar um Custom Dialog, este recurso pode ser utilizado quando você quer criar uma tela modal.

Abaixo segue um print do projeto utilizado.

Como de costume vou apresentar todos os fontes utilizados já com comentários para facilitar no aprendizado.

Arquivo main.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>

Arquivo customdialog.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>

Arquivo CustomDialogActivity.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();
         
    }
}

Abaixo seguem o resultado de nosso projeto.


Espero que seja útil para vocês este post e em breve estarei postando novidades.


Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

terça-feira, 8 de maio de 2012

Utilizando Shadow em TextView

Olá Pessoal,


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.

Antes já vou explicar os principais atributos da sombra (shadow):

android:shadowColor - cor que será utilizada na sombra.

android:shadowDx - 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.

android:shadowDy - 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.

android:shadowRadius - define o grau do esfumaçado da sombra, quanto maior o número mais esfumaçado será a sombra.


Abaixo seguem alguns exemplos de sombra.

Arquivo main.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>


Abaixo segue o resultado de nosso teste:
Shadow

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.


Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

domingo, 29 de abril de 2012

Android - Criando um Splash Screen


Olá Pessoal,

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.

Abaixo segue um print do projeto.


Abaixo seguem os fontes utilizados no projeto.

Arquivo AndroidManifest.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>

Arquivo main.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>

Arquivo splashscreen.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>

Arquivo SplashScreen.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;
    }

}

Arquivo Principal.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);
    }
}

Imagem utilizada no sistema, colocar na pastas drawable-hdpi:

Abaixo segue o resultado de nosso aplicativo:
Splash Screen
Menu Princpal

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".

Caso o usuário clique no botão "Voltar" enquanto está sendo exibida a tela Splash Screen, o sistema será encerrado.

Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

Android - Obter nome e versão do aplicativo


Olá Pessoal,

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.

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.

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.

Arquivo AndroidManifest.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>

Arquivo main.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>

Arquivo InformacoesActivity.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);
    }
}

Abaixo segue o resultado de nosso exemplo:
Activity

Por enquanto é isso pessoal, assim que eu tiver novas dicas postarei aqui no blog.

Obrigado e até mais...

Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

sábado, 28 de abril de 2012

Android - Remover barra de título


Olá Pessoal,

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.

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.

Abaixo seguem as duas opções.

Arquivo AndroidManifest.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>

Arquivo HelloWorldActivity.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);
    }
}

Abaixo segue um antes e depois:
 


Atenção:
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.

Por enquanto é isso, espero que tenham gostado, até mais...


Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

quinta-feira, 26 de abril de 2012

Android - Utilizando Shared Preferences


Olá Pessoal,


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.

Como de costume abaixo seguem todos os fontes utilizados, eles já estão com comentários para facilitar no aprendizado.

Arquivo main.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>


Arquivo PreferenceActivity.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
    }
}


Abaixo segue uma imagem do nosso projeto.
Shared Preferences


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.

Bem, por enquanto é isso pessoal, espero que tenham gostado e em breve trarei mais novidades para vocês, obrigado e até mais.

Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

sábado, 21 de abril de 2012

Android - Carregando ListView com SqLite


Olá Pessoal,

Hoje vou mostrar como carregar um ListView com informações vindas do SqLite, esse exemplo utiliza parte do código utilizado no exemplo de Agenda.

A seguir temos um print do projeto, para orientar onde devemos criar cada arquivo.

Para facilitar no aprendizado todos os fontes apresentados seguem com comentários, e abaixo segue todo o fonte utilizado.

Arquivo main.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>


Arquivo row.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>


Arquivo BaseDAO.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);
    }
}


Arquivo ListSqliteActivity.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();        
    }
}


Abaixo seguem as imagens do projeto em execução.


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
"Carregar registros" para ser exibido a lista dos dados inseridos no Banco de Dados SqLite.

Por enquanto é isso pessoal, espero que gostem e comentem, caso tenham alguma dúvida, crítica ou sugestão é só enviar.

Em breve estarei apresentando mais exemplos sobre SqLite.


Posts relacionados:
Criação de uma Agenda - http://escoladeandroid.blogspot.com.br/2012/02/android-criando-uma-agenda-de-contatos.html



Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

quinta-feira, 19 de abril de 2012

Criando um formulário de login


Olá Pessoal,

Hoje vou apresentar o layout de um formulário de login, já estilizado, com Shape e Styles nos componentes utilizados.

Utilizando o modelo proposto neste projeto podemos criar layouts mais sofisticados para nossos programas.

Abaixo segue um print da estrutura do projeto.


Abaixo seguem todos os arquivos utilizados no projeto acima.


Arquivo shapebutton.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>

Arquivo shaplinear.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>


Arquivo shaplinear.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>


Arquivo styles.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>


Arquivo main.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>


Abaixo temos o resultado de nosso projeto.


Por enquanto é isso pessoal, espero que tenham gostado, assim que tiver novidades eu postarei com certeza.


Abaixo seguem outros links relacionados:
Pattern DashBoard - http://escoladeandroid.blogspot.com.br/2012/04/pattern-dashboard.html
Shape - http://escoladeandroid.blogspot.com.br/2012/04/android-shape.html



Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

domingo, 15 de abril de 2012

Pattern - Dashboard

Olá Pessoal,

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.

Abaixo segue um print com a estrutura do projeto:


A seguir serão apresentados todos os fontes utilizados no sistema.

Arquivo colors.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>

Arquivo strings.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>

Arquivo styles.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>

Arquivo main.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>

Arquivo DashBoardActivity.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);
    }    
}

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.

Como resultado temos a seguinte imagem:

Abaixo seguem as imagens utilizadas nos botões:
 




Em breve estarei postando outros exemplos de Patterns.

Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

terça-feira, 10 de abril de 2012

Android - Shape

Olá Pessoal,


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.

Para criar um shape devemos primeiro criar a pasta drawable dentro da pasta res.

Para esse projeto irei criar um shape para cada componente (LinearLayout, Button, TextView e TextView2).

Abaixo segue um print da estrutura do projeto.


Imagem utilizada de background do layout lunai.png:



Abaixo seguem todos os arquivos utilizados.

Arquivo shapebutton.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>

Arquivo shapelinear.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>


Arquivo shapetextview.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>

Arquivo shapetextview2.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>


Arquivo main.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>

Abaixo segue uma imagem com o resultado do layout.


Agora uma breve explicação sobre os principais atributos de um shape:

Stroke = desenha uma borda sobre o componente
Corners = define os canots arredondados
Solid = define a cor de fundo do componente

Por enquanto é isso pessoal, com esses exemplos passados já podemos criar projetos mais elegantes.

Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!