Android Studio中实现Snackbar点击按钮后应用崩溃问题求助
问题分析与修复方案
你的应用崩溃核心原因有两个:
- 空指针异常:
CoordinatorLayout layout变量仅声明但未初始化,调用Snackbar.make(layout, ...)时传入了null对象 - 逻辑顺序错误:先启动
SecondActivity让MainActivity进入后台,后续显示的Snackbar用户无法看到,同时不符合预期交互逻辑
另外,用System.exit(0)关闭应用并非Android平台规范做法,建议采用更合理的方式。
修复步骤
- 初始化CoordinatorLayout:在
onCreate中通过findViewById绑定布局中的CoordinatorLayout组件(确保activity_main.xml里存在对应id的CoordinatorLayout) - 调整逻辑顺序:先显示Snackbar再启动Activity,可添加延迟让用户看清提示
- 规范应用关闭方式:替换
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
相关产品推荐
相关产品推荐

