sábado, 10 de dezembro de 2011

Android - ListView Parte 6

Olá,

Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 6.

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.

O fonte será parecido com o último post.

Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:

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


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

Abaixo segue o código fonte do arquivo estados.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>


Abaixo segue o código fonte do arquivo estado_row.xml:
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"
<?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>

Abaixo segue o código fonte do arquivo list_bg.xml (este arquivo deverá ficar na pasta res\color):
<?xml version="1.0" encoding="utf-8"?>  
     
    <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"/>    
 


Abaixo segue o código fonte do arquivo text_bg.xml (este arquivo deverá ficar na pasta res\color):
<?xml version="1.0" encoding="utf-8"?>  
     
    <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"/>    
 

Abaixo segue o código fonte do arquivo styles.xml (este arquivo deverá ficar na pasta res\values):
<?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> 

Abaixo segue o código fonte do arquivo colors.xml (deverá ficar na pasta res\values):
<?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> 

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:


Abaixo segue o resultado de nosso programa:
ListView

ListView


Abaixo segue algumas dicas para melhor entendimento do fonte:

  1. Arquivo style.xml - atributos dos textview que utilizamos em nosso fonte
  2. Arquivo list_bg.xml - definição de cores do nosso listview
  3. Arquivo text_bg.xml - definição das cores dos textview utilizados no arquivo estado_row.xml
  4. Utilização da classe ViewHolder no arquivo EstadoAdapter.java para aumentar a performance ao carregar os itens da lista.
  5. Utilização da classe AlertDialog para exibir ao usuário a opção de escolher entre duas ações.


Por enquanto é isso espero que tenham gostado e em breve estarei postando mais discas e tutoriais sobre listview e layout.



Trabalhando com Banco de Dados SQLite:
http://escoladeandroid.blogspot.com/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, 8 de dezembro de 2011

Android - ListView Parte 5

Olá,

Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 5.

Hoje iremos ver como criar um listview com ícone e mais de uma linha de texto para cada registro do ListView.

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.

Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:

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

Arquivo Estado.java (classe POJO):
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;
    }
}

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

Abaixo segue o código fonte do arquivo estados.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>


Abaixo segue o código fonte do arquivo estado_row.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>

Abaixo seguem as figuras que foram utilizadas no sistema na pasta res\drawable-ldpi:


Abaixo segue o resultado do nosso sistema:
ListView


Em breve estarei postando mais opções relacionadas a layout e listview.



Trabalhando com Banco de Dados SQLite:
http://escoladeandroid.blogspot.com/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!

terça-feira, 6 de dezembro de 2011

Android - ListView Parte 4

Olá,

Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 4.

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.

Abaixo segue o fonte utilizado todo comentado para facilitar seu aprendizado:

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

Abaixo segue o código fonte do arquivo consulta.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>

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.

Como resultado temos as imagens a seguir, mostrando a tela inicial e quando o usuário digitar alguma coisa na caixa de texto:

ListView
ListView


Em breve estarei postando mais opções relacionadas a layout e listview.



Trabalhando com Banco de Dados SQLite:
http://escoladeandroid.blogspot.com/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, 1 de dezembro de 2011

Android - ListView Parte 3

Olá,

Dando sequência a série sobre ListView, esse que é um dos recursos mais importantes do Android, estamos chegando a parte 3.

O exemplo de hoje será uma variação da parte 2, 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.

Vamos por logo a mão na massa, abaixo segue o código fonte do arquivo lista3.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();
    }    
}

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.

Abaixo segue o código fonte do arquivo lista3.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>


Para explicação do layout xml acima temos o seguinte:
  • Criamos um LinearLayout com 2 botões dentro de um RelativeLayout que contém o ListView
  • ListView android:choiceMode="multipleChoice" - Informamos que teremos seleção em nossa lista
  • ListView android:layout_alignParentTop="true"  - O ListView ficará alinhado no topo de nosso xml
  • Button android:onClick="btnMarcados_click" - Dizemos qual função irá receber o evento click do botão
  • Button android:layout_weight="50" - Dizemos que o tamanho do botão será de 50% da tela

Como resultado final teremos a seguinte tela:
ListView

Em breve estarei postando mais opções relacionadas a layout e listview.

Desenv com qualidade!

Android - Calculadora - programa com código fonte

Olá,

O projeto a seguir é um exemplo muito simples de uma calculadora apenas para fins didáticos, este projeto eu irei utilizar em um Curso de Extensão que irei ministrar em 2012 na Universidade de Franca - UniFran.

Nele serão abordados alguns pontos interessantes para iniciantes abaixo segue uma lista deles:

  • Layout landscape e portrait 
  • Evento click para botões
  • Tratamento de erro
  • Conversão de valores (String para Double)

Abaixo segue o fonte do arquivo CalculadoraActivity.java o fonte está todo comentado para melhor entendimento.

package br.com.CursoExt;

import java.text.NumberFormat;

import br.com.CursoExt.R.id;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class CalculadoraActivity extends Activity implements OnClickListener {
    
  
 // Definição dos objetos e variáveis modulares que 
 // serão utilizados dentro da classe
 
    EditText primeiro;
    EditText segundo;
    EditText resultado;
    Button btnSomar;
    Button btnSubtrair;
    Button btnMultiplicar;
    Button btnDividir;
    Double result = (double)0; 

    // Chamada quando a activity é criada pela primeira vez
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //
         // Associa um arquivo de layout a esta classe
         //
        setContentView(R.layout.main);
        
        try{
            // 
            // Instanciando os objetos de acordo com o layout XML 
            // definido no arquivo main.xml
            //
            primeiro = (EditText)findViewById(R.id.edNumero1);
            segundo = (EditText)findViewById(R.id.edNumero2);
            resultado = (EditText)findViewById(R.id.edResultado);
            btnSomar = (Button)findViewById(id.btnSomar);
            btnSubtrair = (Button)findViewById(id.btnSubtrair);
            btnMultiplicar = (Button)findViewById(id.btnMultiplicar);
            btnDividir = (Button)findViewById(id.btnDividir);
         
            // 
            // Associando o evento OnClickListener de cada um dos botões 
            // a uma fução específica
            //
            btnSomar.setOnClickListener(onClick_btnSomar);
            btnSubtrair.setOnClickListener(onClick_btnSubtrair);
            btnMultiplicar.setOnClickListener(onClick_btnMultiplicar);
            btnDividir.setOnClickListener(onClick_btnDividir);
        }
        catch (Exception e) {
            // Tratamento de erro 
            Mensagem(e.getMessage());
        }
    }

    // Cria um anonymous implementation para OnClickListener 
    OnClickListener onClick_btnSomar = new OnClickListener() {    
        public void onClick(View v) {
            try
            {
                result = getDouble(primeiro.getText().toString()) + getDouble(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnSomar");
                //Gravar no LogCat uma informação para auxiliar 
                //no processo de desenvolvimento e correção de bugs
                Log.i("Somar", "clicou no botão Somar");
            }
            catch (Exception e) {
                //Gravar no LogCat o erro ocorrido
                TrataErro(e, "Botão Somar");
            }
        }
    };    

    OnClickListener onClick_btnSubtrair = new OnClickListener() {    
        public void onClick(View v){      
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) - Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnSubtrair");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Subtrair");
            }
        }
    };

    OnClickListener onClick_btnMultiplicar = new OnClickListener() {    
        public void onClick(View v) {      
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) * Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnMultiplicar");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Multiplicar");
            }
        }
    };    

    OnClickListener onClick_btnDividir = new OnClickListener() {    
     public void onClick(View v) { 
            try
            {
                result = Double.valueOf(primeiro.getText().toString()) / Double.valueOf(segundo.getText().toString());
                MostraResultado();
                Mensagem("onClick_btnDividir");
            }
            catch (Exception e) {
                TrataErro(e, "Botão Dividir");
            }
        }
    };    
    
    //
    // Desativando o botão voltar do aparelho
    //
    @Override
    public void onBackPressed() {
        return;
    }
 
    public void onClick_Sair(View v) {
        try
        {
            //
            // Criando uma caixa de diálogo para sair ou não do sistema
            //
            AlertDialog.Builder builder = new AlertDialog.Builder(this);     
            builder.setMessage("Você tem certeza que deseja sair?")            
                //informando o título da caixa de texto
                .setTitle("Atenção:")
                .setIcon(android.R.drawable.ic_menu_info_details) 
       
                //setCancelable = false
                //desabilita o botão Voltar com isso obrigando o usuário 
                //a selecionar um dos botões do AlertDialog
                .setCancelable(false)      
                .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        CalculadoraActivity.this.finish();
                    }            
                })           
                .setNegativeButton("Não", new DialogInterface.OnClickListener() { 
                    public void onClick(DialogInterface dialog, int id) { 
                        dialog.cancel();                
                    }            
                });     
            AlertDialog alert = builder.create();     
            alert.show();  
        }
        catch (Exception e) {
            Mensagem(e.getMessage());
        }
    }

    // 
    // Apresentar o resultado do cálculo no objeto "resultado"
    // através do método setText
    //
    private void MostraResultado()
    {
        String strResult = NumberFormat.getInstance().format(result);
        resultado.setText(strResult);
    }
 
    // 
    // Converter um valor String para Double
    // 
    private Double getDouble(String pValue)
    {
        if (pValue == null || pValue.length() == 0 || pValue.equals("."))
            return Double.valueOf(0);
        else
            return Double.parseDouble(pValue);
    }
 
    // 
    // Apresentar mensagem de erro ou informações oa usuário
    // 
    private void Mensagem(String pMens)
    {
        Toast.makeText(this, pMens, Toast.LENGTH_SHORT).show();
    }

    private void TrataErro(Exception e, String pMens)
    {
        Mensagem(e.getMessage());
        Log.e(getString(R.string.app_name), pMens, e);
    }
}

Foram criados dois layout um para o landscape e outro para o portrait, abaixo segue o layout portrait:

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

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o primeiro número"/>

    <EditText 
        android:id="@+id/edNumero1" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o segundo número"/>
        
    <EditText 
        android:id="@+id/edNumero2" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Operações:"/>
    
    <Button 
        android:id="@+id/btnSomar" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Somar"/>

    <Button 
        android:id="@+id/btnSubtrair" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Subtrair"/>

    <Button 
        android:id="@+id/btnDividir" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Dividir"/>

    <Button 
        android:id="@+id/btnMultiplicar" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content" 
        android:text="Multiplicar"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Resultado:"/>
    
    <EditText 
        android:id="@+id/edResultado" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent"/>

</LinearLayout>

E a seguir o layout landscape:

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

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o primeiro número"/>

    <EditText 
        android:id="@+id/edNumero1" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Digite o segundo número"/>
        
    <EditText 
        android:id="@+id/edNumero2" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent" 
        android:text="0"/>
    
    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Operações:"/>

    <LinearLayout 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:orientation="horizontal">    
    
        <Button 
            android:id="@+id/btnSomar" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Somar"/>

        <Button 
            android:id="@+id/btnSubtrair" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Subtrair"/>

        <Button 
            android:id="@+id/btnDividir" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Dividir"/>

        <Button 
            android:id="@+id/btnMultiplicar" 
            android:layout_height="wrap_content" 
            android:layout_width="wrap_content" 
            android:text="Multiplicar"/>
    
    </LinearLayout>

    <TextView 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:text="Resultado:"/>
    
    <EditText 
        android:id="@+id/edResultado" 
        android:inputType="numberDecimal" 
        android:layout_height="wrap_content" 
        android:layout_width="match_parent"/>
        
</LinearLayout>

Para criação dos dois layouts será necessário criar uma pasta chamada layout-land dentro da pasta res, conforme figura abaixo:


Abaixo segue um print de como ficou nossa calculadora:


Repare a diferença de layout nos botões entre as duas visões graças a inclusão dos dois arquivos main.xml, ou seja, um para cada layout.

Por enquanto é isso, é um projeto bem simples, mas que acredito que servirá para muitos no aprendizado.


Desenv com qualidade!

terça-feira, 29 de novembro de 2011

AdMob com Android

Olá,

Neste tutorial vou mostrar oque é preciso fazer para poder utilizar os serviços do AdMob, este que é um serviço que com certeza pode lhe trazer retornos financeiros.

A princípio você precisa seguir três passos, que são:
  • Criar uma conta no AdMob
  • Baixar o SDK do Admob
  • Configurar seus projetos para exibir os banners de propaganda

Abaixo segue um guia completo para auxiliar sua tarefa.


    AdMob
    Visão Global
    Google AdMob Ads são banners que usão uma pequena porção da tela para motivar os usuários a "clicar em anúncios"  e levá-los para uma experiência em tela cheia, como um site ou página da loja app.

    Para exibir banners em seu aplicativo Android, simplesmente incorpore o SDK para o projeto Eclipse e adicione um com.google.ads.AdView à sua interface do usuário.

    Requisitos
    O Google AdMob Anúncios SDK para Android requer Android 1.5 ou posterior. Certifique-se que a cópia mais recente do Android SDK e que está compilando contra pelo menos Android v3.2 (set target em default.properties para android-13).


    Registrando-se no AdMob
    O primeiro passo é criar uma conta neste link http://www.admob.com/s/home/register/ conforme figura 1
    Figura 1

    Adicionando site/aplicativo
    Depois que você criou a conta no AdMob o próximo passo agora é adicionar o seu aplicativo Android lá para isso efetue o login no site do AdMob e clique na aba Sites e aplicativos e em seguida Adicionar site/aplicativo conforme figura 2
    Figura 2

    Clique na opção Aplicativo para Android, conforme figura 3
    Figura 3

    Em seguida informe os seguintes campos:
    • Nome do aplicativo
    • URL do pacote Android (endereço de seu aplicativo no Market Android)
    • Categoria
    • Descrição do aplicativo
    • Senha



    Como resultado você recebrá uma nova tela solicitando para você efetuar o download do SDK do AdMob para Android, conforme figura abaixo.

    Incorporando o SDK
    Incorporando Anúncios Google AdMob em seu app é um processo de três passos:


    1.Adicione SDK JAR em seu projeto Eclipse.
    2.Declare com.google.ads.AdActivity em AndroidManifest.xml.
    3.Habilite as permissões de rede no manifesto.

    Obter ID do editor
    Para relacionar o seu aplicativo com sua conta do AdMob você precisa obter o ID do editor, para isso, vá no menu Sites e Aplicativos e depois clique em Gerenciar configurações, conforme figura abaixo:















    Depois é só anotar o seu código ID e inserir em seu aplicativo, conforme figura abaixo.

    Adicionando o SDK JAR
    O SDK descompactado consiste de um JAR, uma pasta javadoc e um README.

    1.    Clique com o botão direito sobre seu projeto no Eclipse e escolha Proprerties




    2. Escolha  Java Build Path and the Libraries tab. Então clique em Add External JARs... para adicionar o Google AdMob Ads JAR.

    com.google.ads.AdActivity
    O AdMob Ads SDK queer que o com.google.ads.AdActivity seja declarado em seu AndroidManifest.xml:

     
         
             
                 
                     
                     
                     
             
             
            
         
    
    


    Permissões
    Fazer pedidos ad exige a rede INTERNET permissões e ACCESS_NETWORK_STATE, assim que estes também devem ser declarados no manifesto:


     
         
             
                 
                     
                     
                     
             
             
            
         
        
        
    
    

    Agora você deve ser capaz de reconstruir seu projeto sem erros.

    Adicionando um com.google.ads.AdView
    Aplicativos Android são compostas de objetos View, instâncias Java que o usuário vê como áreas de texto, botões e outros controles. AdView é simplesmente outra subclasse Ver a exibição de anúncios HTML5 de pequeno porte que respondem ao toque do usuário.

    Como qualquer View, um AdView podem ser criadas puramente no código ou em grande parte em XML.

    As cinco linhas de código que é preciso para adicionar um banner:

    • Importe Com.google.ads.*
    • Declarar uma instância AdView
    • Criar-la, especificando uma unidade de ID- “o seu ID de editor da AdMob”
    • Adicione a view para a interface do usuário
    • Coloque-o com um anúncio

    O melhor lugar para fazer tudo isto está em atividade de seu aplicativo.



    import com.google.ads.*; 
    
    public class BannerExample extends Activity { 
      private AdView adView; 
    
      @Override 
    
      public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
    
        // Create the adView 
        adView = new AdView(this, AdSize.BANNER, MY_AD_UNIT_ID); 
     
        // Lookup your LinearLayout assuming it’s been given 
        // the attribute android:id="@+id/mainLayout" 
        LinearLayout layout = (LinearLayout)findViewById(R.id.mainLayout); 
     
        // Add the adView to it 
        layout.addView(adView); 
     
        // Initiate a generic request to load it with an ad 
        adView.loadAd(new AdRequest()); 
      } 
     
      @Override 
      public void onDestroy() { 
        adView.destroy(); 
        super.onDestroy(); 
      } 
    }
    
    


    O Resultado
    Quando você agora executar o aplicativo que você deve ver um banner no topo da tela:






    domingo, 20 de novembro de 2011

    Ganhar dinheiro com Android - Parte 2

    Olá,

    Em agosto de 2011 escrevi sobre minha primeira experiência sobre como rentabilizar um aplicativo (segue link http://escoladeandroid.blogspot.com/2011/08/ganhar-dinheiro-com-android.html),pois bem, alguns meses depois e as coisas ainda continuam difíceis sob a ótica financeira, mas mesmo assim ainda continuo entusiasmado com Android, abaixo vou mostrar alguns números sobre meu aplicativo Circus Puzzle :

    Quantidade de downloads: 2147
    Aplicações ativas: 586

    Abaixo segue imagem com os dados acima:
    Abaixo seguem algumas estatísticas interessantes também, por exemplo, saber a quantidade de aplicativos ativos por país, e é bem legal saber que existem pessoas nos Estados Unidos e Taiwan que utilizam seu aplicativo:

    br.com.escoladeandroid
    1Estados Unidos15,9% (93)
    2Taiwan12,5% (73)
    3Brasil8,4% (49)
    4México6,1% (36)
    5Arábia Saudita4,4% (26)
    6Hong Kong3,4% (20)
    7Chile2,9% (17)
    8Tailândia2,9% (17)
    9Japão2,7% (16)
    10Israel2,2% (13)



    Sobre a questão de retorno financeiro já paguei propaganda duas vezes de $100,00 cada para a AdMob para divulgar meu aplicativo, mas mesmo assim o retorno é muito pequeno tenho apenas $23,27 acumulados para receber, para vocês terem uma idéia, meu aplicativo gera mais ou menos $0,21 por dia, é muito pouco.

    Por enquanto é isso, quando eu tiver mais novidades ou dicas eu posto aqui novamente

    Até mais...

    Parte 1 : http://escoladeandroid.blogspot.com/2011/08/ganhar-dinheiro-com-android.html
    Parte 3 : http://escoladeandroid.blogspot.com/2012/02/ganhar-dinheiro-com-android-parte-3.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!