[Lesson17] MVP

MVP架构:

  • Model — 管理资料来源。例如:SharedPreferences、Room、呼叫API
  • View — 显示UI和与使用者互动I,如 Activity、Fragment
  • Presenter — 负责逻辑处理

activity_login:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="evan.chen.app.mvp_pattern.LoginActivity">

    <EditText
        android:id="@+id/login_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:hint="Login Id" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:hint="Password" />

    <Button
        android:id="@+id/logn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Login" />

    <TextView
        android:id="@+id/login_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />
</LinearLayout>

LoginActivty(View):

public class LoginActivity extends AppCompatActivity implements LoginContract.ILoginView  {
    private LoginPresenter presenter;

    private Button loginButton;
    private EditText loginId;
    private EditText password;
    private TextView loginResult;

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

        presenter = new LoginPresenter(this);

        this.loginButton = (Button) this.findViewById(R.id.logn);
        this.loginId = (EditText) findViewById(R.id.login_id);
        this.password = (EditText) findViewById(R.id.password);
        this.loginResult = (TextView) findViewById(R.id.login_result);

        this.loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                presenter.login(loginId.getText().toString(), password.getText().toString());
            }
        });
    }

    @Override
    public void onLoginSuccess(String message) {
        this.loginResult.setText(message);
    }

    @Override
    public void onLoginFail(String message) {
        this.loginResult.setText(message);
        this.password.setText("");
    }
}

LoginContract:

public interface LoginContract {
    interface ILoginView  {
        void onLoginSuccess(String message);

        void onLoginFail(String message);
    }

    interface ILoginPresenter {
        void login(String id, String password);
    }
}

LoginPresenter(Presenter):

public class LoginPresenter implements LoginContract.ILoginPresenter{
    private LoginContract.ILoginView view;

    LoginPresenter(LoginContract.ILoginView view) {
        this.view = view;
    }

    @Override
    public void login(String id, String password) {
        User user = new User();

        boolean isSuccess = user.login(id, password);

        if (isSuccess) {
            view.onLoginSuccess("Incorrect username or password.");
        } else {
            view.onLoginFail("Login success");
        }
    }
}

User(Model):

public class User {
    public boolean login(String id, String password) {
        if ( id.equals("abc") && password.equals("123")) {
            return true;
        } else {
            return false;
        }
    }
}

谢谢大家愿意花时间阅读,小弟弟我在此鞠躬/images/emoticon/emoticon41.gif


<<:  入门魔法 - ES6 箭头函式写法

>>:  Day20: EventEmitter

Day 27:Blazor x Chart.js

Chart.js是一款open source的图表制作library,支援多种图表,包括Pie ch...

威胁猎捕篇(Cyber Threat Hunting)

Cyber Threat Hunting,应该是可以翻译威胁猎捕或是威胁狩猎、内部入侵行为分析吧。 ...

C# rename多个档案名称(再见小叮当)

很呆的小练习,但就练习噜,多练习多熟悉. 有一个需求,想把档案字眼换掉,但档案很多,懒得一个一个手动...

Day28 - TimePickerDialog

一般来说日期、时间几乎都同时出现 既然昨天学了Android的日期交谈视窗 今天就来学时间的交谈视窗...

Day 15 - 用 useReducer 取代 useState !?

如果有错误,欢迎留言指教~ Q_Q 上篇提到,如何取得更新後的 state useReducer ...