📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados na Especialização em Android Nativo. Recomendado revisar antes de iniciar.

🎲 P01: Guia Passo a Passo - Dados RPG (D20 Clássico)

v1.0 — Android Nativo, Java, RelativeLayout, Views XML e Gerador Random

Série Prática Android Clássico — Projeto 1 de 21


🏛️ Visão Geral & Arquitetura Visual

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.

Arquitetura do Dado RPG D20 Clássico
Interface do Dado D20 em Execução

📁 Estrutura de Pastas Anti-Colisão

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

🧑‍💼 Engenharia de Software & Especificação Formal

1. Histórias de Usuário (User Stories)

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

2. Requisitos do Sistema

Requisitos Funcionais (RF)

Requisitos Não-Funcionais (RNF)


3. Diagrama de Casos de Uso

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

4. Matriz de Rastreabilidade (RTM)

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()

🛠️ Implementação Guiada (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));
    }
}

🚀 Como Executar no Laboratório

1. Navegue até a subpasta do projeto

cd catalogo_projetos/android_p01_dado_2d/mobile-android-xml

2. Compile e execute via Gradle Wrapper

./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).


🏁 Matriz de Checkpoints de Conclusão

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 ✅