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

Android Studio中实现Snackbar点击按钮后应用崩溃问题求助

问题分析与修复方案

你的应用崩溃核心原因有两个:

  • 空指针异常:CoordinatorLayout layout变量仅声明但未初始化,调用Snackbar.make(layout, ...)时传入了null对象
  • 逻辑顺序错误:先启动SecondActivity让MainActivity进入后台,后续显示的Snackbar用户无法看到,同时不符合预期交互逻辑

另外,用System.exit(0)关闭应用并非Android平台规范做法,建议采用更合理的方式。


修复步骤

  1. 初始化CoordinatorLayout:在onCreate中通过findViewById绑定布局中的CoordinatorLayout组件(确保activity_main.xml里存在对应id的CoordinatorLayout)
  2. 调整逻辑顺序:先显示Snackbar再启动Activity,可添加延迟让用户看清提示
  3. 规范应用关闭方式:替换System.exit(0)为finishAffinity()(关闭所有关联Activity),若仅需关闭当前MainActivity,用finish()即可

修复后的完整代码

import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.google.android.material.snackbar.Snackbar;

public class MainActivity extends AppCompatActivity {

    Button button;
    CoordinatorLayout layout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);
        // 初始化CoordinatorLayout,替换为你布局中实际的id
        layout = findViewById(R.id.coordinator_layout);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 先显示Snackbar
                Snackbar snackbar = Snackbar.make(layout, "moving to second screen",
                        Snackbar.LENGTH_LONG).setAction("CLOSE", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        // 规范关闭应用的方式
                        finishAffinity();
                    }
                });
                snackbar.show();

                // 延迟1.5秒启动SecondActivity,让用户看到提示
                view.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                        startActivity(intent);
                    }
                }, 1500);
            }
        });
    }
}

额外注意事项

  • 确保activity_main.xml布局中存在CoordinatorLayout,示例布局片段:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/coordinator_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go to Second Screen"
        android:layout_gravity="center"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
  • 若不需要延迟启动Activity,直接将startActivity放在snackbar.show()之后即可,但此时MainActivity会快速进入后台,Snackbar仅短暂显示

内容的提问来源于stack exchange,提问作者TheGoldenGear_RR5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:39:27