Fragment onattach (Android) déprécié

j'ai mis à jour mon application pour utiliser la dernière bibliothèque de support (version 23.0.0), j'ai découvert qu'ils ont déprécié la fonction onAttach() de la classe Fragment.

au lieu de:

onAttach (Activity activity)

c'est maintenant:

onAttach (Context context)

comme mon application utilise l'activité passée avant dépréciation, une solution possible je pense est:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = getActivity();
}

Serait-ce la bonne façon de le faire?

mise à jour:

si j'exécute un périphérique avec API inférieure à 23, le nouveau onAttach() n'est même pas appelé. J'espère que ce n'est pas ce qu'ils ont l'intention de le faire!

mise à JOUR 2:

Le problème

a été résolu avec les dernières mises à jour du SDK.

j'ai testé sur mon appareil API 22 et onAttach(Context) est appelé.

cliquez ici pour suivre le rapport de bogue que j'ai ouvert il y a quelques semaines et les réponses des gars de Google.

281
demandé sur TareK Khoury 2015-08-19 00:40:47

9 réponses

activité est un contexte donc si vous pouvez simplement vérifier le contexte est une activité et de le lancer si nécessaire.

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity a;

    if (context instanceof Activity){
        a=(Activity) context;
    }

}

Update: certains prétendent que le nouveau Context override n'est jamais appelé. J'ai fait quelques tests et je ne trouve pas de scénario où cela soit vrai et selon le code source, cela ne devrait jamais être vrai. Dans tous les cas, j'ai testé, avant et après le SDK23, les versions Activity et Context du onAttach ont été appelés. Si vous pouvez trouver un scénario où ce n'est pas le cas, je vous suggérerais de créer un exemple de projet illustrant le problème et le signaler à L'équipe Android .

mise à jour 2: Je n'utilise les fragments de bibliothèque de Support Android que lorsque les bugs sont corrigés plus rapidement. Il semble que la question ci-dessus où les overrides ne sont pas appelées correctement ne se révèle que si vous utilisez les fragments du framework.

300
répondu Kuffs 2016-03-04 10:15:58

C'est un autre grand changement de Google ... La modification suggérée: remplacer onAttach(Activity activity) par onAttach(Context context) a écrasé mes applications sur des API plus anciennes puisque onAttach(Context context) ne sera pas appelé sur des fragments natifs.

j'utilise les fragments natifs (android.App.Fragment) j'ai donc dû faire ce qui suit pour le faire fonctionner à nouveau sur des APIs plus anciens (< 23).

voici ce que j'ai fait:

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    // Code here
}

@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        // Code here
    }
}
40
répondu Yoann Hercouet 2016-01-12 15:03:37

si vous utilisez les fragments de la charpente et la version SDK de l'appareil est inférieure à 23, OnAttach(Context context) ne serait pas appelé.

j'utilise des fragments de support à la place, donc la dépréciation est fixe et onAttach(Context context) est toujours appelé.

38
répondu kikermo 2015-09-17 12:35:10

actuellement à partir du code de Fragment onAttach , il n'est pas clair si le Context est l'activité courante: code Source

public void onAttach(Context context) {
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) {
        mCalled = false;
        onAttach(hostActivity);
    }
}

si vous regardez getActivity vous verrez le même appel

/**
 * Return the Activity this fragment is currently associated with.
 */
final public Activity getActivity() {
    return mHost == null ? null : mHost.getActivity();
}

Donc, Si vous voulez être sûr que vous obtenez l'Activité puis utiliser getActivity() (dans onAttach dans votre Fragment ), mais n'oubliez pas de vérifier les null parce que si mHost est null votre activité sera null

9
répondu royB 2015-08-23 11:15:26
@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity activity = context instanceof Activity ? (Activity) context : null;
}
5
répondu worked 2015-10-02 23:04:12

télécharger la plus récente bibliothèque de soutien avec le sdk manager et inclure

compile 'com.android.support:appcompat-v7:23.1.1'

dans gradle.l'application et le jeu de compiler la version à l'api 23

3
répondu Essah 2015-11-25 19:05:34

la réponse ci-dessous est liée à cet avertissement de dépréciation se produisant dans le tutoriel Fragments sur le site du développeur Android et peut ne pas être liée aux messages ci-dessus.

j'ai utilisé ce code sur la leçon de tutoriel et il a fonctionné.

public void onAttach(Context context){
    super.onAttach(context);

    Activity activity = getActivity();

j'étais inquiet que l'activité peut-être nulle comme ce que la documentation indique.

get activity

FragmentActivity getActivity () De retour de la FragmentActivity ce fragment est actuellement associé avec. Peut retourner null si le fragment est associé à un contexte à la place.

mais l'onCreate sur main_activity montre clairement que le fragment a été chargé et donc après cette méthode, appeler get activity à partir du fragment retournera la classe main_activity.

getSupportFragmentManager().beginTransaction() .ajouter (R. id.fragment_container, firstFragment).engager();

j'espère avoir raison. Je suis un débutant absolu.

1
répondu Roy Selim 2016-10-24 08:02:40

vous utilisez probablement android.support.v4.app.Fragment . Pour cela, à la place de la méthode onAttach , il suffit d'utiliser getActivity() pour obtenir le FragmentActivity auquel le fragment est associé. Sinon, vous pouvez utiliser la méthode onAttach(Context context) .

1
répondu LeoCoder 2016-11-10 08:21:32

bien qu'il semble que dans la plupart des cas il soit suffisant d'avoir onAttach(Context) , il y a quelques téléphones (I. e: Xiaomi Redme Note 2) où il n'est pas appelé, il provoque donc NullPointerExceptions. Donc, pour être sur le côté sûr, je suggère de laisser la méthode dépréciée ainsi:

// onAttach(Activity) is necessary in some Xiaomi phones
@SuppressWarnings("deprecation")
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    _onAttach(activity);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    _onAttach(context);
}

private void _onAttach(Context context) {
    // do your real stuff here
}
1
répondu Gavriel 2017-11-17 11:09:54