sexta-feira, 13 de fevereiro de 2015

Android Spinners

Android Spinners 



    Spinners nos fornecem uma maneira rápida de selecionar um valor de um conjunto de valores. Em um estado padrão, um Spinner mostra seu valor atual. Tocando no Spinner ele mostra um dropdown menu com todos os outros valores, onde o usuário pode escolher um novo valor.

    Nesse tutorial estarei explicando como utilizar um Spinner, estarei utilizando o Android Studio 1.0.2, veja os passos que realizaremos neste tutorial.

  • Criaremos uma MainActivity
  • Adicionaremos um Spinner no activity_main.xml
  • Utilizaremos o Spinner na MainActivity
  • Mostraremos na tela o item selecionado no Spinner

Nosso projeto ficará assim:



    Você pode adicionar um Spinner no seu layout com o Objeto Spinner. Você deve  cria-lo no seu layout XML com o elemento <Spinner> . Por exemplo:



<Spinner
    android:id="@+id/planets_spinner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

    Outra forma de adicionar o Spinner no seu layout é arrastando para o seu layout a partir do editor gráfico do Android Studio.



    Como nesse criaremos um Spinner com nomes de pessoas colocaremos no nosso activity_main.xml um TextView que terá o valor Nome: e o nosso Spinner que armazenará nossa lista de nomes .Abaixo o código do activity_main.xml.

activity_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:padding="10dp">

    <Spinner
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/spinner"
        android:layout_alignTop="@+id/textView"
        android:layout_toRightOf="@+id/textView"
        android:layout_toEndOf="@+id/textView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Nomes: "
        android:id="@+id/textView"
        android:layout_marginTop="66dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginRight="10dp"/>
</RelativeLayout>

    Agora vamos trabalhar na nossa classe MainActivity.java, começaremos por criar um objeto do tipo Spinner e armazena-lo em uma variável chamada spinner. Neste tutorial criaremos um Spinner com nomes de Pessoas como mostrado anteriormente na imagem acima, para colocar estes nomes no nosso spinner precisaremos criar uma lista de nomes , podemos usar um array de Strings , ArrayList<String> etc. No nosso caso usaremos um array de Strings, após criarmos a nossa lista de nomes precisamos coloca-la dentro do nosso Spinner, porém o Spinner não aceita um array de String como parâmetro para definirmos como lista, então o que fazer? Sabemos que o Spinner aceita um adapter como parâmetro e é isso que daremos a ele. Vamos criar um ArrayAdapter de String e passar nossa lista de nomes dentro dele, então poderemos passar o ArrayAdapter como parâmetro no nosso Spinner. Veja o código abaixo.

MainActivity.java


package com.inforprogramm.aulaspinner;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Spinner;


public class MainActivity extends Activity {

    //Criamos a variavel spinner
    private Spinner spinner;

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

        //instanciamos o spinner que está no nosso activity_main.xml
        spinner = (Spinner) findViewById(R.id.spinner);

        //Criamos uma lista de Nomes
        String nomes [] = {"José","Paulo","Maria","Henrique","João Paulo","Fernanda","Leticia"};

        //O spinner recebe um adapter que pode ser do tipo ArrayAdapter então criamos um ArrayAdapter e colocamos nossa lista dentro
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,nomes);

        //Agora definimos o adapter para nosso Spinner
        spinner.setAdapter(adapter);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

    Agora que já criamos nosso Spinner com sucesso vamos fazer com que cada vez que o usuário clique em um nome diferente na lista mostre-o na tela, para isso usaremos o método setOnItemSelectedListener() do Spinner, esse método executa determinado código que esteja dentro do método onItemSelected() cada vez que um item do Spinner for selecionado, no nosso caso usamos um método statico da classe Toast que serve para imprimir na tela uma mensagem, dessa forma tudo que devemos fazer é pegar o valor do Spinner que foi selecionado, usando o método getSelectedItem() do Spinner que retorna um Object então usamos o método toString() para converter-lo em String. Veja abaixo.


package com.inforprogramm.aulaspinner;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;


public class MainActivity extends Activity {

    //Criamos a variavel spinner
    private Spinner spinner;

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

        //instanciamos o spinner que está no nosso activity_main.xml
        spinner = (Spinner) findViewById(R.id.spinner);

        //Criamos uma lista de Nomes
        String nomes [] = {"José","Paulo","Maria","Henrique","João Paulo","Fernanda","Leticia"};

        //O spinner recebe um adapter que pode ser do tipo ArrayAdapter então criamos um ArrayAdapter e colocamos nossa lista dentro
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,nomes);

        //Agora definimos o adapter para nosso Spinner
        spinner.setAdapter(adapter);
//Criaremos uma acao para cada vez que um item seja selecionado no spinner
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //toda vez que um item for selecionado esse codigo será executado
                Toast.makeText(MainActivity.this, spinner.getSelectedItem().toString(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Baixar código fonte : Android Spinner

Android Custom Dialog (Dialog Customizado)

Android Custom Dialog (Dialog Customizado)


    Algumas vezes precisamos efetivar algum procedimento sem que para isso seja necessário sair da Activity, por exemplo abrir um calculadora em uma Activity de despesas. É aí que o Dialog vem para nos ajudar. Neste tutorial estarei utilizando o Android Studio 1.0.2 , veja os passos que iremos realizar.


  • Criar uma MainActivity 
  • Criar um Layout para o Dialog
  • Criar o Dialog na classe MainActivity
    O nosso projeto ficará assim:

Layout da MainActivity


Layout do Dialog



    Ao criar um projeto no Android Studio ele já cria a MainActivity prara você, dessa forma você precisa apenas editar o layout da MainActivity, abaixo segue o código do layout  activity_main.xml.


activity_main.xml



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Abrir Dialog"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="103dp" />
</RelativeLayout>

    Agora você deve criar um novo arquivo xml que será o nosso dialog_layout.xml para que possamos defini-lo como ContentView do nosso Dialog, crie um arquivo xml na pasta de layout do seu projeto no mesmo lugar onde está o layout da MainActivity, abaixo o código do dialog_layout.


dialog_layout.xml



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Nome:"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="29dp"
        android:layout_marginStart="29dp"
        android:layout_marginTop="58dp" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_alignTop="@+id/textView"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_toRightOf="@+id/textView"
        android:layout_toEndOf="@+id/textView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mostrar na tela"
        android:id="@+id/button_dialog"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="56dp" />
</RelativeLayout>

    Agora vamos criar o nosso Dialog na classe MainActivity para que quando o usuário clique no botão "Abrir Dialog" o nosso Dialog apareça. Veja o código abaixo.


MainActivity.java


package com.inforprogramm.auladialog;


import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity {

    //Cria as variaveis
    private Button button;

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

        //instacia o botao
        button = (Button) findViewById(R.id.button);

        //cria a acao do botao
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Agora vamos criar o dialog
                final Dialog dialog = new Dialog(MainActivity.this);
                //define o layout que criamos como contentView do nosso dialog
                dialog.setContentView(R.layout.dialog_layout);
                //Cria o titulo do dialog
                dialog.setTitle("Meu Dialog!");
                //cria o botao do nosso dialog passando o id do botao que criamos no dialog_layout
                Button botaoDialog = (Button) dialog.findViewById(R.id.button_dialog);
                // cria a caixa de texto EditText do nosso Dialog passando o id do EditText que criamos
                final EditText edtText = (EditText) dialog.findViewById(R.id.editText);

                //criamos a acao do botao do dialog
                botaoDialog.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //pegamos o texto da caixa de texto e mostramos na tela
                        String texto = edtText.getText().toString();
                        Toast.makeText(MainActivity.this,"O nome é: "+texto,Toast.LENGTH_SHORT).show();
                        //fecha o dialog
                        dialog.dismiss();

                    }
                });
                //mostra o dialog
                dialog.show();
            }
        });


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}



    Para baixar os códigos desse tutorial clique aqui: Android Dialog













quarta-feira, 11 de fevereiro de 2015

Android Sqlite Foreign Key

Android Sqlite Foreign Key


Neste tutorial mostrarei como usar a foreign key no Android, para isso criarei uma classe chamada Banco, essa classe será responsável por nos retornar uma conexão com o banco de dados SQLiteDatabase veja abaixo a classe banco.


package com.pds.teste.dao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by Renan on 03/02/2015.
 */
public class Banco {

    private final String BANCO = "banco.db";
    private final int BANCO_VERSAO = 1;
    private DbHelper dbHelper;



    class DbHelper extends SQLiteOpenHelper{


         public DbHelper(Context context) {
             super(context, BANCO, null, BANCO_VERSAO);
         }

         @Override
         public void onCreate(SQLiteDatabase db) {
             db.execSQL("CREATE TABLE IF NOT EXISTS Categoria  (_id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT UNIQUE)");            
             db.execSQL("CREATE TABLE IF NOT EXISTS Produto  (_id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT UNIQUE," +
                     "imagem text,descricao text,Categoria_id INTEGER , FOREIGN KEY(Categoria_id) REFERENCES Categoria(_id))");
             
         }

         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
             //lista todas as tabelas a serem deletadas no on Upgrade
             String [] tabelas = {"Categoria","Produto","Lista","Lista_produto","Config","Itens_da_lista"};
             for(String table : tabelas){
                 db.execSQL("DROP TABLE IF EXISTS "+table);
                 onCreate(db);
             }

         }
     }

Nesse Exemplo estou criando duas tabelas uma de produtos e outra de categorias no final do create da tabela Produto crio uma Foreign Key em que a coluna Categoria_id  da tabela Produto referencia a coluna _id da tabela Categoria. Dessa forma quando tentarmos excluir uma categoria que tenha uma referência de um produto o sistema lançará um erro e nós poderemos pegar esse erro através de um bloco try catch, mas ainda não criamos o método da classe Banco que nos retorna uma conexão vejamos abaixo.

public SQLiteDatabase getConnection(Context context){
        dbHelper = new DbHelper(context);
        SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase();
        
    }

Com esse método retornamos um objeto do tipo SQLitesDatabase e com ele podemos fazer qualquer procedimento sql chamando o método execSQL() desse objeto, agora podemos criar nosso crude  utilizando essa conexão, porém ainda temos um problema com a nossa foreign key pois mesmo com a nossa implementação no create table ela não funcionará, aí você me pergunta porquê? Bem essa é uma resposta fácil, o Android vem por padrão com as foreign keys desativadas , ou seja, você vai precisar ativa-las, mas não se preocupe isso é fácil de resolver, para isso precisamos executar um comando sql para fazer a ativação, vamos aproveitar o código do método acima para que toda vez que retornarmos uma conexão a foreign key já venha ativada, veja o código abaixo.

public SQLiteDatabase getConnection(Context context){
        dbHelper = new DbHelper(context);
        SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase();
        sqLiteDatabase.execSQL("PRAGMA foreign_keys=ON;");
        return sqLiteDatabase;
    }

Agora sim com esse comando sql ativamos a foreign key, como você pode notar chamamos o método execSQL() do objeto sqLiteDatabase e executamos nosso primeiro comando sql, agora tudo que você precisa para criar seu crude é chamar o método getConnection() da classe banco e criar seus inserts , deletes etc. Lembrando que o método que vai deletar categoria lançará uma SQLiteConstraintException se você tentar remover uma categoria que esteja sendo referenciada por um produto. Segue o código completo da classe Banco.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.pds.teste.dao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by Renan on 03/02/2015.
 */
public class Banco {

    private final String BANCO = "banco.db";
    private final int BANCO_VERSAO = 1;
    private DbHelper dbHelper;



    class DbHelper extends SQLiteOpenHelper{


         public DbHelper(Context context) {
             super(context, BANCO, null, BANCO_VERSAO);
         }

         @Override
         public void onCreate(SQLiteDatabase db) {
             db.execSQL("CREATE TABLE IF NOT EXISTS Categoria  (_id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT UNIQUE)");            
             db.execSQL("CREATE TABLE IF NOT EXISTS Produto  (_id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT UNIQUE," +
                     "imagem text,descricao text,Categoria_id INTEGER , FOREIGN KEY(Categoria_id) REFERENCES Categoria(_id))");
             
         }

         @Override
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
             //lista todas as tabelas a serem deletadas no on Upgrade
             String [] tabelas = {"Categoria","Produto","Lista","Lista_produto","Config","Itens_da_lista"};
             for(String table : tabelas){
                 db.execSQL("DROP TABLE IF EXISTS "+table);
                 onCreate(db);
             }

         }
     }

    public SQLiteDatabase getConnection(Context context){
        dbHelper = new DbHelper(context);
        SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase();
        sqLiteDatabase.execSQL("PRAGMA foreign_keys=ON;");
        return sqLiteDatabase;
    }
}