it-swarm.com.ru

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.

61
winston

Он не вызван, потому что этот метод был добавлен в API 23. Если вы запускаете свое приложение на устройстве с API 23 (Marshmallow), то будет вызываться onAttach(Context). На всех предыдущих версиях Android будет вызываться onAttach(Activity).

http://developer.Android.com/reference/Android/app/Fragment.html#onAttach(Android.app.Activity)

Фрагмент поддержки библиотеки не зависит от платформы. Следовательно, это работает на всех версиях API.

128
sockeqwe

В то время как 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 так будет иметь приоритет.

42
John

В дополнение к вышеупомянутым комментариям, я считаю важным отметить, что если вы пытаетесь использовать функцию onAttach() для обновления данных, содержащихся во фрагменте из родительского действия, возможно возникновение проблем, когда переменная сбора внутри действия является ноль или пусто, когда фрагмент надувается. В какой-то момент в жизненном цикле вашей Деятельности ваша модель данных может измениться, и ее необходимо обновить внутри фрагмента. Вы можете попытаться получить ссылку на уже раздутый фрагмент, но при пошаговом выполнении кода обнаружите, что функция onAttach() никогда не запускается, даже если используется переопределение, содержащее объект Context или Activity.

Если вы пытаетесь создать прослушиватель для фрагмента и инициализировать прослушиватель из метода обратного вызова onAttach(), onAttach() не сработает, если вы не предоставите параметр тега, как показано ниже при добавлении фрагмента в 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);
0
mrfilter