CrimeFragment — контроллер, що взаємодіє з об'єктами моделі і представлення. Його завдання — видача детальної інформації про конкретний злочин і її оновлення при модифікації користувачем.
У додатку GeoQuiz активності виконували велику частину роботи контроллера в методах життєвого циклу. У додатку CriminalIntent ця робота виконуватиметься фрагментами в методах життєвого циклу фрагментів. Багато хто з цих методів відповідає вже відомим вам методам Activity, таким як
onCreate(Bundle).
У файлі CrimeFragment.java додайте змінну для екземпляра Crime і реалізацію
У цій реалізації варто звернути увагу на пару моментів. По-перше, метод Fragment.onCreate(Bundle) оголошений відкритим, тоді як метод Activity. onCreate(Bundle) оголошений захищеним. Fragment.onCreate(.) і інші методи життєвого циклу Fragment мають бути відкритими, тому що вони викликатимуться довільною активністю, яка стане хостом фрагмента.
По-друге, як і у випадку з активністю, фрагмент використовує об'єкт Bundle для збереження і завантаження стану. Ви можете перевизначити Fragment.on
SaveInstanceState(Bundle) для ваших цілей, як і метод Activity.onSave InstanceState(Bundle).
Зверніть увагу на те, що не відбувається в Fragment.onCreate(.): ми не заповнюємо представлення фрагмента. Екземпляр фрагмента настроюється в Fragment. onCreate(.), але створення і налаштування представлення фрагмента здійснюються в іншому методі життєвого циклу фрагмента:
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
Саме у цьому методі заповнюється макет представлення фрагмента, а заповнений об'єкт View повертає активність хосту. Параметри LayoutInflater і ViewGroup потрібні для заповнення макету. Об'єкт Bundle містить дані, які використовуються методом для відтворення представлення по збереженому стану.
У файлі CrimeFragment.java додайте реалізацію onCreateView(.), яка заповнює розмітку fragment_crime.xml.
public class CrimeFragment extends Fragment { private Crime mCrime;
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
mCrime = new Crime();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime, parent, false); return v;
}
}
У методі onCreateView(.) ми явно заповнюємо представлення фрагмента, викликаючи LayoutInflater.inflate(.) з передачею ідентифікатора ресурсу макету. Другий параметр визначає батька представлення, що зазвичай потрібне для правильного налаштування віджета. Третій параметр вказує, чи треба включати заповнене представлення у батька. Ми передаємо false, тому що представлення буде додано в коді активності.
Підключення віджетів у фрагменті
У методі onCreateView(.) також настроюється реакція віджета EditText на введення користувача. Після того, як представлення буде заповнено, метод отримує посилання на EditText і додає слухача.