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é ?
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!