Maison >Java >javaDidacticiel >Pourquoi est-ce que je reçois une NullPointerException lors de l'accès aux vues dans mon LoginActivity ?

Pourquoi est-ce que je reçois une NullPointerException lors de l'accès aux vues dans mon LoginActivity ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-07 01:43:12910parcourir

Why Am I Getting a NullPointerException When Accessing Views in My LoginActivity?

NullPointerException : tentative de récupération du rappel à partir d'une fenêtre non initialisée

Lors de la navigation de SplashActivity à LoginActivity, l'application rencontre une erreur :

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

Cette erreur indique que LoginActivity tente d'accéder à un composant de vue avant lui. a été correctement initialisé.

Cause

La cause spécifique de l'erreur réside dans le code LoginActivity.java, où les membres de la classe sont initialisés avant l'appel de setContentView() dans onCreate(). Cela conduit à une situation dans laquelle les vues n'existent pas encore lorsque les membres de la classe tentent de les trouver.

Solution

Pour résoudre le problème, déclarez les membres de la vue dans la classe sans initialisation :

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

Ensuite, initialisez les membres dans onCreate() après que setContentView() ait été appelé :

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

Conseils supplémentaires

Bien que cela ne soit pas directement lié à l'erreur, il est recommandé de remplacer Timer par Handler lors de l'exécution d'une tâche sur le thread de l'interface utilisateur :

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