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éconseillé la fonction onAttach () de la classe Fragment.
Au lieu de:
onAttach (Activity activity)
La neige:
onAttach (Context context)
Comme mon application utilise l'activité passée avant la dépréciation, je pense qu'une solution possible est:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
Serait-ce la bonne façon de procéder?
METTRE À JOUR:
Si j'exécute un appareil avec une API inférieure à 23, le nouveau onAttach () n'est même pas appelé. J'espère que ce n'est pas ce qu'ils avaient l'intention de 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.
la source
Context
? N'avez-vous pas besoin d'unActivity
pour attacher et afficher un fragment de toute façon? Sinon, comment utiliserez-vous leContext
paramètre?onAttach(Context context)
soit appelé, vous devez soit utiliser un appareil doté d'au moins API 23 OU utiliser android.support.v4.app.Fragment. Voir iciRéponses:
L'activité est un contexte, donc si vous pouvez simplement vérifier que le contexte est une activité et la diffuser si nécessaire.
Mise à jour: certains prétendent que le nouveau
Context
remplacement n'est jamais appelé. J'ai fait quelques tests et je ne trouve pas de scénario où cela est vrai et selon le code source, cela ne devrait jamais être vrai. Dans tous les cas, j'ai testé, à la fois avant et après SDK23,Activity
lesContext
versions et les versions deonAttach
ont été appelées. Si vous pouvez trouver un scénario où ce n'est pas le cas, je vous suggère de créer un exemple de projet illustrant le problème et de le signaler à l'équipe Android .Mise à jour 2: je n'utilise que les fragments de la bibliothèque de support Android car les bogues y sont corrigés plus rapidement. Il semble que le problème ci-dessus où les remplacements ne sont pas appelés correctement ne se révèle que si vous utilisez les fragments de framework.
la source
onAttach(Context)
ne semblent même pas s'appeler.onAttach(context)
de ne pas être appelé.Ceci est un autre grand changement de Google ... La modification suggérée: remplacer
onAttach(Activity activity)
paronAttach(Context context)
planter mes applications sur les anciennes API caronAttach(Context context)
ne sera pas appelé sur les fragments natifs.J'utilise les fragments natifs (android.app.Fragment), j'ai donc dû faire ce qui suit pour le faire fonctionner à nouveau sur les anciennes API (<23).
Voici ce que j'ai fait:
la source
Si vous utilisez les fragments d'infrastructure et que la version SDK de l'appareil est inférieure à 23,
OnAttach(Context context)
elle ne sera pas appelée.J'utilise des fragments de support à la place, donc la dépréciation est corrigée et
onAttach(Context context)
toujours appelée.la source
Actuellement à partir du
onAttach
code de fragment, il n'est pas clair siContext
c'est l'activité actuelle: Code sourceSi vous regardez,
getActivity
vous verrez le même appelDonc , si vous voulez être sûr que vous obtenez l'activité puis utilisez
getActivity()
(dansonAttach
votreFragment
) mais ne pas oublier de vérifiernull
parce que simHost
estnull
votre activité seranull
la source
la source
Bien qu'il semble que dans la plupart des cas, cela soit suffisant
onAttach(Context)
, il existe certains téléphones (par exemple: Xiaomi Redme Note 2) où il n'est pas appelé, ce qui provoque donc des exceptions NullPointerExceptions. Donc, pour être prudent, je suggère de laisser la méthode obsolète également:la source
Téléchargez la dernière bibliothèque de support avec le gestionnaire sdk et incluez
dans gradle.app et définissez la version de compilation sur api 23
la source
La réponse ci-dessous est liée à cet avertissement de dépréciation apparaissant dans le didacticiel Fragments sur le site Web des développeurs Android et peut ne pas être lié aux messages ci-dessus.
J'ai utilisé ce code dans la leçon du didacticiel et cela a fonctionné.
J'avais peur que cette activité soit nulle comme l'indique la documentation.
getActivity
FragmentActivity getActivity () Retourne la FragmentActivity à laquelle ce fragment est actuellement associé. Peut retourner null si le fragment est associé à un contexte à la place.
Mais onCreate sur la main_activity montre clairement que le fragment a été chargé et donc après cette méthode, l'appel à l'activité get du fragment retournera la classe main_activity.
getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();
J'espère avoir raison. Je suis un débutant absolu.
la source
vous utilisez probablement
android.support.v4.app.Fragment
. Pour cela au lieu deonAttach
méthode, utilisez simplementgetActivity()
pour obtenir leFragmentActivity
fichier auquel le fragment est associé. Sinon, vous pouvez utiliser laonAttach(Context context)
méthode.la source
Cela a fonctionné pour moi lorsque j'ai une interface définie par l'utilisateur 'TopSectionListener', sa commande d'activité d'objet:
la source