Android---如何返回上一Activity
Android 代码用来返回上一个activity 调用onKeyDown()时发生java.lang.NullPointerException.
来自:CSDN博客推荐文章 | 时间:2012-05-04 22:42:12
原文链接: http://blog.csdn.net/weiyirong/article/details/7536495
很多人想从一个Activity返回到上一级Activity时,考虑通过在点击事件里调用OnKeyDown事件来返回上一级,如下:
toolbarBack.setOnClickListener(newOnClickListener(){@Overridepublicvoid onClick(View v){OnKeyDown(KeyEvent.KEYCODE_BACK,null);}});
会发现报空指针错误,具体原因看下源码,你没传入的参数(即null)在OnKeyDown方法中使用到了,所以空指针。
其实返回上一级,不用考虑如此复杂,我们可以使用如下:直接结束当前Activity不就行了。测试可用
toolbarBack.setOnClickListener(newOnClickListener()
{@Overridepublicvoid onClick(View v){
ReaderActivity.this.finish();
}
});
注意:
要在第一个activity向第二个activity跳转的时候将第一个activity finish(),这样在第二个activity返回第一个activity时,就会执行第一个activity的onCreate()方法。
我尝试着在第一种方法中使用如下:
toolbarBack.setOnClickListener(newOnClickListener(){@Overridepublicvoid onClick(View v){OnKeyDown(KeyEvent.KEYCODE_BACK,newKeyEvent(KeyEvent.KEYCODE_BACK,KeyEvent.ACTION_DOWN));}});
虽说无空指针错误,但是没任何效果。我也不解,望知情的兄弟告知一声哈! 下面我再贴一些其他的 方法
Android实战总结之返回键返回上一级Activity(Intent的一种用法)
实现功能: 有两个Activity,一个为tabActivity,一个为EditActivity,tabActivity进入EditActivity后,在EditActivity中单击返回键返回tabActivity.
其实很简单,这其中涉及到onKeyDown(),和Intent。
只要在EditActivity中重写onKeyDown()实现捕获返回键,再加一Intent实现Activity的跳转。
具体实现:
1
2
3
4
5
6
7
8
9
10
11
|
@Override public boolean onKeyDown( int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK){ Intent myIntent = new Intent(); myIntent = new Intent(EditActivity. this , tabActivity. class ); startActivity(myIntent); this .finish(); } return super .onKeyDown(keyCode, event); } |
3.在A中用startActivityForResult(Intent intent,int requestcode)启动B,值得注意的是requestcode里的值在多个Activity时使用Reuest_OK,无法从B返回到a的onActivityResult。
重写A的onActivityResult(int requestCode, int resultCode, Intent data),B在返回前使用setResult(int resultCode,Intent data)设置返回的数据,最后调用b的finish后会返回A的onActivityResult方法。
看例子
3.11 返回数据到前一个Activity
startActivityForResult方法
范例说明
上一个范例中,好不容易将数据从Activity1传递至Activity2,如果要再回到Activity1,数据该不会要再封装一次吧?而且前一个Activity1早就被程序destroy了,倘若在Activity1最后以finish() 结束程序,再通过Activity2将数据采用Bundle的方式通过新打开Activity1传递参数,这样的做法虽然也可以恢复User输入的数据,但是并不符合我们的期待,尤其是User曾经输入过的数据,如果不小心点击回到上一页,数据就消失不见,这就不妙了。
有鉴于科技始终来自于人性,如果要在次页面加上一个"回上页"的按钮,而非通过模拟器的回复键,且回上页后又能保留之前输入的相关信息,那么就必须使用startActivityForResult()来唤起一个Activity。利用这个方法,前一个Activity1便会有一个等待次Activity2的返回,而返回的数据就可以达到我们想要的结果。
运行结果
(点击查看大图)图3-11 将数据返回到前一个Activity |
范例程序
- src/irdc.ex03_11/EX03_11.java
在Activity1主程序中调用Activity的方法更改成startActivityForResult(intent,0),其中0为下一个Activity要返回值的依据,可指定为自行定义的参考标识符(Identifier)。程序覆盖了onActivityResult() 这个方法,令程序在收到result后,再重新加载写回原本输入的值。
- package irdc.ex03_11;
- /* import相关class */
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
10. import android.widget.RadioButton;
- 11.
12. public class EX03_11 extends Activity
13. {
- 14. private EditText et;
- 15. private RadioButton rb1;
- 16. private RadioButton rb2;
- 17.
- 18. /** Called when the activity is first created. */
- 19. @Override
- 20. public void onCreate(Bundle savedInstanceState)
- 21. {
- 22. super.onCreate(savedInstanceState);
- 23. /* 载入main.xml Layout */
- 24. setContentView(R.layout.main);
- 25.
- 26. /* 以findViewById()取得Button对象,并添加onClickListener */
- 27. Button b1 = (Button) findViewById(R.id.button1);
- 28. b1.setOnClickListener(new Button.OnClickListener()
- 29. {
- 30. public void onClick(View v)
- 31. {
- 32. /*取得输入的身高*/
- 33. et = (EditText) findViewById(R.id.height);
- 34. double height=Double.parseDouble(et.getText().toString());
- 35. /*取得选择的性别*/
- 36. String sex="";
- 37. rb1 = (RadioButton) findViewById(R.id.sex1);
- 38. rb2 = (RadioButton) findViewById(R.id.sex2);
- 39. if(rb1.isChecked())
- 40. {
- 41. sex="M";
- 42. }
- 43. else
- 44. {
- 45. sex="F";
- 46. }
- 47.
- 48. /*new一个Intent对象,并指定class*/
- 49. Intent intent = new Intent();
- 50. intent.setClass(EX03_11.this,EX03_11_1.class);
- 51.
- 52. /*new一个Bundle对象,并将要传递的数据传入*/
- 53. Bundle bundle = new Bundle();
- 54. bundle.putDouble("height",height);
- 55. bundle.putString("sex",sex);
- 56.
- 57. /*将Bundle对象assign给Intent*/
- 58. intent.putExtras(bundle);
- 59.
- 60. /*调用Activity EX03_11_1*/
- 61. startActivityForResult(intent,0);
- 62. }
- 63. });
- 64. }
- 65.
- 66. /* 覆盖 onActivityResult()*/
- 67. @Override
- 68. protected void onActivityResult(int requestCode, int resultCode,
- 69. Intent data)
- 70. {
- 71. switch (resultCode)
- 72. {
- 73. case RESULT_OK:
- 74. /* 取得来自Activity2的数据,并显示于画面上 */
- 75. Bundle bunde = data.getExtras();
- 76. String sex = bunde.getString("sex");
- 77. double height = bunde.getDouble("height");
- 78.
- 79. et.setText(""+height);
- 80. if(sex.equals("M"))
- 81. {
- 82. rb1.setChecked(true);
- 83. }
- 84. else
- 85. {
- 86. rb2.setChecked(true);
- 87. }
- 88. break;
- 89. default:
- 90. break;
- 91. }
- 92. }
93. }
src/irdc.ex03_11/EX03_11_1.java
在Activity2的主程序中,设计当Button被点击时,将Bundle对象与结果返回给前一个Activity1。
- package irdc.ex03_11;
- /* import相关class */
- import java.text.DecimalFormat;
- import java.text.NumberFormat;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
10. import android.widget.Button;
11. import android.widget.TextView;
- 12.
13. public class EX03_11_1 extends Activity
14. {
- 15. Bundle bunde;
- 16. Intent intent;
- 17. /** Called when the activity is first created. */
- 18. @Override
- 19. public void onCreate(Bundle savedInstanceState)
- 20. {
- 21. super.onCreate(savedInstanceState);
- 22. /* 载入mylayout.xml Layout */
- 23. setContentView(R.layout.myalyout);
- 24.
- 25. /* 取得Intent中的Bundle对象 */
- 26. intent=this.getIntent();
- 27. bunde = intent.getExtras();
- 28.
- 29. /* 取得Bundle对象中的数据 */
- 30. String sex = bunde.getString("sex");
- 31. double height = bunde.getDouble("height");
- 32.
- 33. /* 判断性别 */
- 34. String sexText="";
- 35. if(sex.equals("M"))
- 36. {
- 37. sexText="男性";
- 38. }
- 39. else
- 40. {
- 41. sexText="女性";
- 42. }
- 43.
- 44. /* 取得标准体重 */
- 45. String weight=this.getWeight(sex, height);
- 46.
- 47. /* 设置输出文字 */
- 48. TextView tv1=(TextView) findViewById(R.id.text1);
- 49. tv1.setText("你是一位"+sexText+"\n你的身高是"+height+
- 50. "厘米\n你的标准体重是"+weight+"公斤");
- 51.
- 52. /* 以findViewById()取得Button对象,并添加onClickListener */
- 53. Button b1 = (Button) findViewById(R.id.button1);
- 54. b1.setOnClickListener(new Button.OnClickListener()
- 55. {
- 56. public void onClick(View v)
- 57. {
- 58. /* 返回result回上一个activity */
- 59. EX03_11_1.this.setResult(RESULT_OK, intent);
- 60.
- 61. /* 结束这个activity */
- 62. EX03_11_1.this.finish();
- 63. }
- 64. });
- 65. }
- 66.
- 67. /* 四舍五入的method */
- 68. private String format(double num)
- 69. {
- 70. NumberFormat formatter = new DecimalFormat("0.00");
- 71. String s=formatter.format(num);
- 72. return s;
- 73. }
- 74.
- 75. /* 以findViewById()取得Button对象,并添加onClickListener */
- 76. private String getWeight(String sex,double height)
- 77. {
- 78. String weight="";
- 79. if(sex.equals("M"))
- 80. {
- 81. weight=format((height-80)*0.7);
- 82. }
- 83. else
- 84. {
- 85. weight=format((height-70)*0.6);
- 86. }
- 87. return weight;
- 88. }
89. }
res/layout/mylayout.xml
mylayout.xml为Activity2(EX03_11_1)的Layout,其中定义了显示计算结果的TextView与回上一页的Button按钮。
- <?xml version="1.0" encoding="utf-8"?>
- <AbsoluteLayout
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- xmlns:android="http://schemas.android.com/apk/res/android"
- >
- <TextView
- android:id="@+id/text1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="20sp"
- android:layout_x="50px"
- android:layout_y="72px"
- >
- </TextView>
- <Button
- android:id="@+id/button1"
- android:layout_width="100px"
- android:layout_height="48px"
- android:text="回上一页"
- android:layout_x="110px"
- android:layout_y="180px"
- >
- </Button>
25. </AbsoluteLayout>
AndroidManifest.xml
范例中有两个Activity,所以AndroidManifest.xml里必须有这两个activity的声明,否则系统将无法运行。
- <?xml version="1.0" encoding="utf-8"?>
- <manifest
- xmlns:android="http://schemas.android.com/apk/res/android"
- package="irdc.ex03_11"
- android:versionCode="1"
- android:versionName="1.0.0">
- <application
- android:icon="@drawable/icon"
- android:label="@string/app_name">
- 10. <activity
- 11. android:name=".EX03_11"
- 12. android:label="@string/app_name">
- 13. <intent-filter>
- 14. <action android:name="android.intent.action.MAIN" />
- 15. <category android:name="android.intent.category.LAUNCHER" />
- 16. </intent-filter>
- 17. </activity>
- 18. <activity android:name="EX03_11_1"></activity>
- 19. </application>
20. </manifest>
扩展学习
范例中为了在回到上一页时,能够显示之前所输入的数据,故将原本传递次Activity的Intent(里面包含了有数据的Bundle对象)再重新返回给主Activity1。如果要在次Activity2中返回其它的数据,例如,经过计算后的结果、数据,此时只需将要返回的数据再放入Bundle对象中即可达成。
此外,以本范例而言,其实使用startActivity()也可达成同样的结果,仅需在主Activity被create时去判断Intent内有没有数据,有的话,就将数据带入;没有的话,就带入空值(null)。但程序还需要再做有无值的比较,较为繁琐,既然Android API中有提供更好用的方法,何来不用的道理?更何况如果系统不是只有几行代码,而是几十行、几百行代码,那时头可就大了!
Android---如何返回上一Activity的更多相关文章
- android webview点击返回键返回上一级activity
android webview点击返回键返回上一个activity @Override public boolean onKeyDown(int keyCode, KeyEvent event) { ...
- 从一个Activity返回上一个Activity
从一个Activity返回上一个Activity 要求:保留上一个Activity的数据 方法: 第一步:从Activity1转向Activity2时,用startActivityForResult而 ...
- android中按back键返回上一个activity,如何重新调用上一个activity的oncreate方法?
默认情况下是不会调用的. @Override public void onBackPressed() { String titleStr = edittitle.getText().toString( ...
- Android - 页面返回上一页面的三种方式
今年刚刚跳槽到了新公司,也开始转型做Android,由此开始Android的学习历程. 最近在解很多UI的bug,在解bug过程中,总结了在UI的实现过程中,页面返回上一页面的几种实现方式. 一. 自 ...
- android 中FragmentActivity中模拟返回键返回上一个Activity效果
FragmentTransaction中先加入一个Fragment,这个Fragment就是当前要显示的Fragment, 当通过事件触发显示第二个Fragment时,在加入第二个Fragment并调 ...
- Android双击返回键退出Activity的两种方法
在开发应用程序的时候,有一种功能是非常常用到的,那就是迅速双击返回按钮,然后实现退出Activity的功能.本人在网上看了很多资料代码,总结起来,主要有两种比较好的方式.一种是开线程延时执行,一种是记 ...
- Unity响应Android的返回键,退出当前Activity
一:使用 Application.Quit() public void Update() { if(Input.GetKeyDown(KeyCode.Escape)) Application.Quit ...
- android面试准备一之Activity相关
1.Activity生命周期 1.1 Activity的4种状态 running/paused/stopped/killed running:当前Activity正处于运行状态,指的是当前Ac ...
- Android开发:向下一个activity传递数据,返回数据给上一个activity
1.向下一个activity传递数据 activity1 Button button=(Button) findViewById(R.id.button1); button.setOnClickLis ...
随机推荐
- 使用gm和imageMagick处理图片
第一步安装imageMagick和gm模块 1, cnpm install --save imageMagick gm 第二步在服务器上安装imageMagick,下载地址http://www.ima ...
- ASP.NET MVC 部分视图
[部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 User Control.我们的页面往往会有许多重用的地方,可以进行封装重用.使用 部分视图 : 1. 可以简写代 ...
- win10下安装redis 服务
Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...
- diocp3-服务器的连接上限是到底是多少?diocp3的一个装13测试(8W连接数)
服务器的连接上限是到底是多少?diocp3开源项目的一个装13测试(8W连接数) 测试DEMO路径 diocp3\samples\ECHO 之前群里说一台服务器最多是High(Word)的连接数655 ...
- 如何在 Django 中保证并发的数据一致性
1. 关于锁 1.1 乐观锁 乐观锁的出发点是,同一条数据很少会因为并发修改而产生冲突,适用于读多写少的场景,用以提高吞吐量. 实现方式,读取一个字段,执行处理逻辑,当需要更新数据时,再次检查该字段是 ...
- Python(二)之对象类型
本篇记录Python对象类型 开始仍然是先掌握几个查看对象有用的函数,id,type,print 查看对象身份.类型.值:记住以下两个命令id,type 两个对象的比较 以上三个分别是 身份比较.对象 ...
- Android开发(七)——判断网络状态
项目中难免会出现使用网络的情况,使用网络前得进行网络判断,看网上的网友一般有多种实现版本. 第一种: // 是否有网络连接 public static boolean isNetworkConnect ...
- JSP怎么将表单提交到对应的servlet
昨天学习了这些内容,今天做一下分享吧,个人感觉挺乱的....呵呵,其实没事,慢慢就好了.难的不会,会的不难嘛!努力+认真就可以了,相信大家都可以的!加油!!! 下面的图是我用myeclipse建立的项 ...
- Docker 容器更新,打包,上传到阿里云
上几章讲了镜像的拉取和运行. 这次来尝试如何将已经运行的容器打包,封装成镜像,并且上传到阿里云上,为了别的地方下载和使用更加的方便. 首先,进入镜像,如果不清楚地,可以看下上一章. [root@VM_ ...
- [转]javaweb学习总结(二十九)——EL表达式
原文地址:https://www.cnblogs.com/xdp-gacl/p/3938361.html 一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获 ...