Android学习之通过button单击事件用intent跳转页面程序闪退(Bug) | 您所在的位置:网站首页 › 有的网页退不出 › Android学习之通过button单击事件用intent跳转页面程序闪退(Bug) |
Android学习(BUG系列)之使用通过button单击事件用intent跳转页面程序闪退
引言原先代码错误分析修改代码其他错误
引言
在学习Android开发的过程中,遇到了一些简单的bug。 本次为了设计一个用户登陆界面,页面确实完成了设计,并且单一使用可以正常显示。 可如果再创建一个页面,并设计一个Button去OnClick它,并用Intent去start新创建的页面,就会出现程序闪退。 再三查找问题,综合网上查询所得,得到解决,但随之的,新的Bug又产生了,新的Bug先不考虑,本文重在解决Intent闪退问题(实际上是Button的findViewById()导致的)。 原先代码创建了三个Activity,第一个主启动的MainActivity.class,对应XML为activity_main.xml,第二个为初次学习Android控件布局用的LoginActivity.class,对应activity_login.xml,第三个为LoginActivity_2.class,对应activity_login_2.xml,是对第一个Login的再优化版本。 单刀直入,不摆出无关的代码了。 MainActivity protected void initView() { Button loginButton = findViewById(R.id.btn_Login); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, LoginActivity_2.class); startActivity(intent); } }); } }activity_main.xml 再看看登陆界面的XML: activity_login.xml 错误分析报错信息(空指针异常): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 看到这你是不是很快就明白了错误的原因?没错,就是因为两个XML中的Button的ID相同了,从而导致在MainActivity.class中使用Button loginButton = findViewById(R.id.btn_Login);时,系统懵逼了,这是用哪个btn_Login? 至此,本错误就显而易见的可以修改了,只需要将两个xml中的button的ID修改为不同值,再在class里面调用对应的id即可。 修改代码修改activity_main.xml的Button的id为 android:id="@+id/main_btn_Login"修改activity_login.xml的Button的id为 android:id="@+id/activity1_btn_login"最后,再在使用Intent的MainActivity.class修改id获取的对象是main_btn_Login即可。 Button loginButton = findViewById(R.id.main_btn_Login); 其他错误另外,再说说在查找问题的过程中发现的其他同类型问题。 本次遇到的,id相同,但xml居然不报错,太神奇了。没有注册Activity,也就是在AndroidMainifest.xml里声明,注册如下(非主启动页面): 隐式跳转没有添加默认的category,理论上最新版的Android Studio会自动加上。 现象应用出现崩溃异常后未整体退出,应用恢复正常使用后intent跳转Activity跳转失败,Activity生命周期也不执行。分析:应用崩溃后,栈内存在有异常的当前Activity,再次复用时出现了界面闪退问题。解决方案:设置启动模式为singleTask-栈内复用模式。从活动A跳到活动B,如果用putExtra存入key-value值,在B中Bundle bun = this.getIntent.getString()方法会报错。解决方案:从login到welcome报错,去掉B类的Bundle就能通过。外部直接使用findViewById()。 private Button loginButton = findViewById(R.id.main_btn_Login); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }解决方案:findViewById()不能优先于super.onCreate(savedInstanceState)和setContentView(R.layout.activity_main),修改在之后再进行即可。 综上,好好学习,天天Bug。 |
CopyRight 2018-2019 实验室设备网 版权所有 |