segunda-feira, 18 de janeiro de 2016

Android: Usando Cronometro

Cronometro no Android:


   Para demonstrar o uso de um cronometro no Android, resolvi codificar o sorteio de um número entre 1 e 60:
   O Android disponibiliza a classe CountDownTimer que é a classe que iremos utilizar para programar o cronometro. Criei uma classe interna chamada Cronometro que deriva da classe CountDownTimer.
   Basta implementar dois métodos: 
   O construtor, onde passamos quanto será o tempo total do cronometro e de quanto em quanto tempo o temporizador executará a ação.
   O método Tick, método onde ação será executada.
   No caso coloquei para o tempo total ser de 5 segundos e de segundo em segundo sorteio  um número e exibo na tela.
   Na tela coloquei um botão e uma TextView para exibir os números sorteados.
   Quando o usuário apertar o botão começar começa a disparar o cronômetro, parando 5 segundo depois com o número sorteado.
   Para sortear utilizei a classe Random.
   Coloquei o limite para ir até 60 no método: gerador.nextInt(61);
   O código da classe Principal está logo a seguir:

   

package br.com.nav.blog;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Random;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {


    private Button btnCron;
    private Cronometro cron = new Cronometro(5000,100);
    private TextView txtNumero;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Tratando os campos da tela        btnCron = (Button) findViewById(R.id.btnContagem);
        btnCron.setOnClickListener(this);
        txtNumero = (TextView) findViewById(R.id.txtNumero);
    }


    @Override    public void onClick(View v) {
        cron.start();
    }

    private  class Cronometro extends CountDownTimer {
 public Cronometro(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
}

  public void onTick(long millisUntilFinished) {
            Random gerador = new Random();
            int numero = gerador.nextInt(61);
            txtNumero.setText(String.valueOf(numero));

        }

    }
}



quinta-feira, 24 de dezembro de 2015

Primeiro APP na Google Play: Tá Ligado? e problemas na publicação na google store

Primeiro APP na Google Play: Tá Ligado? e problemas na publicação na google store   

   Comecei meu teste de publicação no Google Store fazendo dois aplicativos: Um de programação de cinema no meu estado e outro um Quiz sobre a saga Harry Potter.
   Fiz uma app de perguntas e respostas sobre os filmes da saga de Harry Potter a pedido de minha filha. Pesquisando na própria Google play Store, percebi vários Quiz em inglês sobre a franquia e não achei que fosse problema fazê-lo em português.
   Acontece que depois de algumas versões do app recebi um e-mail do Google suspendendo o aplicativo por ferir as regras de direitos autorais.
   Resolvi contestar, citando que haviam n outros aplicativos que faziam o mesmo, mas mesmo assim não tive minha defesa aceita, pois para eles, independentemente do que os outros tenham feito, eu estava errado.
   Depois desta rasteira resolvi ler com calma as regras de publicação das apps do Google e fica aqui um resumo do que assimilei:

  1. Apesar de existirem diversas aplicações que notadamente não pertencem aos donos dos personagens, você não pode utilizar personagens dos outros e citá-los na descrição do seu app. O Google considera que você está tentando enganar os usuários, mesmo que você diga que a aplicação é não-oficial.
  2. No aplicativo de cinemas eu redirecionava para os sites dos cinemas do meu estado, o que também não é permitido pelas regras do Google, pois eu estaria tentando enganar os usuários.
  3. Você não pode utilizar marcas, fotos ou figuras sem autorização do proprietário
   Devido a isto resolvi retirar o app do cinema, mesmo não tendo sido advertido, pois se você tiver dois aplicativos suspensos pode ter sua conta de desenvolvedor cancelada.
   Para não perder o trabalho que tive em fazer o app, reformulei a mesma e criei o app "Tá ligado". Refiz com rapidez , retirei as referências ao Harry Potter e qualquer outro personagem e fiz questões sobre filmes e quadrinhos.
   Segue o link para quem se interessar em testar e quiser sugerir modificações: https://play.google.com/store/apps/details?id=br.com.nav.taligado

   
   


sexta-feira, 30 de outubro de 2015

Android: Passando dados entre as telas

  Hoje falarei de uma das formas de se enviar conteúdos de uma tela a outra.
  O exemplo que fiz foi bem simples, coloquei uma caixa de texto em uma tela e um botão. Na outra apenas um TextView. O texto digitado na primeira tela será recebido pela segunda tela e exibido no TextView.
   As telas ficaram assim:
   


   O código ficou bem simples. Vou me ater as classes java, já que criar as duas telas é muito simples utilizando o xml:
   Classe Main:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText edtNome;
private Button btnEnviar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Tratando os campos da tela
edtNome = (EditText) findViewById(R.id.edtNome);
btnEnviar = (Button) findViewById(R.id.btnEnviar);
btnEnviar.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,NovaTela.class);
intent.putExtra("Nome",edtNome.getEditableText().toString());
startActivity(intent);
}
}

   Primeira coisa a observar: A classe implementa a interface    View.OnClickListener. Esta é uma forma de se capturar o click do botão.
   No método OnClick fica o código que será executado quando o botão for clicado.
   Utilizamos a classe Intent e seu método putExtra. É através dele que transferimos conteúdo entre telas. Percebam que criamos uma chave chamada "Nome" e pegamos o conteúdo do edtNome, variável que represente o campo da tela.
   Na próxima classe, NovaTela.class teremos que preparar o tereeno para que ela receba o conteúdo passado.

   Classe Nova Tela:
  
public class NovaTela extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_nova_tela);
TextView texto = (TextView) findViewById(R.id.txtSaudacao);
Bundle extras = getIntent().getExtras();
if (extras!= null) {
texto.setText("Texto Digitado:" + extras.getString("Nome"));
}
}
}
   O importante aqui é observar este trecho de código:
   Bundle extras = getIntent().getExtras();
   O método getIntent recupera a intent que chamou a tela atual.
   O método getExtras retorna um map com todos os extras da intent.
   A classe Bundle implementa um map de Strings.
   Depois verificamos se existe algum estra e se existir pegamos o com a chave nome e mostramos Textview da tela:
if (extras!= null) {
texto.setText("Texto Digitado:" + extras.getString("Nome"));
}

  Última dica, se fosse preciso propagar o conteúdo para uma terceira tela teríamos que fazer a mesma coisa, ou seja a passagem só funciona tela a tela.