blog

안드로이드 MVC 작성

서문: 모델: 데이터 로직을 담당 뷰: 뷰 로직을 담당 비즈니스 로직을 담당 홀딩 관계: 1, 뷰 홀드 2, 홀드 모델 3, 모드...

Oct 28, 2025 · 6 min. read
シェア

서문

모델: 데이터 로직 담당

보기: 보기 로직을 담당합니다.

컨트롤러: 비즈니스 로직 담당



관계 유지:

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
Read next

지터버그 자동 리드에 AI 인텔리전스를 사용하는 방법 #SpiderPool SEO

AI 기술은 자동화된 셰이크올로지 리드 생성을 위한 다양한 애플리케이션을 제공합니다. 우선, AI 디지털 인력을 사용하여 지에인 동영상을 제작하면 제작 시간을 크게 절약할 수 있을 뿐만 아니라 대상 고객의 선호도와 행동 패턴에 따라 콘텐츠 제작을 개인화하여 매력과 전파 효과를 향상시킬 수 있습니다.

Oct 28, 2025 · 1 min read