NullPointerException l'accès aux affichages dans onCreate()
C'est un canoniques question pour un problème souvent posté sur StackOverflow.
Je suis en suivant un tutoriel. J'ai créé une nouvelle activité à l'aide d'un assistant. Je reçois NullPointerException
lorsque vous tentez d'appeler une méthode sur View
s obtenu avec findViewById()
dans mon activité onCreate()
.
Activité onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View something = findViewById(R.id.something);
something.setOnClickListener(new View.OnClickListener() { ... }); //NPE HERE
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
Mise en page XML (fragment_main.xml
):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="packagename.MainActivity$PlaceholderFragment" >
<View
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/something" />
</RelativeLayout>
Vous devez vous connecter pour publier un commentaire.
Le tutoriel est probablement obsolète, d'essayer de créer une activité de base de l'INTERFACE utilisateur à la place du fragment de base de l'INTERFACE utilisateur préféré par l'assistant de code généré.
La vue est dans le fragment de mise en page (
fragment_main.xml
) et non dans l'activité de mise en page (activity_main.xml
).onCreate()
est trop tôt dans le cycle de vie de la trouver dans l'activité en vue de la hiérarchie, et unnull
est retourné. L'invocation d'une méthode surnull
causes de la NPE.La meilleure solution est de déplacer le code pour le fragment
onCreateView()
, appelantfindViewById()
sur le gonflés fragment de mise en pagerootView
:Comme une note côté, le fragment de la mise en page sera finalement une partie de l'activité en vue de la hiérarchie et détectable avec l'activité
findViewById()
mais seulement après que le fragment de la transaction a été exécutée. En attendant fragment de transactions exécutés danssuper.onStart()
aprèsonCreate()
.findViewById()
surrootView
et non pas sur l'activité.Essayer
OnStart()
méthode et il suffit d'utiliserou de Déclarer tout point de Vue à l'aide de
getView().findViewById
méthode dansonStart()
Déclarer écouteur de clics sur vue par
anyView.setOnClickListener(this);
Essayez de changer vos accès à des vues de la onViewCreated méthode de fragment, parce que parfois, lorsque vous essayez d'accéder à la vue dans la méthode onCreate ils ne sont pas rendus à la durée exception de pointeur null.
D'accord, c'est une erreur typique parce que souvent, les gens ne comprennent pas vraiment comment les Fragments de travail quand ils commencent à travailler sur le développement Android. Afin d'atténuer la confusion, j'ai créé un exemple simple de code que j'ai posté sur L'Application est arrêtée dans l'émulateur android , mais je l'ai posté ici.
Un exemple est le suivant:
activity_container.xml:
ExampleFragment:
fragment_example.xml:
Et qui devrait être un exemple, il montre comment vous pouvez utiliser une Activité pour afficher un Fragment, et de gérer les événements dans ce Fragment. Et aussi comment communiquer avec le contenant de l'Activité.
Otto
pour la communication au lieu de rappels, et l'utilisationButterknife
à injecter des points de vue.Le point de vue "quelque chose" est en fragment et non en activité, donc au lieu d'y accéder, de l'activité, vous devez accéder dans le fragment de classe comme
Dans PlaceholderFragment.class
Vous tentez d'accéder à des éléments d'INTERFACE utilisateur dans le
onCreate()
mais , il est trop tôt pour y accéder , depuis fragment points de vue peuvent être créés dansonCreateView()
méthode.Et
onActivityCreated()
méthode est fiable pour gérer toutes les actions, puisque l'activité est entièrement chargé dans cet état.Ajouter les lignes suivantes dans votre activity_main.xml
Puisque vous avez déclaré votre point de Vue dans le
fragment_main.xml
,déplacer le morceau de code où vous obtenez les entrées en phase nationale dans leonCreateView()
méthode du fragment.Cela devrait résoudre le problème.
dans la posté code ci-dessus dans la question il y a un problème :
vous utilisez R. layout.activity_main dans la méthode oncreate, mais les fichiers xml, le nom est "fragment_main.xml" , signifie que vous essayez d'obtenir le point de vue de fragment_main.xml fichier qui n'est pas indiqué de sorte qu'il donne l'exception de pointeur null. modifiez le code comme :
Vous devez vous rappeler important, c'est :
NullPointerException se produit lorsque vous avez déclaré que votre variable et en essayant de récupérer sa valeur avant l'attribution de la valeur.
Utilisation onViewCreated() Méthode lors de l'utilisation ou de l'appel de vues à partir de fragments.
J'ai eu la même
NullPointerException
de l'initialisation d'un auditeur après l'appel defindViewById()
onCreate()
etonCreateView()
méthodes.Mais quand j'ai utilisé le
onActivityCreated(Bundle savedInstanceState) {...}
il fonctionne. Donc, j'ai pu accéder à laGroupView
et mis mes écouteur.J'espère qu'il sera utile.
Plus populaires de la bibliothèque pour trouver des points de vue qui est utilisé par presque tous les développeurs.
ButterKnife
Que je peux leur sont suffisamment de réponses expliquant trouver des points de vue avec une bonne méthodologie. Mais si vous êtes développeur android et code fréquemment sur une base quotidienne, alors vous pouvez utiliser du beurre couteau qui permet de gagner beaucoup de temps dans la recherche de points de vue et vous n'avez pas à écrire le code, Avec en 2 ou 3 étapes, vous pouvez trouver des points de vue en millisecondes.
Ajouter la dépendance dans l'app niveau gradle:
Ajouter un plugin pour couteau à beurre:
Ensuite, la recherche de Android ButterKnife Zelezny et installer le plugin et redémarrez votre studio et vous avez fini avec elle.
Maintenant aller à la méthode Oncreate de votre activité et faites un clic droit sur votre layout_name et appuyez sur le bouton générer et sélectionnez butterknife injection option et vos points de vue des références sera automatiquement créé comme mentionner ci-dessous: