Android: "null オブジェクト参照で仮想メソッド 'android.view.Window$Callback android.view.Window.getCallback()' を呼び出そうとしています"
SplashActivity から LoginActivity に移動すると、アプリがエラーでクラッシュする「null オブジェクト参照で仮想メソッド 'android.view.Window$Callback android.view.Window.getCallback()' を呼び出そうとしています。」このエラーは通常、アクティビティが完全に初期化される前にビューにアクセスするとき、または UI 関連のアクションを実行するときに発生します。
この場合、エラーは次の問題によって引き起こされる可能性が高くなります:
ビュー フィールドの早期初期化:
LoginActivity.java では、usernameField、passwordField、エラー、および進捗フィールドはコンストラクターで宣言され、値が割り当てられます。ただし、これらのフィールドにアクセスするとき、アクティビティの onCreate() メソッドはまだ呼び出されていません。つまり、setContentView() は実行されておらず、ビュー階層は設定されていません。その結果、フィールドは存在しないビューを参照しようとし、null ポインタ例外が発生します。
解決策:
この問題を解決するには、次のことが必要です。 setContentView() が呼び出された後にのみビュー フィールドを初期化します。これにより、ビュー階層が完全に初期化され、アクセスできるようになります。
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); }
さらに、制御にはタイマーの代わりにハンドラーを使用することをお勧めします。 SplashActivity から LoginActivity へのナビゲーションが UI スレッドで確実に発生するようにします。
の更新されたコードSplashActivity.java:
new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(SplashActivity.this, LoginActivity.class); startActivity(intent); finish(); } }, 1500);
以上がアクティビティ ナビゲーション中に「null オブジェクト参照で仮想メソッド 'android.view.Window$Callback android.view.Window.getCallback()' を呼び出しようとしました」というエラーで Android アプリがクラッシュするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。