Maison > Java > javaDidacticiel > Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation de la méthode virtuelle 'android.view.Window$Callback android.view.Window.getCallback()' sur une référence d'objet nulle » pendant la navigation dans l'activité ?

Pourquoi mon application Android plante-t-elle avec « Tentative d'invocation de la méthode virtuelle 'android.view.Window$Callback android.view.Window.getCallback()' sur une référence d'objet nulle » pendant la navigation dans l'activité ?

Mary-Kate Olsen
Libérer: 2024-12-05 03:42:17
original
1000 Les gens l'ont consulté

Why Does My Android App Crash with

Android : "Tentative d'invocation de la méthode virtuelle 'android.view.Window$Callback android.view.Window.getCallback()' sur une référence d'objet nulle"

Lors de la navigation de SplashActivity vers LoginActivity, l'application plante avec l'erreur « Tentative d'invocation de la méthode virtuelle 'android.view.Window$Callback android.view.Window.getCallback()' sur une référence d'objet nulle." Cette erreur se produit généralement lors de l'accès aux vues ou de l'exécution d'actions liées à l'interface utilisateur avant que l'activité ne soit complètement initialisée.

Dans ce cas, l'erreur est très probablement causée par le problème suivant :

Initialisation prématurée des champs d'affichage :

Dans LoginActivity.java, les champs usernameField, passwordField, error et progress sont valeurs déclarées et attribuées dans le constructeur. Cependant, la méthode onCreate() de l'activité n'a pas encore été appelée lors de l'accès à ces champs, ce qui signifie que setContentView() n'a pas été exécutée et que la hiérarchie des vues n'a pas été configurée. Par conséquent, les champs tentent de faire référence à des vues inexistantes, ce qui entraîne l'exception du pointeur nul.

Résolution :

Pour résoudre le problème, il est nécessaire de initialisez les champs d'affichage uniquement après l'appel de setContentView(). Cela garantit que la hiérarchie des vues est entièrement initialisée et accessible.

Le code mis à jour dans LoginActivity.java :

private EditText usernameField;
private EditText passwordField;
private TextView error;
private ProgressBar progress;

@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

De plus, il est recommandé d'utiliser un gestionnaire au lieu d'un minuteur pour contrôler la navigation de SplashActivity à LoginActivity pour garantir qu'elle se produit sur le fil de discussion de l'interface utilisateur.

Le code mis à jour dans SplashActivity.java :

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }
}, 1500);
Copier après la connexion

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