Maison > Java > javaDidacticiel > Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation d'une méthode virtuelle « ... » sur une référence d'objet nulle » lors de la navigation entre les activités ?

Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation d'une méthode virtuelle « ... » sur une référence d'objet nulle » lors de la navigation entre les activités ?

Patricia Arquette
Libérer: 2024-12-11 17:48:17
original
620 Les gens l'ont consulté

Why Does My Android App Crash with

Comprendre l'erreur : "Tentative d'invocation de la méthode virtuelle '..." sur une référence d'objet nul"

Lors de la tentative de navigation depuis SplashActivity à LoginActivity, l'application plante avec l'erreur suivante :

java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
Copier après la connexion

Root Cause du problème :

L'erreur suggère qu'une référence à un objet Java renvoie null, empêchant l'exécution d'une opération qui nécessite un objet valide. Dans ce cas, il s'agit de l'initialisation des éléments de vue dans le code LoginActivity.java.

Solution :

La résolution réside dans l'initialisation correcte des éléments de vue avant de référencer les dans le code. La réponse fournie identifie à juste titre que l'initialisation des éléments de vue en dehors de onCreate() peut conduire à des références nulles.

Pour résoudre le problème, déclarez les champs de vue dans LoginActivity.java sans initialisation, comme suit :

private EditText usernameField, passwordField;
private TextView error;
private ProgressBar progress;
Copier après la connexion

Ensuite, attribuez des valeurs aux champs dans onCreate() méthode :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    usernameField = (EditText)findViewById(R.id.username);
    passwordField = (EditText)findViewById(R.id.password);
    error = (TextView)findViewById(R.id.error);
    progress = (ProgressBar)findViewById(R.id.progress);
}
Copier après la connexion

Optimisation supplémentaire :

Comme suggéré dans la réponse, utiliser Handler au lieu de Timer pour planifier la transition de SplashActivity à LoginActivity est une meilleure pratique recommandée, car elle garantit l'exécution sur le thread de l'interface utilisateur, évitant les problèmes potentiels et garantissant une expérience utilisateur plus fluide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal