You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:55:29