Aprenda Android

  • Página Inicial
  • Contato!
  • Tudo sobre Android Parte 1!
  • Tudo sobre Android Parte 2!
  • Tudo sobre Android Parte 3!
  • Tudo sobre Android Parte 4!
  • Tudo sobre Android Parte 1

    Criando Primeiro Projeto

    Para criar um novo projeto Android, cliquem em New Project, escolha Empty Activity, coloque o nome do aplicativo, se necessário coloque o nome do pacote, onde será salvo, escolha Java como linguagem e o Android mínimo que rodará o aplicativo. Espere os arquivos serem gerados, isso demora um pouco.

    PS: Nas versões mais recentes do Android Studio, escolha Empty Views Activity ao inves de Empty Activity, escolha a opção Java na Linguagem e em Build Configuration Languagem, escolha Groovy DSL.

    Dentro da pasta app, tem a pasta java, onde encontra-se os pacotes e o arquivo Java, com o nome MainActivity. Dentro da pasta res, em layout, está o XML que é o "desenho" do aplicativo. Clicando nesse arquivo XML, podemos inserir componentes dele, os pegando em Pallete. Em cima onde estar AppTheme podemos mudar essa opção para NoActionBar para mudar o layout. Clique em mais temas e escolha a opção LightNoTitleBar para retirar a barra verde.

    Caso use Constraint Layout, clique no elemento (button, textView, etc.), e vá em Center para centralizar ele verticalmente e horizontalmente. Na paleta podemos organizar o layout.

    Lembrando que devemos ter um celular no emulador já instalado. Ao clicar no play, ele abrirá o emulador e executará o app nele.

    Para gerar o APK de debug, basta clicar no martelinho, ele estará localizado em app > build > outputs > apk > debug.

    Para gerar o APK, clique em Build e Make Project. Para gerar o APK assinado para colocar na Play Store, vai em Build e Generated Signed Builder/APK, escolha APK caso não queira colocar no Play Store. O arquivo estará em app/release.

    Crie uma chave em Key Store Path indicando o caminho onde será salva a chave, e o nome da chave (como upload) e confirme. A chave deverá ser válida por no mínimo 25 anos. Escolha a opção release para gerar o APK e marque a opção Full APK Signature.

    Algumas informações sobre isso vemos aqui: https://developer.android.com/studio/publish/app-signing?hl=pt-br

    Para definir versão dos aplicaticos, abra o arquivo build.gradle (Module) e em versionName defina a versão do APK.

    Podemos criar um programa "Olá Mundo" colocando um label com a id lblMens e um botão com a id btnClick, vamos nas propriedades do botão e colocamos em onclick o nome do evento como "exibir", e no Java colocamos esse código:

    
    public class MainActivity extends AppCompatActivity {
        private TextView lblMens;
        private Button btnClick;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            lblMens = (TextView)findViewById(R.id.lblMens); // Referenciação dos componentes
            btnClick = (Button)findViewById(R.id.btnClick);
        }
    
        public void exibir(View v) { // Nome do evento do botão
            lblMens.setText("Olá Mundo!");
        }
    }
    
    
    

    Não esqueça de importar android.widget.* e android.view.View para os componentes.

    PS: A maioria das classes de pacotes padrões usadas no Java funcionam no Android, mas algumas não funcionam por conter código exclusivamente para aplicações Java desktop, como por exemplo:

    Pacotes e Classes do Java 8
    java.util.Scanner
    java.awt.*
    javax.swing.*
    javafx.*

    No entanto, o Android Studio tem disponíveis vários pacotes exclusivos para implementação de aplicativos.

    PS: Para usar tags HTML num TextView, coloque no setText do elemento a classe Html e o método estático fromHtml, por exemplo lblMens.setText(Html.fromHtml("<b>Olá, Mundo!</b>")) (importe android.text.Html).

    Para mudar a cor do botão, vá em BackgroundTint e mude a cor ali. Para que o estilo padrão não o sobreponha, retire no XML a linha style="@style/Widget.AppCompat.Button" e substitua por style="@style/Widget.MaterialComponents.Button". Para centralizar o TextView, coloque em gravity e em textAligiment center.

    Para ajustar na tela os componentes em ConstraintLayout, deixe o XML assim, no componente desejado:

    
    tools:layout_editor_absoluteX="76dp"
    tools:layout_editor_absoluteY="267dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:layout_marginStart="76dp"
    android:layout_marginTop="267dp"
    
    

    PS: Verifique se não tem algum atributo XML faltando em algum componente, se tiver, corrija eles, clicando na lâmpada e adicionando as correções.

    Inserindo Componentes

    Coloque um botão no nosso projeto, veja que em components podemos ver os componentes inseridos. Vemos que tudo que é inserido aparece no XML (na tag TextView podemos mudar em android:text a frase padrão, por exemplo, ou mudar o texto do botão em Button).

    Em attributes, podemos mudar as propriedades dos componentes. Algumas delas são fontFamily, textStyle, textColor, textSize, etc.

    Para mudar o tamanho de alguns componentes, podemos ir no XML diretamente do atributo do componente e alterá-los, veja um exemplo de alterar tamanho de letra e cor:

    
    android:textColor="#FF0000"
    android:textSize="50sp"
    android:textStyle="bold"
    
    

    Para ocultar a barra de título, vá no ActivityMain.java e coloque essa função dentro da função onCreate:

    
    getSupportActionBar().hide();
    
    

    PS: Nas versões mais recentes do Android Studio, a ToolBar não está vindo como padrão nos aplicativos, mas ela pode ser adicionada como um componente, indo em Containers e Toolbar.

    Se quiser colocar uma imagem no projeto, coloque um ImageView, vá nas propriedades em background, e escolha a imagem, que deverá estar em app > src > main > res > drawable (basta copiar a imagem do disco rígido e colar ela no Android Studio, dentro dessa pasta).

    PS: Caso for adicionar novos pacotes e classes no projeto, salve em app > src > main > java.

    Caso tu queira um campo de texto não editável mas copiável, adicione a propriedade editable como false, remova todo tipo de texto nas opções de inputtype e coloque o textIsSelectable como true e focusable como true.

    Caso queira colocar uma imagem de fundo, coloque as opções wrap_content no width e height caso não queria que ela fique distorcida.

    PS: Para que o aplicativo não "resete" ao girar a tela, adicione no arquivo AndroidManifest.xml, na tag activity, a linha android:configChanges="orientation|screenSize", ficando dessa forma:

    
    <activity android:name=".MainActivity" android:configChanges="orientation|screenSize">
    
    

    Se quiser bloquear totalmente a rotação de tela, em vez do configChanges, adicione setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); no método onCreate, no Java.

    Para o tema do celular (dark ou light) não mudar a cor do aplicativo, selecione o ConstraintLayout ou o LinearLayout em background. Não esqueça também de mudar a cor dos componentes, inclusive da letra em textColor (nem que tenha que editar diretamente no XML).

    Depurando o Projeto Diretamente no Celular

    Primeiro temos que instalar o driver do celular no computador, no celular, em opções do desenvolvedor, marque a opção Depuração USB.

    Ao clicar no play, temos a opção de escolher pra rodar o aplicativo diretamente no celular.

    Mudando Propriedades dos Componentes

    Em res, em mipmap, tem os ícones padrões do programa, clicando nessa pasta, podemos ir em file path para irmos até essa pasta (geralmente é em app > src > main > res). Os nomes são todos ic_launcher e ic_launcher_round.

    Podemos trocar os ícones por outros de mesma resolução, do formato PNG, essas são as resoluções:

    hdpi 72 x 72
    mdpi 48 x 48
    xhdpi 96 x 96
    xxhdpi 144 x 144
    xxxhdpi 192 x 192

    No entanto, para colocarmos ícones personalizados mais facilmente, nós clicamos na pasta res e em Image Asset, e lá colocamos o ícone personalizado do programa, além de ícones de notificação e etc.

    Em values, em strings.xml podemos ver as configurações dos componentes colocados.

    Adicionaremos um plain text e coloque a id txtNome, e um botão com a id btnClick.

    PS: Para os componentes não se sobreporem um no outro, coloque ele dentro de um linearlayout vertical. Podemos colocar spaces para realinhar eles.

    No código Java, alteramos ele assim:

    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.*;
    import android.view.View;
    
    public class MainActivity extends AppCompatActivity {
        private EditText txtNome;
        private Button btnClick;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            txtNome = (EditText)findViewById(R.id.txtNome); // Nome das ids dos objetos
            btnClick = (Button)findViewById(R.id.btnClick);
        }
    }
    
    

    Capturando Texto para String

    Agora, para exibirmos a mensagem, altere o código assim:

    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        txtNome = (EditText)findViewById(R.id.txtNome); // Nome das ids dos objetos
        btnClick = (Button)findViewById(R.id.btnClick);
    
        btnClick.setOnClickListener(new View.OnClickListener() { // Invocado quando o evento é executado
            @Override
            public void onClick(View v) {
                AlertDialog.Builder diag = new AlertDialog.Builder(MainActivity.this);
    
                diag.setMessage(txtNome.getText().toString().trim());
                diag.setNeutralButton("Ok", null); // Cria o botão
                diag.show(); // Exibe o botão
            }
        });
    }
    
    

    PS: Para definir a quantidade máxima de caracteres do edittext, coloque no XML a propriedade android:maxLength="20" com o número desejado. Podemos colocar o parâmetro lines para uma área de texto. No Java, podemos usar o método trim() para remover espaços indesejados, e requestFocus() para focalizar um elemento.

    PS: Podemos também exibir o texto assim:

    
    public void onClick(View v) {
        Toast.makeText(v.getContext(), "Olá, " + txtNome.getText().toString().trim() + "!", Toast.LENGTH_LONG).show();
    }
    
    

    Radio Button

    Para isso, vamos colocar dois radiobuttons com as opções masculino e feminino (ids radMasc e radFem).

    Para apenas um ficar clicável, colocamos um radioGroup e arrastamos os radiobuttons pra dentro dele.

    E no código fazemos assim:

    
    public class MainActivity extends AppCompatActivity {
        private EditText txtNome;
        private Button btnClick;
        private RadioButton radMasc, radFem;
        private String sexo;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            txtNome = (EditText)findViewById(R.id.txtNome); // Nome das ids dos objetos
            btnClick = (Button)findViewById(R.id.btnClick);
            radMasc = (RadioButton)findViewById(R.id.radMasc);
            radFem = (RadioButton)findViewById(R.id.radFem);
    
    
            btnClick.setOnClickListener(new View.OnClickListener() { // Invocado quando o evento é executado
                @Override
                public void onClick(View v) {
                    AlertDialog.Builder diag = new AlertDialog.Builder(MainActivity.this);
    
                    if(radMasc.isChecked()) {
                        sexo = "Masculino";
                    }
                    else if(radFem.isChecked()) {
                        sexo = "Feminino";
                    }
    
                    diag.setMessage(txtNome.getText().toString().trim() + "\n" + sexo);
                    diag.setNeutralButton("Ok", null); // Cria o botão
                    diag.show(); // Exibe o botão
                }
            });
        }
    }
    
    

    PS: Podemos alterar a orientação dos botões pra horizontal, colocando essa opção nas propriedades do RadioGroup.

    Campo Numérico

    Para colocarmos um campo numérico, colocamos um text do tipo Number para a idade, com um label indicando a mesma, e o Number terá a id numId.

    Para capturar a idade, basta fazer assim:

    
    public class MainActivity extends AppCompatActivity {
        private EditText txtNome;
        private Button btnClick;
        private EditText numId;
        private RadioButton radMasc, radFem;
        private int idade;
        private String sexo;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            txtNome = (EditText)findViewById(R.id.txtNome); // Nome das ids dos objetos
            btnClick = (Button)findViewById(R.id.btnClick);
            radMasc = (RadioButton)findViewById(R.id.radMasc);
            radFem = (RadioButton)findViewById(R.id.radFem);
            numId = (EditText)findViewById(R.id.numId);
    
            btnClick.setOnClickListener(new View.OnClickListener() { // Invocado quando o evento é executado
                @Override
                public void onClick(View v) {
                    AlertDialog.Builder diag = new AlertDialog.Builder(MainActivity.this);
    
                    if(radMasc.isChecked()) {
                        sexo = "Masculino";
                    }
                    else if(radFem.isChecked()) {
                        sexo = "Feminino";
                    }
    
                    idade = Integer.parseInt(numId.getText().toString().trim());
    
                    diag.setMessage(txtNome.getText().toString().trim() + "\nIdade: " + idade + "\n" + sexo);
                    diag.setNeutralButton("Ok", null); // Cria o botão
                    diag.show(); // Exibe o botão
                }
            });
        }
    }
    
    

    Para definir os valores mínimos e máximo de um number, coloque esse método no Java, com os mínimo e máximo desejados:

    
    EditText numId = (EditText)findViewById(R.id.numId);
    
    numId.setFilters(new InputFilter[]{new FiltroNumeros(0, 110)});
    
    

    Só que pra usar ele precisaremos criar uma classe pra isso, e importar ela pro nosso projeto, cujo código você baixa clicando aqui!

    PS: Podemos criar um operador ternário pra evitar erros com campos numéricos vazios:

    
    idade = !numId.getText().toString().trim().equals("") ? Integer.parseInt(numId.getText().toString().trim()) : 0;
    
    

    Podemos também, ao invés do operador ternário, colocar as variáveis dentro de um try catch com exceção NumberFormatException, assim:

    
    try {
        idade = Integer.parseInt(numId.getText().toString().trim());
        
    }
    catch(NumberFormatException ex) {
        txtRes.setText("Foram inseridos valores não válidos!");
    }
    
    

    Para ele permitir números negativos, marque nas opções do InputType o NumberSigned, e o NumberDecimal é para números reais.

    Checkbox

    Da mesma forma que o radiobutton, podemos pegar dados do checkbox, já que ambos tem praticamente as mesmas propriedades.

    No Java podemos colocar o código assim:

    
    public class MainActivity extends AppCompatActivity {
        private EditText txtNome;
        private Button btnClick;
        private EditText numId;
        private RadioButton radMasc, radFem;
        private int idade;
        private String sexo;
        private CheckBox chProg, chRed, chHard;
        private static String conhe = "";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            txtNome = (EditText)findViewById(R.id.txtNome); // Nome das ids dos objetos
            btnClick = (Button)findViewById(R.id.btnClick);
            radMasc = (RadioButton)findViewById(R.id.radMasc);
            radFem = (RadioButton)findViewById(R.id.radFem);
            numId = (EditText)findViewById(R.id.numId);
            chProg = (CheckBox)findViewById(R.id.chProg);
            chRed = (CheckBox)findViewById(R.id.chRed);
            chHard = (CheckBox)findViewById(R.id.chHard);
    
            btnClick.setOnClickListener(new View.OnClickListener() { // Invocado quando o evento é executado
                @Override
                public void onClick(View v) {
                    AlertDialog.Builder diag = new AlertDialog.Builder(MainActivity.this);
    
                    if(radMasc.isChecked()) {
                        sexo = "Masculino";
                    }
                    else if(radFem.isChecked()) {
                        sexo = "Feminino";
                    }
    
                    idade = Integer.parseInt(numId.getText().toString().trim());
    
                    if(chProg.isChecked()) {
                        conhe += "\n";
                        conhe += chProg.getText().toString();
                    }
        
                    // Outro condicional:
    
                    if(chRed.isChecked()) {
                        conhe += "\n";
                        conhe += chRed.getText().toString();
                    }
    
    	            // Outro condicional:
    
                    if(chHard.isChecked()) {
                        conhe += "\n";
                        conhe += chHard.getText().toString();
                    }
    
                    diag.setMessage(txtNome.getText().toString().trim() + "\nIdade: " + idade + "\n" + sexo + "\nConhecimentos:\n" + conhe);
                    diag.setNeutralButton("Ok", null); // Cria o botão
                    diag.show(); // Exibe o botão
    
                    conhe = ""; // Isso limpa a variável
                }
            });
        }
    }