Может ли одно задание использовать один из множества фрагментов одним и тем же методом? - PullRequest
0 голосов
/ 26 февраля 2019

Может ли одно действие использовать один из множества фрагментов одним и тем же методом?

У меня есть несколько фрагментов, чтобы принять ввод пользователя для различной информации.Каждый фрагмент отличается, и их использование определяется вкладкой, выбранной пользователем.В настоящее время я использую оператор switch, чтобы выбрать соответствующий фрагмент для использования в Activity:

private static Fragment fragment;

    FragmentManager fm = getSupportFragmentManager();
    fragment = fm.findFragmentById(R.id.fragment_container);
    boolean validTab = true;

    switch (tabSelected){
        case "Procedures":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new ProcedureRecordsFragment();
            Log.d(TAG, "fragment is: " + fragment);
            break;
        case "Prescriptions":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new PrescriptionRecordsFragment();
            Log.d(TAG, "fragment is: " + fragment);
            break;
        case "Immunizations":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new ImmunizationRecordsFragment();
            break;
        case "Medical Encounters":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new MedicalEncounterRecordsFragment();
            break;
        case "Allergies":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new AllergyRecordsFragment();
            break;
        case "Injuries":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new InjuryRecordsFragment();
            break;
        case "Obstetric History":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new ObstetricRecordsFragment();
            break;
        case "Family History":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new FamilyHistoryRecordsFragment();
            break;
        case "Social History":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new SocialHistoryRecordsFragment();
            break;
        case "Habits":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new HabitRecordsFragment();
            break;
        case "Development History":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new DevelopmentRecordsFragment();
            break;
        case "Demographics":
            Log.d(TAG, "To enter: " + tabSelected + "records");
            fragment = new DemographicRecordsFragment();
            break;*/
        default:
            Log.d(TAG, "Invalid tab reference");
            validTab = false;
            break;
        }
        if(validTab == true){
            fragment.setArguments(args);
            fm.beginTransaction().add(R.id.fragment_container, fragment).commit();
        }else if(validTab == false){
            Log.d(TAG, "Do nothing, invalid tab reference");
        }

Это успешно отображает правильный фрагмент, определенный выбранной вкладкой.

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

public String getUserInput(){
    return("String from the fragment!");
}

Метод фрагментов getUserInout предназначен для доступа к методу действия saveRecord, добавленному после успешного отображениякаждый фрагмент:

public void saveRecord(MenuItem item){
    Log.d(TAG, "Entered: saveRecord");
    String s = fragment.getUserInput();
    Log.d(TAG, "String s says: " + s);
    Log.d(TAG, "fragment is: " + fragment);
}

Инструкция String s = fragment.getUserInput(); приводит к сборке Gradle «Не удается разрешить метод getUserInput» Ошибка.Когда я закомментирую и String s = fragment.getUserInput();, и Log.d(TAG, "String s says: " + s);, и запускаю код, Log.d(TAG, "fragment is: " + fragment) отображает ссылку на выбранный фрагмент, сгенерированную Gradle: например, D / MedicalRecordActivity: фрагмент:Экземпляр дела и D / MedicalRecordActivity: фрагмент:

Это указывает на то, что Gradle создал код, который создает один экземпляр соответствующего фрагмента, который определяется выбором вкладки.В своем исследовании я не нашел ничего, что предоставило бы мне информацию об Деятельности, используя один из множества Фрагментов, который предоставляет Активности доступ к методам активного Фрагмента.Кто-нибудь может указать мне на такую ​​информацию?

1 Ответ

0 голосов
/ 26 февраля 2019

То, что вы ищете, это interface.По сути, это контракт, который класс может претендовать на предоставление.Так что в вашем случае у вас есть контракт для классов, которые обеспечивают ввод данных пользователем.Вы можете использовать что-то вроде:

interface UserInputProvider {
  public String getUserInput();
}

Ваши классы Fragment затем просто должны реализовать этот интерфейс и отметить, что они переопределяют этот метод из интерфейса:

class MyFragment implements UserInputProvider {
  @Override
  public String getUserInput() {
    // your code to get input here
  }
}

Тогда вы можете простоприведите ваш фрагмент к UserInputProvider, если применимо:

public void saveRecord(MenuItem item) {
  if (fragment instanceof UserInputProvider) {
    String input = ((UserInputProvider) fragment).getUserInput();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...