2016-11-07 7 views
0

Я решаю узнать о шаблоне MVP и просмотрев некоторые статьи, которые я хочу попробовать с помощью моего текущего проекта.Как правильно применить шаблон MVP в моем примере

Я выбрал одно действие и начал думать, как я могу отделить его от правил MVP. И в конце концов я не знаю, как это сделать. Мне кажется, что это не сложная деятельность, но я не знаю

Может ли кто-нибудь посоветовать мне, с чего мне начать?

Какие методы должны быть в презентаторе, вид ведьмы должен быть оставлен в этом текущем действии, а методы whitch должны быть в интерфейсе?

Только что посоветовал мне, с кем я должен был начать.

Это мой класс

public final class ActivityUserDataScreen extends AppCompatActivity implements InterfaceActivityUserDataScreen{ 

private static String gender; 
private static int inputHeight; 
private static int inputWeight; 
private TextInputLayout tilUserName; 
private int backPressedQ = 0; 
private String avatarName; 

private static final String MEN = "men"; 
private static final String WOMEN = "men"; 

private Context context; 
private PresenterActivityUserDataScreen presenter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Fabric.with(this, new Crashlytics()); 
    setContentView(R.layout.activity_user_data_screen); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setSupportActionBar((Toolbar) findViewById(R.id.tool_bar)); 

    context = getApplicationContext(); 
    initNumberPicker(); 
    initVar(); 
    presenter = new PresenterActivityUserDataScreen(this); 
} 

private void initNumberPicker() { 
    NumberPicker pickerHeight = (NumberPicker) findViewById(R.id.pickerHeight); 
    UtilClass.setDividerColor(pickerHeight, UtilClass.getMyColor(context, R.color.ntz_color_yellow)); 
    pickerHeight.setOnValueChangedListener(changeListener); 
    pickerHeight.setMaxValue(220); 
    pickerHeight.setMinValue(130); 
    pickerHeight.setValue(States.HEIGHT_DEFAULT); 

    NumberPicker pickerWeight = (NumberPicker) findViewById(R.id.pickerWeight); 
    UtilClass.setDividerColor(pickerWeight, UtilClass.getMyColor(context, R.color.ntz_color_yellow)); 
    pickerWeight.setOnValueChangedListener(changeListener); 
    pickerWeight.setMaxValue(120); 
    pickerWeight.setMinValue(35); 
    pickerWeight.setValue(States.WEIGHT_DEFAULT); 
} 

private void initVar() { 
    tilUserName = (TextInputLayout) findViewById(R.id.tilUserName); 

    SwitchButton switchButton = (SwitchButton) findViewById(R.id.sb_custom); 
    switchButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked){ 
       gender = WOMEN; 
      }else { 
       gender = MEN; 
      } 
     } 
    }); 

    EditText etAvatarName = (EditText) findViewById(R.id.etAvatarName); 
    etAvatarName.setText(getResources().getString(R.string.avatar)); 
} 

private NumberPicker.OnValueChangeListener changeListener = new NumberPicker.OnValueChangeListener() { 
    @Override 
    public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 
     switch (picker.getId()) { 
      case R.id.pickerHeight: 
       inputHeight = newVal; 
       break; 
      case R.id.pickerWeight: 
       inputWeight = newVal; 
       break; 
     } 
    } 
}; 

@Override 
public final void onBackPressed() { 
    UtilClass.processClick(context); 

    if (backPressedQ == 1) { 
     backPressedQ = 0; 
     super.onBackPressed(); 
     overridePendingTransition(R.anim.open_main, R.anim.close_next); 

    } else { 
     backPressedQ++; 
     Toast.makeText(this, "Press again to exit", Toast.LENGTH_SHORT).show(); 
    } 

    //Обнуление счётчика через 5 секунд 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      backPressedQ = 0; 
     } 
    }, 5000); 
} 

public final void goNext(View view) { 
    UtilClass.processClick(context); 
    EditText editText = tilUserName.getEditText(); 
    Editable editable = null; 
    if (editText != null) { 
     editable = editText.getText(); 
    } 
    if (editable != null) { 
     avatarName = editable.toString(); 
    } 
    if (!isValidAvatarName()) return; 

    saveUserData(); 
    MetadataSaver saver = new MetadataSaver(context); 
    saver.saveFirstUserInfo(); 
    saver.saveDeviceInfo(); 
    PreferencesHelper.savePref(context, States.STILL_NOT_FINISH, true); 
    UtilClass.goToNextActivity(ActivityUserDataScreen.this, ActivityVideo.class); 
} 

private void saveUserData(){ 
    saveAvatarGender(); 
    saveAvatarHeight(); 
    saveAvatarWeight(); 
    saveAvatarName(); 
} 

private void saveAvatarGender(){ 
    if (gender == null){ 
     gender = MEN; 
    } 
    PreferencesHelper.savePref(context, States.AVATAR_GENDER, gender); 
} 

private boolean isValidAvatarName() { 
    if (UtilClass.isTextEmpty(avatarName)) { 
     tilUserName.setErrorEnabled(true); 
     tilUserName.setError(getResources().getString(R.string.fill_your_avatar_name)); 
     return false; 
    } 

    if (avatarName.contains(" ")) { 
     avatarName = avatarName.replace(" ", ""); 
    } 

    if (!UtilClass.isLatinAlphabet(avatarName)) { 
     tilUserName.setErrorEnabled(true); 
     tilUserName.setError(getResources().getString(R.string.avatar_name_in_english)); 
     return false; 
    } 

    if (!UtilClass.isNameFree(context, avatarName)) { 
     tilUserName.setErrorEnabled(true); 
     tilUserName.setError(getResources().getString(R.string.avatar_name_already_in_use)); 
     return false; 
    } 

    return true; 
} 

private void saveAvatarHeight() { 
    int result; 
    if (inputHeight == 0) { 
     result = States.HEIGHT_DEFAULT; 
    } else { 
     result = inputHeight; 
    } 

    PreferencesHelper.savePref(context, States.AVATAR_HEIGHT, result); 
} 

private void saveAvatarWeight() { 
    int result; 
    if (inputWeight == 0) { 
     result = States.WEIGHT_DEFAULT; 
    } else { 
     result = inputWeight; 
    } 
    PreferencesHelper.savePref(context, States.AVATAR_WEIGHT, result); 
} 

private void saveAvatarName() { 
    PreferencesHelper.savePref(context, States.AVATAR_NAME, avatarName); 
} 

public final void switchManWoman(View view) { 
    UtilClass.processClick(context); 
} 
} 

Заранее спасибо!

+0

Настоящая причина, по которой MVP была введена, заключалась в том, чтобы улучшить тестируемость.Эта ссылка поможет вам правильно понять MVP: https://codelabs.developers.google.com/codelabs/android-testing/ –

+0

Используя этот образец репозитория, вы можете узнать больше о смеси MVP с кинжалом: http: // github. com/mmirhoseini/marvel –

ответ

1

Вещи, которые следует принимать во внимание, являются:

  • мнение должно быть немым, как это возможно. Подумайте об этом как исполнитель команд, предоставленных ведущим, и репортер для ведущего всего, что произошло в пользовательском интерфейсе. Интерфейс должен предоставлять такие методы, как «отображение этого текста» и/или вызов методов презентатора, таких как «нажата кнопка».

  • Ведущий - это команда. Он управляет вашим взглядом и реагирует на входные данные, исходящие из самого представления. В идеале, он должен абстрагироваться от всего, что связано с Android, таким образом, вы можете протестировать поведение в тестах ванили.

+0

Извините, я забыл приложить свой текущий класс. Добавлено на вопрос –

+0

совет мне, пожалуйста, где я должен инициализировать var? Например, у меня есть индикатор выполнения и, по крайней мере, мне нужно найти его 'findViewById()' и 'setProgress (0)' и 'setMax (100)', где я должен это делать? В презентаторе или в представлении? потому что, поскольку я понял init, я должен был сделать это, но вызывать метод с установленным значением, я должен из презентатора ... Более того, мне нужно 'findViewById()' делать, но задавать начальное значение 'setProgress (0)' и 'setMax (100) «Должен ли я из ведущего, да? –

1

Google опубликовал a collection of samples для обсуждения и демонстрации различных архитектурных инструментов и шаблонов для Android-приложений.

Для начала очень полезно вам понять how this one works. И приспосабливайтесь к своему образцу.

[...] Этот образец является базой для многих вариантов. Он демонстрирует простую реализацию шаблона Model-View-Presenter без архитектурных фреймворков. Он использует ручную инъекцию зависимостей, чтобы предоставить репозиторий локальным и удаленным источникам данных. Асинхронные задачи решаются с обратными вызовами [...]

enter image description here

+0

жаль, что я забыл приложить свой текущий класс. Добавлено на вопрос –

+0

совет мне, пожалуйста, где я должен инициализировать var? Например, у меня есть индикатор выполнения и, по крайней мере, мне нужно найти его 'findViewById()' и 'setProgress (0)' и 'setMax (100)', где я должен это делать? В презентаторе или в представлении? потому что, поскольку я понял init, я должен был сделать это, но вызывать метод с установленным значением, я должен из презентатора ... Более того, мне нужно 'findViewById()' делать, но задавать начальное значение 'setProgress (0)' и 'setMax (100) «Должен ли я из ведущего, да? –

0

Я настоятельно рекомендую прочитать эту статью на среду: https://medium.com/@tinmegali/model-view-presenter-mvp-in-android-part-1-441bfd7998fe#.f4yiylrwa.

По сути, все вещи, связанные с SDK android, должны быть помещены в ваш «вид» (а иногда и вашу модель), который обычно будет фрагментом или активностью. Выяснить разницу между вашей моделью и презентатором будет больше для вас, однако вы можете думать о своем ведущем как о том, что делает логические решения на основе исходных данных для вашего приложения. Часто шаблон mvp используется в Android-разработке, чтобы попытаться обойти вращение и проблемы с организацией отдыха, поэтому вам может быть повезло использовать статический презентатор для небольшого примера приложения.

Удачи!

+0

Извините, я забыл приложить свой текущий класс. Добавлено на вопрос –

+0

совет мне, пожалуйста, где я должен инициализировать var? Например, у меня есть индикатор выполнения и, по крайней мере, мне нужно найти его 'findViewById()' и 'setProgress (0)' и 'setMax (100)', где я должен это делать? В презентаторе или в представлении? потому что, поскольку я понял init, я должен был сделать это, но вызывать метод с установленным значением, я должен из презентатора ... Более того, мне нужно 'findViewById()' делать, но задавать начальное значение 'setProgress (0)' и 'setMax (100) «Должен ли я из ведущего, да? –

 Смежные вопросы

  • Нет связанных вопросов^_^