Il s'agit d'une question canonique pour un problème fréquemment publié sur StackOverflow.
Je suis un tutoriel. J'ai créé une nouvelle activité à l'aide d'un assistant. J'obtiens NullPointerException
en essayant d'appeler une méthode sur les View
s obtenus 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>
findViewById()
àrootView
et non sur l' activité.Essayez la
OnStart()
méthode et utilisez simplementou Déclarez une vue en utilisant la
getView().findViewById
méthode dansonStart()
Déclarer l'écouteur de clics lors de l'affichage par
anyView.setOnClickListener(this);
la source
Essayez de déplacer vos vues d'accès vers la méthode onViewCreated du fragment car parfois, lorsque vous essayez d'accéder aux vues dans la méthode onCreate, elles ne sont pas rendues au moment de l'exception de pointeur nul.
la source
D'accord, il s'agit d'une erreur typique car les gens ne comprennent souvent pas vraiment le fonctionnement des fragments lorsqu'ils commencent à travailler sur le développement Android. Pour éviter toute confusion, j'ai créé un exemple de code simple que j'ai initialement publié sur L' application est arrêtée dans l'émulateur Android , mais je l'ai également posté ici.
Un exemple est le suivant:
activity_container.xml:
ExempleFragment:
fragment_example.xml:
Et cela devrait être un exemple valide, il montre comment vous pouvez utiliser une activité pour afficher un fragment et gérer les événements dans ce fragment. Et aussi comment communiquer avec l'activité contenant.
la source
Otto
pour la communication au lieu des rappels, et utiliserButterknife
pour injecter des vues.La vue "quelque chose" est fragmentée et non en activité, donc au lieu d'y accéder en activité, vous devez y accéder dans la classe fragment comme
Dans PlaceholderFragment.class
la source
Vous essayez d'accéder aux éléments de l'interface utilisateur dans le
onCreate()
mais, il est trop tôt pour y accéder, car dans les vues fragmentées peuvent être créées dansonCreateView()
method. Et laonActivityCreated()
méthode est fiable pour gérer toutes les actions sur eux, car l'activité est entièrement chargée dans cet état.la source
Ajoutez ce qui suit dans votre activity_main.xml
la source
Puisque vous avez déclaré votre vue dans le
fragment_main.xml
, déplacez ce morceau de code là où vous obtenez le NPE dans laonCreateView()
méthode du fragment. Cela devrait résoudre le problème.la source
dans le code posté ci-dessus dans la question, il y a un problème: vous utilisez R.layout.activity_main dans la méthode oncreate, mais le nom des fichiers xml est "fragment_main.xml", cela signifie que vous essayez d'obtenir la vue du fichier fragment_main.xml qui n'est pas affiché, il donne donc une exception de pointeur nul. changez le code comme:
la source
Vous devez vous rappeler que la chose importante est: NullPointerException se produit lorsque vous avez déclaré votre variable et que vous essayez de récupérer sa valeur avant de lui attribuer une valeur.
la source
Utilisez la méthode onViewCreated () chaque fois que vous utilisez ou appelez des vues à partir de fragments.
la source
J'ai la même
NullPointerException
initialisation d'un auditeur après l'appelfindViewById()
onCreate()
et lesonCreateView()
méthodes.Mais quand je l'ai utilisé,
onActivityCreated(Bundle savedInstanceState) {...}
cela fonctionne. Ainsi, je pourrais accéder auGroupView
et définir mon auditeur.J'espère que cela vous sera utile.
la source
Bibliothèque la plus populaire pour rechercher des vues, utilisée par presque tous les développeurs.
Couteau à beurre
Comme je peux, leurs réponses sont suffisantes pour expliquer la recherche de points de vue avec une méthodologie appropriée. Mais si vous êtes développeur Android et que vous codez fréquemment au quotidien, vous pouvez utiliser un couteau à beurre, ce qui vous fait gagner beaucoup de temps dans la recherche de vues et vous n'avez pas d'écriture de code pour cela, avec en 2-3 étapes, vous pouvez trouver des vues en millisecondes .
Ajouter une dépendance au niveau de l'application:
Ajouter un plugin pour couteau à beurre:
Ensuite, recherchez Android ButterKnife Zelezny et installez le plugin et redémarrez votre studio et vous avez terminé.
Maintenant, allez simplement à 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 l'option d'injection Butterknife et vos références de vues seront automatiquement créées comme mentionné ci-dessous:
la source