Android应用启动崩溃:调用Context.getApplicationInfo()触发空指针异常
Android首页启动崩溃:Context.getApplicationInfo()空指针异常(FAB展开动画相关)
我的Android应用在首页显示前崩溃,报错为调用android.content.Context.getApplicationInfo()时出现空指针异常。我原本想实现浮动操作按钮(FAB)展开显示两个按钮的动画,写了XML动画文件和点击触发逻辑,但一运行就崩。我是Android开发新手,会点Java,不知道怎么定位修复这个空指针问题。
相关代码如下:
private Animation rotateOpen() { return AnimationUtils.loadAnimation(this, R.anim.rotate_add_btn_open_anim); } private Animation rotateClose() { return AnimationUtils.loadAnimation(this, R.anim.rotate_add_btn_close_anim); } private Animation fromBottom() { return AnimationUtils.loadAnimation(this, R.anim.from_bottom_anim); } private Animation toBottom() { return AnimationUtils.loadAnimation(this, R.anim.to_bottom_anim); } Button addBtn = findViewById(R.id.add_btn); Button addTextBtn = findViewById(R.id.add_text_btn); Button addImageBtn = findViewById(R.id.add_image_btn); private boolean clicked = false; onCreate(..) { ... addBtn.setOnClickListener(v -> onFabExpanded()); addTextBtn.setOnClickListener(v -> Toast.makeText(MainActivity.this, R.string.add_text_note, Toast.LENGTH_SHORT).show()); addImageBtn.setOnClickListener(v -> Toast.makeText(MainActivity.this, R.string.add_image_note, Toast.LENGTH_SHORT).show()); } private void onFabExpanded() { setVisibility(clicked); setAnimation(clicked); clicked = !clicked; } private void setVisibility(Boolean clicked) { if (!clicked) { addTextBtn.setVisibility(View.VISIBLE); addImageBtn.setVisibility(View.VISIBLE); } else { addTextBtn.setVisibility(View.INVISIBLE); addImageBtn.setVisibility(View.INVISIBLE); } } private void setAnimation(Boolean clicked) { if (!clicked) { addTextBtn.startAnimation(fromBottom()); addImageBtn.startAnimation(fromBottom()); addBtn.startAnimation(rotateOpen()); } else { addTextBtn.startAnimation(toBottom()); addImageBtn.startAnimation(toBottom()); addBtn.startAnimation(rotateClose()); } }
问题根源
你直接在类成员位置调用findViewById(),这时候Activity还没完成初始化(onCreate()还没执行),this对应的Context还未就绪,导致AnimationUtils.loadAnimation()获取Context时出现空指针,进而触发getApplicationInfo()的空指针异常。
修复步骤
- 延迟控件初始化时机:把
findViewById()的调用移到onCreate()方法内部,且必须在setContentView()之后执行,确保布局已加载、Context已初始化。 - 空安全检查(可选但推荐):对获取到的控件对象做非空判断,避免后续操作出现空指针。
修正后的完整代码示例
public class MainActivity extends AppCompatActivity { private Animation rotateOpen() { return AnimationUtils.loadAnimation(this, R.anim.rotate_add_btn_open_anim); } private Animation rotateClose() { return AnimationUtils.loadAnimation(this, R.anim.rotate_add_btn_close_anim); } private Animation fromBottom() { return AnimationUtils.loadAnimation(this, R.anim.from_bottom_anim); } private Animation toBottom() { return AnimationUtils.loadAnimation(this, R.anim.to_bottom_anim); } private Button addBtn; private Button addTextBtn; private Button addImageBtn; private boolean clicked = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 必须先设置布局 // 在这里初始化控件 addBtn = findViewById(R.id.add_btn); addTextBtn = findViewById(R.id.add_text_btn); addImageBtn = findViewById(R.id.add_image_btn); addBtn.setOnClickListener(v -> onFabExpanded()); addTextBtn.setOnClickListener(v -> Toast.makeText(MainActivity.this, R.string.add_text_note, Toast.LENGTH_SHORT).show()); addImageBtn.setOnClickListener(v -> Toast.makeText(MainActivity.this, R.string.add_image_note, Toast.LENGTH_SHORT).show()); } private void onFabExpanded() { setVisibility(clicked); setAnimation(clicked); clicked = !clicked; } private void setVisibility(Boolean clicked) { if (!clicked) { addTextBtn.setVisibility(View.VISIBLE); addImageBtn.setVisibility(View.VISIBLE); } else { addTextBtn.setVisibility(View.INVISIBLE); addImageBtn.setVisibility(View.INVISIBLE); } } private void setAnimation(Boolean clicked) { if (!clicked) { addTextBtn.startAnimation(fromBottom()); addImageBtn.startAnimation(fromBottom()); addBtn.startAnimation(rotateOpen()); } else { addTextBtn.startAnimation(toBottom()); addImageBtn.startAnimation(toBottom()); addBtn.startAnimation(rotateClose()); } } }
额外注意事项
- 确保你的XML动画文件(
rotate_add_btn_open_anim.xml等)存在于res/anim目录下,且格式正确,避免因资源找不到引发额外异常。 - 如果使用的是Material Design的FAB(
FloatingActionButton),建议直接使用官方提供的扩展组件或动画API,更稳定且符合设计规范。
内容的提问来源于stack exchange,提问作者Andruid929
相关产品推荐
相关产品推荐

