web-dev-qa-db-fra.com

Essayez d'appeler la méthode virtuelle 'Android.view.Window $ Callback Android.view.Window.getCallback ()' sur une référence d'objet null

Lorsque ma SplashActivity ouvre la LoginActivity, mon application se bloque.

Voici mon SplashActivity.Java:

package com.example.Android.appName;

import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;

import Java.util.Timer;
import Java.util.TimerTask;

public class SplashActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            }
        }, 1500);
    }
}

et mon LoginActivity.Java:

package com.example.Android.appName;

import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.view.KeyEvent;
import Android.view.Menu;
import Android.view.MenuInflater;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.EditText;
import Android.widget.ProgressBar;
import Android.widget.TextView;

public class LoginActivity extends AppCompatActivity {
    private EditText usernameField = (EditText)findViewById(R.id.username),
                     passwordField = (EditText)findViewById(R.id.password);
    private TextView error = (TextView)findViewById(R.id.error);
    private ProgressBar progress = (ProgressBar)findViewById(R.id.progress);

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.login_menu, menu);
        return true;
    }  

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (Android.os.Build.VERSION.SDK_INT > 5
                && keyCode == KeyEvent.KEYCODE_BACK
                && event.getRepeatCount() == 0) {
            onBackPressed();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    public void exit(MenuItem item) {
        finish();
    }

    public void signIn(View view) {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

Partie de AndroidManifest.xml:

<activity Android:name=".SplashActivity"
    Android:theme="@style/NoActionBar">
    <intent-filter>
        <action Android:name="Android.intent.action.MAIN" />
        <category Android:name="Android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    Android:name=".LoginActivity"
    Android:label="@string/title_activity_login" />

Erreur dans logcat:

04-16 23:24:16.124 4015-4015/com.example.Android.appName E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.example.Android.appName, PID: 4015
 Java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.Android.appName/com.example.Android.appName.LoginActivity}: Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.view.Window$Callback Android.view.Window.getCallback()' on a null object reference
     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2993)
     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:3248)
     at Android.app.ActivityThread.access$1000(ActivityThread.Java:197)
     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1681)
     at Android.os.Handler.dispatchMessage(Handler.Java:102)
     at Android.os.Looper.loop(Looper.Java:145)
     at Android.app.ActivityThread.main(ActivityThread.Java:6872)
     at Java.lang.reflect.Method.invoke(Native Method)
     at Java.lang.reflect.Method.invoke(Method.Java:372)
     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1404)
     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1199)
  Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Android.view.Window$Callback Android.view.Window.getCallback()' on a null object reference
     at Android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.Java:68)
     at Android.support.v7.app.AppCompatDelegateImplV7.<init>(AppCompatDelegateImplV7.Java:145)
     at Android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.Java:28)
     at Android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.Java:42)
     at Android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.Java:186)
     at Android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.Java:168)
     at Android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.Java:508)
     at Android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.Java:180)
     at com.example.Android.appName.LoginActivity.<init>(LoginActivity.Java:20)
     at Java.lang.reflect.Constructor.newInstance(Native Method)
     at Java.lang.Class.newInstance(Class.Java:1690)
     at Android.app.Instrumentation.newActivity(Instrumentation.Java:1080)
     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2983)
     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:3248) 
     at Android.app.ActivityThread.access$1000(ActivityThread.Java:197) 
     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1681) 
     at Android.os.Handler.dispatchMessage(Handler.Java:102) 
     at Android.os.Looper.loop(Looper.Java:145) 
     at Android.app.ActivityThread.main(ActivityThread.Java:6872) 
     at Java.lang.reflect.Method.invoke(Native Method) 
     at Java.lang.reflect.Method.invoke(Method.Java:372) 
     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1404) 
     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1199)
16
user5404864

Une Activity n'est pas complètement initialisée et prête à rechercher des vues avant que setContentView(...) soit appelé dans onCreate().

Déclarez uniquement les champs comme suit:

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

puis assignez les valeurs dans onCreate:

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

Cela ne fait peut-être pas partie du problème, mais comme conseil supplémentaire, une Timer exécute la TimerTask sur un fil d’arrière-plan, ce qui devrait être évité dans ce cas. Remplacez Timer par Handler au lieu de l'exécuter sur le thread d'interface utilisateur.

new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }
}, 1500);
63
George Mulligan

Les vues définies dans un fichier XML ne sont accessibles qu'en code Java, après avoir défini la variable ContentView en tant que fichier XML requis à l'aide de: 

setContentView(R.layout.xml_file_name);

Donc, 1er appel de la méthode ci-dessus dans la méthode onCreate, puis initialiser les instances View dans onCreate ou dans les méthodes dans lesquelles l'instance sera utilisée.

0
Gowtham Gowda