📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados na Especialização em Android Nativo. Recomendado revisar antes de iniciar.
v1.0 — Android Nativo, Java, RelativeLayout, Views XML e Gerador Random
Série Prática Android Clássico — Projeto 1 de 21
- ➡️ P01 (este): Dados RPG 2D Clássico · Java · XML Views · Eventos de Toque
- P01 (3D): Dados RPG 3D · RotateAnimation & Interpoladores
- P01 (Hello World): Ciclo de Vida & ViewBinding em Kotlin
- P02: Jogo da Memória com Cartas PNG & Grid
O Simulador de Dados D20 Clássico é a porta de entrada para a engenharia de software na plataforma Android utilizando a arquitetura de Views declarativas clássicas. O projeto aborda a criação de telas com XML (RelativeLayout e LinearLayout), a vinculação de componentes de interface via findViewById, a manipulação do ciclo de vida da Activity e a reação a eventos de toque do usuário com setOnClickListener.
Todo o código-fonte Android, recursos gráficos e scripts de compilação Gradle estão encapsulados na subpasta canônica mobile-android-xml/:
catalogo_projetos/android_p01_dado_2d/
├── assets/
│ ├── arquitetura_dado_2d.svg
│ └── screenshot_p01.png
├── mobile-android-xml/
│ ├── app/
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── java/br/com/curso/dadosrpg/
│ │ │ │ └── MainActivity.java
│ │ │ ├── res/
│ │ │ │ ├── layout/activity_main.xml
│ │ │ │ └── values/strings.xml
│ │ │ └── AndroidManifest.xml
│ │ └── build.gradle
│ ├── gradle/
│ ├── build.gradle
│ ├── gradlew
│ ├── settings.gradle
│ └── README.md
└── index.md
| ID | Persona | Narrativa da Funcionalidade | Critério de Aceitação Principal | Prioridade |
|---|---|---|---|---|
| US-01 | Jogador de RPG | Quero tocar no botão “Lançar Sorte” para sortear um valor de 1 a 20. | O marcador central é atualizado instantaneamente com o valor sorteado. | Alta |
| US-02 | Jogador de RPG | Quero feedback visual destacado quando tirar 20 (Sucesso Crítico) ou 1 (Falha Crítica). | Alteração da cor do texto ou exibição de mensagem de destaque comemorativa. | Alta |
| US-03 | Mestre de Mesa | Quero que o app abra rapidamente em tela cheia com tema escurecido imersivo. | Inicialização em menos de 1 segundo sem travamentos de tela. | Média |
| US-04 | Desenvolvedor | Quero componentes estruturados em XML desacoplados da lógica Java. | Arquivo activity_main.xml contendo apenas declaração de layout e estilização. |
Média |
| US-05 | Engenheiro de QA | Quero testar se o gerador de números aleatórios respeita estritamente o intervalo [1, 20]. | Bateria de testes unitários validando distribuição e limites estatísticos. | Baixa |
java.util.Random.TextView principal ao disparar o evento de clique.res/values/strings.xml (i18n).flowchart TD
Player([fa:fa-user Jogador de RPG])
subgraph AppDado ["🎲 App Dado D20 (mobile-android-xml)"]
UC01["Visualizar Mesa de Jogo"]
UC02["Tocar em Lançar Sorte"]
UC03["Sortear Valor Aleatório (1 a 20)"]
UC04["Identificar Sucesso/Falha Crítica"]
UC05["Reiniciar Marcador"]
end
Player --> UC01
Player --> UC02
UC02 --> UC03
UC03 --> UC04
Player --> UC05
| ID Requisito | História de Usuário | Artefato de Código | Teste de Aceitação |
|---|---|---|---|
| RF-01 | US-03, US-04 | mobile-android-xml/app/src/main/res/layout/activity_main.xml |
testInflateLayoutNotNull() |
| RF-02 | US-01, US-05 | mobile-android-xml/app/src/main/java/.../MainActivity.java |
testRandomRangeBetween1And20() |
| RF-03 | US-01 | mobile-android-xml/app/src/main/java/.../MainActivity.java |
testButtonClickUpdatesTextView() |
| RF-04 | US-01 | mobile-android-xml/app/src/main/java/.../MainActivity.java |
testDebounceClickEvent() |
| RF-05 | US-01 | mobile-android-xml/app/src/main/res/values/strings.xml |
testInitialPlaceholderString() |
MainActivity.java)📄 mobile-android-xml/app/src/main/java/br/com/curso/dadosrpg/MainActivity.java (arquivo real do projeto)
package br.com.curso.dadosrpg;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
// Componentes da Interface
private TextView txtResultado;
private Button btnRolar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Ligando o Java ao XML (IDs)
txtResultado = findViewById(R.id.txt_resultado);
btnRolar = findViewById(R.id.btn_rolar);
// Ação de Clique do Botão
btnRolar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rolarDado();
}
});
}
/**
* Sorteia um número de 1 a 20 e atualiza a tela
*/
private void rolarDado() {
// Gerador de números aleatórios
Random gerador = new Random();
// Sorteia de 0 a 19 e soma 1 (para ficar de 1 a 20)
int numero = gerador.nextInt(20) + 1;
// Mostra o número no TextView (convertendo int para String)
txtResultado.setText(String.valueOf(numero));
}
}
cd catalogo_projetos/android_p01_dado_2d/mobile-android-xml
./gradlew assembleDebug
./gradlew test
[!TIP] No Android Studio, selecione File > Open e aponte para a pasta
mobile-android-xml/. Selecione um emulador (AVD Pixel com API 33+) e clique em Run (Shift+F10).
| Checkpoint | Meta Técnica | Critério de Aceite | Status |
|---|---|---|---|
| CP-01 | Setup do Android Studio | Projeto importado sem conflitos de Gradle e JDK 17 | PASS ✅ |
| CP-02 | Interface XML Declarativa | Layout activity_main.xml renderizado com preview no Android Studio |
PASS ✅ |
| CP-03 | Eventos de Toque em Java | setOnClickListener dispara o sorteio sem travar a UI thread |
PASS ✅ |
| CP-04 | Validação Estatística | Distribuição de números aleatórios uniforme de 1 a 20 | PASS ✅ |
| CP-05 | Execução em Emulador | App rodando a 60 FPS com testes unitários aprovados | PASS ✅ |