서문
모델: 데이터 로직 담당
보기: 보기 로직을 담당합니다.
컨트롤러: 비즈니스 로직 담당
관계 유지:
1、보기가 컨트롤러를 보유합니다.
2, 컨트롤러 보유 모델
3, 모델 홀드 보기
보조 도구: 뷰 바인딩
실행 프로세스: 뷰 ==> 컨트롤러 ==> 모델 ==> 뷰
케이스 렌더링:
컨트롤러 인터페이스는 다음과 같은 방식으로 정의됩니다.
/**
* 비즈니스 로직을 담당하는 컨트롤러 인터페이스
*/
public interface IController extends IBaseController {
void setModel(IModel model); // 모델 보유
/**
* 이들은 모두 뷰에서 호출되는 메소드입니다.
*/
void onDataChanged(String data); // 입력 텍스트 이벤트를 수신하고 모델에 알리기
void submitFrom(); // 양식 이벤트 제출, 모델 알림
void clearData(); // 버튼 클릭 이벤트 지우기, 모델 알림
}
컨트롤러 인터페이스는 다음과 같은 방식으로 구현됩니다. - 컨트롤러 인터페이스는 컨트롤러 인터페이스와 동일한 방식으로 구현됩니다.
/**
* 비즈니스 로직 구현
*/
public class IControllerImp implements IController {
private IModel model;
@Override
public void setModel(IModel model) {
this.model = model;
}
@Override
public void removeHandlerMsgAndCallback() {
model.removeHandlerMsgAndCallback();
}
@Override
public void onDataChanged(String data) {
model.onDataChanged(data);
}
@Override
public void submitFrom() {
model.submitFromData();
}
@Override
public void clearData() {
model.clearData();
}
}
모델 인터페이스를 정의합니다.
/**
* 데이터 로직을 담당하는 데이터 모델 인터페이스
*/
public interface IModel extends IBaseModel {
void setView(IView view); // 뷰 유지
/**
* 이들은 모두 컨트롤러가 호출하는 메서드입니다.
*/
void onDataChanged(String data); // 텍스트 변경 사항을 듣고, 수시로 데이터를 업데이트한 다음 뷰에 알립니다.
void submitFromData(); // 양식 데이터를 제출한 후 뷰에 알립니다.
void clearData(); // 데이터가 지워질 때 뷰에 알리기
}
모델 인터페이스는 다음과 같은 방식으로 구현됩니다. (1) 모델 인터페이스는 모델 인터페이스와 동일한 방식으로 구현됩니다.
/**
* 데이터 모델 로직 구현
*/
public class IModelImp implements IModel {
private String mData = "";
private Handler handler = new Handler();
private IView iview;
@Override
public void setView(IView view) {
this.iview = view;
}
@Override
public void removeHandlerMsgAndCallback() {
handler.removeCallbacksAndMessages(null);
}
@Override
public void onDataChanged(String data) {
mData = data;
iview.onDataChangedUpdateText(data);
}
@Override
public void submitFromData() {
iview.showSubmitFromLoading(mData);
handler.removeCallbacksAndMessages(null);
handler.postDelayed(new Runnable() {
@Override
public void run() {
iview.hideSubmitFromLoading();
}
}, 1500);
}
@Override
public void clearData() {
mData = "";
iview.clearFromData();
}
}
보기 인터페이스를 정의합니다.
/**
* 뷰 인터페이스 뷰 로직 담당
*/
public interface IView extends IBaseView {
default void setController(IController controller) {} // 컨트롤러를 잡고 뷰 이벤트를 기반으로 컨트롤러에 알림을 보냅니다.
/**
* 이들은 모두 모델에 의해 호출되는 메서드입니다.
*/
void onDataChangedUpdateText(String data); // 시간별 데이터를 기반으로 TextView 업데이트하기
void showSubmitFromLoading(String data); // 로딩 표시
void hideSubmitFromLoading(); // 로딩 숨기기
void clearFromData(); // 편집 텍스트 데이터 지우기
}
보기 인터페이스는 다음과 같은 방식으로 구현됩니다. - 보기 인터페이스는 보기 인터페이스와 동일한 방식으로 구현됩니다.
/**
* 로직 구현 보기
*/
public class MVCActivity extends AppCompatActivity implements IView,View.OnClickListener {
private IModel iModel; // 데이터 레이어 M
private IController iController; // 컨트롤러 레이어 C
private AlertDialog dialog;
private ActivityMvcBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMvcBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
iModel = new IModelImp();
iController = new IControllerImp();
// 작성 순서에 유의하세요.
iModel.setView(this); // 뷰 유지
iController.setModel(iModel); // 모델 보유
setController(iController); // 홀딩 컨트롤러
init();
}
@Override
public void onClick(View v) {
if (v == binding.submitBtn) {
iController.submitFrom();
} else if (v == binding.clearBtn) {
iController.clearData();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
iController.removeHandlerMsgAndCallback();
}
private void init() {
binding.editMsg.setText("normal");
binding.edit.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
iController.onDataChanged(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
binding.submitBtn.setOnClickListener(this);
binding.clearBtn.setOnClickListener(this);
}
@Override
public void onDataChangedUpdateText(String data) {
binding.editMsg.setText(data);
}
@Override
public void showSubmitFromLoading(String data) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
TextView textView = new TextView(this);
if (TextUtils.isEmpty(data)) {
data = "normal";
}
textView.setText("제출 중:"+ data);
builder.setCancelable(false);
builder.setView(textView);
dialog = builder.show();
}
@Override
public void hideSubmitFromLoading() {
dialog.dismiss();
}
@Override
public void clearFromData() {
binding.edit.setText("");
binding.editMsg.setText("normal");
}
}
IBaseController
/**
* Base 비즈니스 로직을 담당하는 컨트롤러 인터페이스
*/
public interface IBaseController {
// 일반적인 또는 일반적인 메소드를 확장하기 위한 몇 가지 방법을 작성하세요.
default void removeHandlerMsgAndCallback() {} // 핸들러 콜백 및 메시지 제거하기
}
IBaseModel
/**
* Base 데이터 로직을 담당하는 데이터 모델 인터페이스
*/
public interface IBaseModel {
// 일반적인 또는 일반적인 메소드를 확장하기 위한 몇 가지 방법을 작성하세요.
default void removeHandlerMsgAndCallback() {} // 핸들러 콜백 및 메시지 제거하기
}
IBaseView
/**
* Base 뷰 인터페이스 뷰 로직 담당
*/
public interface IBaseView {
// 일반적인 또는 일반적인 메소드를 확장하기 위한 몇 가지 방법을 작성하세요.
default void testBaseView() {}
}
, activity_mvc.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://..com/apk/res/android"
xmlns:app="http://..com/apk/res-auto"
xmlns:tools="http://..com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.activity.MVCActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="48dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/material_dynamic_primary90"
app:title="MVC" />
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginHorizontal="16dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar" />
<TextView
android:id="@+id/edit_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintLeft_toLeftOf="@id/edit"
app:layout_constraintTop_toBottomOf="@id/edit" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/submit_btn"
android:layout_width="match_parent"
android:layout_height="58dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:text="submit"
android:textAllCaps="false"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/edit_msg" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/clear_btn"
android:layout_width="match_parent"
android:layout_height="58dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:text="clear"
android:textAllCaps="false"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/submit_btn" />
</androidx.constraintlayout.widget.ConstraintLayout>
, 소스 주소
기타 글쓰기 스타일
- Android MVP
- Android MVVM





