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èmea é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.
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.
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
}
}
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é.
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
@Override
public void onAttach(Context context) {
super.onAttach(context);
Activity activity = context instanceof Activity ? (Activity) context : null;
}
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
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.
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)
.
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
}