首页 > 解决方案 > 在我的情况下如何正确分离 MVVM 代码?

问题描述

我刚开始学习 MVVM,但我遇到了一些代码问题。如何正确分离 View 和 ViewModel 之间的这种代码?

我也对来自 MVP 的 Presenter 和来自 MVVM 的 ViewModel 之间的差异有疑问。这两个类之间的主要区别是交流还是其他?它似乎是一样的,但我很困惑。

public class TaskFragment extends Fragment {

private static final String TAG = "TaskFragment";

@Nullable
@BindView(R.id.floating_button) FloatingActionButton floatingButton;
@BindView(R.id.date_text) TextView dateText;
@BindView(R.id.time_text) TextView timeText;
@BindView(R.id.title_text) TextView titleText;
@BindView(R.id.save_button) Button saveButton;

private DatePickerDialog.OnDateSetListener mDateSetListener;
private TimePickerDialog.OnTimeSetListener mTimeSetListener;

Realm realm;
RealmHelper realmHelper;

String mText, mDate, mTime;


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.task_fragment, container, false);

    ButterKnife.bind(this, view);
    ((MainActivity) getActivity()).hideFloatingActionButton();


    realmHelper = new RealmHelper(realm);
    Realm.init(getActivity());
    RealmConfiguration configuration = new RealmConfiguration
            .Builder()
            .deleteRealmIfMigrationNeeded()
            .build();
    realm = Realm.getInstance(configuration);

    mDateSetListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
            month = month + 1;
            Log.d(TAG, "onDataSet: dd/mm/yyyy: " + year + "/" + month + "/" + dayOfMonth);
            String date = dayOfMonth + "/" + month + "/" + year;
            dateText.setText(date);
        }
    };

    mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            Log.d(TAG, "onTimeSet: hh/mm: " + hourOfDay + "/" + minute);
            String time = hourOfDay + ":" + minute;
            timeText.setText(time);
        }
    };

    return view;

}


@OnClick(R.id.date_text)
public void onClickDate() {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DAY_OF_MONTH);

    DatePickerDialog dialog = new DatePickerDialog(getActivity(), android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener,
            year, month, day);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.show();
}


@OnClick(R.id.time_text)
public void onClickTime() {
    Calendar calendar = Calendar.getInstance();
    int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
    int minute = calendar.get(Calendar.MINUTE);

    TimePickerDialog dialog = new TimePickerDialog(getActivity(), android.R.style.Theme_Holo_Light_Dialog_MinWidth, mTimeSetListener,
            hourOfDay, minute, DateFormat.is24HourFormat(getActivity()));
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.show();
}


@OnClick(R.id.save_button)
public void onClickSave() {
    mText = titleText.getText().toString();
    mDate = dateText.getText().toString();
    mTime = timeText.getText().toString();

    Task task = new Task();
    task.setText(mText);
    task.setDate(mDate);
    task.setTime(mTime);

    Log.d(TAG, "ON_CLICK_SAVE" + " / " + mText + " / " + mDate + " / " + mTime + " / " + getId());

    realmHelper = new RealmHelper(realm);
    realmHelper.saveTask(task);


    if(!mText.isEmpty() && !mDate.isEmpty() && !mTime.isEmpty()) {

        Toast.makeText(getActivity(), "Task added", Toast.LENGTH_LONG).show();
    }
    else {
        Toast.makeText(getActivity(), "Fields are empty", Toast.LENGTH_LONG).show();
    }

    titleText.setText("");
    dateText.setText("");
    timeText.setText("");
}


@Override
public void onDestroyView() {
    realm.close();
    super.onDestroyView();
}

}

标签: androidmvvm

解决方案


这看起来像合法的 View 类。我不知道 RealmConfiguration 是什么,所以也许可以将其移至 ViewModel。基本上 ViewModel 负责访问 Model 中的逻辑/业务流程的所有接口。View 仅对 ViewModel 更改做出反应。在这里,您可以通过 ViewModelProviders 将您的数据从 textViews 传递到 ViewModel。


推荐阅读