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);
}
}
と私 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();
}
}
一部の 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)
Activity
は完全に初期化されておらず、setContentView(...)
でonCreate()
が呼び出されるまでビューを検索する準備ができていません。
次のようなフィールドのみを宣言します。
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
を実行しますが、この場合は回避する必要があります。代わりにTimer
をHandler
に置き換えて、UIスレッドで実行します。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
}, 1500);
Xmlファイルで定義されたビューは、次を使用してContentView
を必要なxmlファイルとして設定した後、Javaコードでのみアクセスできます。
setContentView(R.layout.xml_file_name);
したがって、最初に上記のメソッドをonCreate
メソッド内で呼び出し、次にView
インスタンスをonCreate
内またはインスタンスが使用されるメソッド内で初期化します。