Implementação Prática do Padrão MVP no Android (Parte 3)

Interface de Visualização e Integração com a Activity

A camada View, no padrão MVP, representa a interface do usuário e define os contratos para interações visuais. Sua função principal é expor métodos que permitem atualizações na tela, como limpeza de campos ou exibição de mensagens de resultado. Para isso, criamos uma interface que encapsula as operações esperdaas da UI: ``` public interface ILoginView { void clearFields(); void showLoginResult(boolean success, int statusCode); }


Essa interface será implementada pela Activity responsável por gerenciar o layout e responder aos eventos. Ao fazer isso, a lógica de apresentação permanece isolada da regra de negócio, mantendo a separação de preocupações. A seguir, a Activity principal implementa essa interface e lida com os eventos do usuário: ```
public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {

    private EditText inputUsername;
    private EditText inputPassword;
    private ILoginPresenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        setTitle("Autenticação");

        findViewById(R.id.btn_login).setOnClickListener(this);
        findViewById(R.id.btn_clear).setOnClickListener(this);

        inputUsername = findViewById(R.id.et_username);
        inputPassword = findViewById(R.id.et_password);

        presenter = new LoginPresenterImpl(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_clear:
                presenter.clearInputs();
                break;
            case R.id.btn_login:
                presenter.authenticate(
                    inputUsername.getText().toString(),
                    inputPassword.getText().toString()
                );
                break;
        }
    }

    @Override
    public void clearFields() {
        inputUsername.setText("");
        inputPassword.setText("");
    }

    @Override
    public void showLoginResult(boolean success, int statusCode) {
        String message = "";
        switch (statusCode) {
            case 0:
                // Sucesso sem mensagem adicional
                break;
            case 1:
                message = "Login realizado com sucesso!";
                break;
            case -1:
                message = "Usuário inválido.";
                break;
            case -2:
                message = "Senha incorreta.";
                break;
        }

        if (!message.isEmpty()) {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
        }
    }
}

O layout associado ao formulário de login utiliza um LinearLayout vertical com campos de texto e botões alinhados horizontalmente: ```

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:padding="16dp">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="80dp">

    <EditText
        android:id="@+id/et_username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Nome de usuário"
        android:layout_marginBottom="12dp" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Senha"
        android:inputType="textPassword"
        android:layout_marginBottom="16dp" />
</LinearLayout>

<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="32dp">

    <Button
        android:id="@+id/btn_login"
        android:text="Entrar"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_clear"
        android:text="Limpar"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content" />
</LinearLayout>

Com essa estrutura completa, o padrão MVP está plenamenet implemantado: o modelo (Model) manipula dados, o presenter (Presenter) lida com a lógica de negócios e comunica resultados à view, enquanto a view apenas atualiza a interface conforme solicitado.

Tags: android MVP Presenter view Interface

Publicado em 8-28 18:41