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
Mary-Kate Olsenoriginal
2024-12-05 03:42:17999parcourir

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);
}

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);

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!

Déclaration:
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