Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Реалізація методів життєвого циклу фрагмента



 

CrimeFragment — контроллер, що взаємодіє з об'єктами моделі і представлення. Його завдання — видача детальної інформації про конкретний злочин і її оновлення при модифікації користувачем.

 

У додатку GeoQuiz активності виконували велику частину роботи контроллера в методах життєвого циклу. У додатку CriminalIntent ця робота виконуватиметься фрагментами в методах життєвого циклу фрагментів. Багато хто з цих методів відповідає вже відомим вам методам Activity, таким як

 

onCreate(Bundle).

 

У файлі CrimeFragment.java додайте змінну для екземпляра Crime і реалізацію

 

Fragment.onCreate(Bundle).

 

Лістинг 7.7. Перевизначення Fragment.onCreate(CrimeFragment.java)

 

public class CrimeFragment extends Fragment {

private Crime mCrime;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mCrime = new 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.

 

Лістинг 7.8. Перевизначення onCreateView(CrimeFragment.java)

 

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 і додає слухача.

 

Лістинг 7.9. Налаштування віджета EditText(CrimeFragment.java)

 

public class CrimeFragment extends Fragment { private Crime mCrime;

private EditText mTitleField;

 

...

 

@Override

 

public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {

View v = inflater.inflate(R.layout.fragment _ crime, parent, false);

mTitleField = (EditText)v.findViewById(R.id.crime_title);

mTitleField.addTextChangedListener(new TextWatcher() {

Public void onTextChanged(

CharSequence c, int start, int before, int count) {

mCrime.setTitle(c.toString());

}

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.