Android Studio中WebView应用启动崩溃(ActionBar空指针)求助
问题
项目构建成功,但在模拟器运行时应用崩溃,报错信息显示SplashActivity的onCreate方法第19行出现java.lang.NullPointerException,即调用getSupportActionBar().hide()时对象为空。已尝试Invalidate and Restart、注释该行代码两种方法,问题仍未解决。
相关代码文件如下:
SplashActivity.java
package com.newvemo.newvemo; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getSupportActionBar().hide(); setContentView(R.layout.activity_splash); Thread splashThread = new Thread(){ @Override public void run() { try { sleep(300); startActivity(new Intent(getApplicationContext(),MainActivity.class)); finish(); } catch (InterruptedException e) { e.printStackTrace(); } } }; splashThread.start(); } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.newvemo.newvemo"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"></activity> <activity android:name=".SplashActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
activity_splash.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".SplashActivity"> <ImageView android:layout_width="match_parent" android:layout_height="363dp" android:scaleType="centerCrop" android:src="@drawable/splash_logo" android:padding="50dp" android:layout_marginTop="30dp"/> <ProgressBar android:layout_width="220dp" android:layout_height="10dp" android:layout_gravity="center_horizontal" style="?android:attr/progressBarStyleHorizontal" android:max="100" android:indeterminate="true" android:progress="0" android:layout_marginTop="150dp" /> </LinearLayout>
解决方案
核心原因
getSupportActionBar()返回null主要有两个可能:
- 当前Activity使用的主题不包含ActionBar(比如继承
Theme.AppCompat.NoActionBar) - 调用
getSupportActionBar()的时机错误,需在setContentView()之后调用,因为ActionBar依赖布局加载
方案1:修正调用顺序并增加判空
调整代码中setContentView()和getSupportActionBar().hide()的顺序,同时增加非空判断避免崩溃:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_splash); // 先加载布局 if (getSupportActionBar() != null) { // 判空后再隐藏 getSupportActionBar().hide(); } Thread splashThread = new Thread(){ @Override public void run() { try { sleep(300); startActivity(new Intent(getApplicationContext(),MainActivity.class)); finish(); } catch (InterruptedException e) { e.printStackTrace(); } } }; splashThread.start(); }
方案2:直接使用无ActionBar主题
如果启动页不需要ActionBar,直接在AndroidManifest.xml中为SplashActivity指定无ActionBar主题,同时可以删除代码中getSupportActionBar().hide()的调用:
<activity android:name=".SplashActivity" android:theme="@style/Theme.AppCompat.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
额外检查点
- 查看
res/values/styles.xml中的AppTheme,如果它继承的是Theme.AppCompat.Light.NoActionBar,则全局都没有ActionBar,getSupportActionBar()必然返回null - 全屏效果也可以通过主题实现,比如使用
Theme.AppCompat.Light.NoActionBar.Fullscreen,无需手动添加FLAG_FULLSCREEN
内容的提问来源于stack exchange,提问作者Khalfan Mohamed
相关产品推荐
相关产品推荐

