onAttach() не вызывается во фрагменте
Мой фрагмент не звонит onAttach(context)
метод, когда он запускается из AppCompatActivity
,
Создание фрагмента в XML:
<fragment
android:id="@+id/toolbar"
class="package.MainToolbarFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout="@layout/fragment_main_toolbar" />
Но если я расширяю его от support.v4.Fragment
, onAttach(context)
вызов!
В чем может быть проблема?
Конечно, я могу расширить все фрагменты из v4.Fragment
но я не хочу этого Это плохая практика? Также проект min sdk 14.
3 ответа
Он не вызван, потому что этот метод был добавлен в API 23. Если вы запускаете свое приложение на устройстве с API 23 (зефир), то onAttach(Context)
будет называться. На всех предыдущих версиях Android onAttach(Activity)
будет называться.
http://developer.android.com/reference/android/app/Fragment.html
Фрагмент поддержки библиотеки не зависит от платформы. Следовательно, это работает на всех версиях API.
В то время как Google хочет, чтобы мы прекратили использовать устаревшие API
@Override
public void onAttach(Context context) {
super.onAttach(context);
...
Это так ново, что это не так широко называется. Вам также необходимо реализовать
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
...
Для меня они идентичны, но мне нравится KISS, и введение другой библиотеки поддержки, как правило, удваивает мой apk примерно до 1000 КБ. Я только обновил свой SDK вчера.
Причина, по которой типы здесь не являются взаимозаменяемыми, как во многих случаях, заключается в том, что метод принимает Activity
будет по-прежнему вызываться, когда Activity
предоставляется как они оба публично видны и Activity
является более специализированным, чем (как подкласс) Context
так будет иметь приоритет.
В дополнение к вышеупомянутым комментариям, я считаю важным отметить, что если вы пытаетесь использовать onAttach()
Чтобы обновить данные, содержащиеся внутри фрагмента, из родительского действия, можно столкнуться с проблемами, когда переменная сбора внутри действия равна нулю или пуста, когда фрагмент раздувается. В какой-то момент в жизненном цикле вашей Деятельности ваша модель данных может измениться, и ее необходимо обновить внутри фрагмента. Вы можете попытаться получить ссылку на уже раздутый фрагмент, но по ходу своего кода обнаружите, что onAttach()
никогда не срабатывает, даже если используется переопределение, содержащее объект Context или Activity.
Если вы пытаетесь создать прослушиватель для фрагмента и инициализировать слушателя из onAttach()
метод обратного вызова, onAttach()
не сработает, если вы не укажете параметр tag, как показано ниже при добавлении фрагмента в Activity:
// in the Activity
getFragmentManager().beginTransaction()
.add(
R.id.fragmentContainer,
CustomFragment.newInstance(customDataSource),
CustomFragment.TAG // Must be passed in for the code below to work
).commit();
// Getting a reference to the fragment later on (say to update your data model inside the fragment (in onActivityResult())
CustomFragment fragmentDelegate = (CustomFragment) getFragmentManager().findFragmentByTag(CustomFragment.TAG);
fragmentListener.updateDataSource(customDataSource);