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