Android---如何返回上一Activity
2013-11-25 12:33
1176 查看
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的跳转。
具体实现:
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"
10. android:layout_height="wrap_content"
11. android:textSize="20sp"
12. android:layout_x="50px"
13. android:layout_y="72px"
14. >
15. </TextView>
16. <Button
17. android:id="@+id/button1"
18. android:layout_width="100px"
19. android:layout_height="48px"
20. android:text="回上一页"
21. android:layout_x="110px"
22. android:layout_y="180px"
23. >
24. </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---如何返回上一Activity
- Android---如何返回上一Activity
- Android MIUI系统调用拍照后不返回当前activity如何解决
- Android---如何返回上一Activity
- 如何在android中设置一个返回button,点击后返回上一个activity?
- Android---如何返回上一Activity
- Android开发中如何结束所有的activity
- Android源码学习之一-Activity是如何实现主题变化的
- android:如果手机安装了app则打开一个activity,如果没有安装则去到android market如何在HTML页面实现
- android开发中如何结束所有的activity
- 如何在 Android 程序中禁止屏幕旋转和重启Activity
- android 之得到新打开Activity 关闭后返回的数据
- android中如何在得到返回数据后设置图片
- android webview 如何去广告和如何解决重定向返回的问题。
- android 中FragmentActivity中模拟返回键返回上一个Activity效果
- Android 避免Activity重复创建 一次finish()返回上个页面
- Android 如何获取当前Activity实例对象?
- Android 如何监听返回键,弹出一个退出对话框
- 3月23日,从子 activity 获取返回结果,Android 开发,每日20行,第14天。