Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试调用虚拟方法';android.view.Window$Callback android.view.Window.getCallback()';关于空对象引用_Java_Android_Findviewbyid - Fatal编程技术网

Java 尝试调用虚拟方法';android.view.Window$Callback android.view.Window.getCallback()';关于空对象引用

Java 尝试调用虚拟方法';android.view.Window$Callback android.view.Window.getCallback()';关于空对象引用,java,android,findviewbyid,Java,Android,Findviewbyid,当mySplashActivity打开LoginActivity时,我的应用程序崩溃 下面是我的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.

当my
SplashActivity
打开
LoginActivity
时,我的应用程序崩溃

下面是我的
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);
    }
}
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();
    }
}
以及我的
LoginActivity.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);
    }
}
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();
    }
}
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" />

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)
04-16 23:24:16.124 4015-4015/com.example.android.appName E/AndroidRuntime:FATAL EXCEPTION:main
进程:com.example.android.appName,PID:4015
java.lang.RuntimeException:无法实例化活动组件信息{com.example.android.appName/com.example.android.appName.LoginActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.Window$Callback android.view.Window.getCallback()”
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2993)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3248)
在android.app.ActivityThread.access$1000(ActivityThread.java:197)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:145)
位于android.app.ActivityThread.main(ActivityThread.java:6872)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1404)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“android.view.Window$Callback android.view.Window.getCallback()”
位于android.support.v7.app.AppCompateDelegateImplbase。(AppCompateDelegateImplbase.java:68)
在android.support.v7.app.AppCompateDelegateImplv7。(AppCompateDelegateImplv7.java:145)
在android.support.v7.app.AppCompateDelegateImplv11。(AppCompateDelegateImplv11.java:28)
在android.support.v7.app.AppCompateDelegateImplv14。(AppCompateDelegateImplv14.java:42)
在android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:186)上
在android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:168)上
位于android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:508)
位于android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:180)
位于com.example.android.appName.LoginActivity。(LoginActivity.java:20)
位于java.lang.reflect.Constructor.newInstance(本机方法)
位于java.lang.Class.newInstance(Class.java:1690)
位于android.app.Instrumentation.newActivity(Instrumentation.java:1080)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2983)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3248)
在android.app.ActivityThread.access$1000(ActivityThread.java:197)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:145)
位于android.app.ActivityThread.main(ActivityThread.java:6872)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1404)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

onCreate()
中调用
setContentView(…)
之前,
活动
未完全初始化并准备好查找视图

仅声明如下字段:

private EditText usernameField, passwordField;
private TextView error;
private ProgressBar progress;
然后在
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);
}
可能不是问题的一部分,但作为额外的建议,
Timer
在后台线程上运行
TimerTask
,在这种情况下应该避免。将
计时器
替换为
处理程序
,以便在UI线程上运行它

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

使用以下方法将
ContentView
设置为所需的xml文件后,只能在java代码中访问xml文件中定义的视图:

setContentView(R.layout.xml_file_name);

因此,首先在
onCreate
方法内调用上述方法,然后在
onCreate
内或实例将要使用的方法内初始化
视图
实例。

您是否在清单中声明了您的登录活动?@NicolasSimon是的,我在UI线程上执行了
TimerTask.run()
。如果您从UI线程开始活动,那么它是否工作?@geogemulligan抱歉,但我不太确定“在UI线程上执行”是什么意思:(您能否显示
LoginActivity
?的完整代码,或者至少显示类上所有声明的字段和完整的
onCreate()
开始。这并没有解决问题,但感谢
处理程序(当然是:)的确如此!非常感谢:P顺便说一句,我真的希望Android Studio有一天会给出比这更有用、更清晰的错误消息……我同意特定的堆栈跟踪对确定如何解决问题没有多大帮助。生命周期回调和项目配置之外的大多数其他错误消息更容易理解。“在onCreate()中调用setContentView(…)之前,活动未完全初始化,也未准备好查找视图。”现场显示。感谢您即使在
onCreate()
中将值分配给我的按钮id后,我仍然会收到相同的错误@GeorgeMulligan