1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android---如何返回上一Activity

Android---如何返回上一Activity

时间:2019-03-08 09:40:15

相关推荐

Android---如何返回上一Activity

Android 代码用来返回上一个activity 调用onKeyDown()时发生java.lang.NullPointerException.

来自:CSDN博客推荐文章 |时间:-05-04 22:42:12

原文链接:/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的返回,而返回的数据就可以达到我们想要的结果。

运行结果

范例程序

src/irdc.ex03_11/EX03_11.java

在Activity1主程序中调用Activity的方法更改成startActivityForResult(intent,0),其中0为下一个Activity要返回值的依据,可指定为自行定义的参考标识符(Identifier)。程序覆盖了onActivityResult() 这个方法,令程序在收到result后,再重新加载写回原本输入的值。

packageirdc.ex03_11; /*import相关class*/importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;

10.importandroid.widget.RadioButton;

11.

12.publicclassEX03_11extendsActivity

13. {

14.privateEditTextet; 15.privateRadioButtonrb1; 16.privateRadioButtonrb2; 17. 18. /**Calledwhentheactivityisfirstcreated.*/19. @Override20.publicvoidonCreate(BundlesavedInstanceState) 21. { 22.super.onCreate(savedInstanceState); 23. /*载入main.xmlLayout*/24. setContentView(R.layout.main); 25. 26. /*以findViewById()取得Button对象,并添加onClickListener*/27. Buttonb1=(Button)findViewById(R.id.button1); 28. b1.setOnClickListener(newButton.OnClickListener() 29. { 30.publicvoidonClick(Viewv) 31. { 32. /*取得输入的身高*/33. et=(EditText)findViewById(R.id.height); 34.doubleheight=Double.parseDouble(et.getText().toString()); 35. /*取得选择的性别*/36. Stringsex=""; 37. rb1=(RadioButton)findViewById(R.id.sex1); 38. rb2=(RadioButton)findViewById(R.id.sex2); 39.if(rb1.isChecked()) 40. { 41. sex="M"; 42. } 43.else44. { 45. sex="F"; 46. } 47. 48. /*new一个Intent对象,并指定class*/49. Intentintent=newIntent(); 50. intent.setClass(EX03_11.this,EX03_11_1.class); 51. 52. /*new一个Bundle对象,并将要传递的数据传入*/53. Bundlebundle=newBundle(); 54. bundle.putDouble("height",height); 55. bundle.putString("sex",sex); 56. 57. /*将Bundle对象assign给Intent*/58. intent.putExtras(bundle); 59. 60. /*调用ActivityEX03_11_1*/61. startActivityForResult(intent,0); 62. } 63. }); 64. } 65. 66. /*覆盖onActivityResult()*/67. @Override68.protectedvoidonActivityResult(intrequestCode,intresultCode, 69. Intentdata) 70. { 71.switch(resultCode) 72. { 73.caseRESULT_OK: 74. /*取得来自Activity2的数据,并显示于画面上*/ 75. Bundlebunde=data.getExtras(); 76. Stringsex=bunde.getString("sex"); 77.doubleheight=bunde.getDouble("height"); 78. 79. et.setText(""+height); 80.if(sex.equals("M")) 81. { 82. rb1.setChecked(true); 83. } 84.else85. { 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。

packageirdc.ex03_11; /*import相关class*/importjava.text.DecimalFormat;importjava.text.NumberFormat;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;

10.importandroid.widget.Button;

11.importandroid.widget.TextView;

12.

13.publicclassEX03_11_1extendsActivity

14. {

15. Bundlebunde; 16. Intentintent; 17. /**Calledwhentheactivityisfirstcreated.*/18. @Override19.publicvoidonCreate(BundlesavedInstanceState) 20. { 21.super.onCreate(savedInstanceState); 22. /*载入mylayout.xmlLayout*/23. setContentView(R.layout.myalyout); 24. 25. /*取得Intent中的Bundle对象*/26. intent=this.getIntent(); 27. bunde=intent.getExtras(); 28. 29. /*取得Bundle对象中的数据*/30. Stringsex=bunde.getString("sex"); 31.doubleheight=bunde.getDouble("height"); 32. 33. /*判断性别*/34. StringsexText=""; 35.if(sex.equals("M")) 36. { 37. sexText="男性"; 38. } 39.else40. { 41. sexText="女性"; 42. } 43. 44. /*取得标准体重*/45. Stringweight=this.getWeight(sex,height); 46. 47. /*设置输出文字*/48. TextViewtv1=(TextView)findViewById(R.id.text1); 49. tv1.setText("你是一位"+sexText+"\n你的身高是"+height+ 50. "厘米\n你的标准体重是"+weight+"公斤"); 51. 52. /*以findViewById()取得Button对象,并添加onClickListener*/53. Buttonb1=(Button)findViewById(R.id.button1); 54. b1.setOnClickListener(newButton.OnClickListener() 55. { 56.publicvoidonClick(Viewv) 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.privateStringformat(doublenum) 69. { 70. NumberFormatformatter=newDecimalFormat("0.00"); 71. Strings=formatter.format(num); 72.returns; 73. } 74. 75. /*以findViewById()取得Button对象,并添加onClickListener*/ 76.privateStringgetWeight(Stringsex,doubleheight) 77. { 78. Stringweight=""; 79.if(sex.equals("M")) 80. { 81. weight=format((height-80)*0.7); 82. } 83.else84. { 85. weight=format((height-70)*0.6); 86. } 87.returnweight; 88. }

89. }

res/layout/mylayout.xml

mylayout.xml为Activity2(EX03_11_1)的Layout,其中定义了显示计算结果的TextView与回上一页的Button按钮。

<?xmlversion="1.0"encoding="utf-8"?> <AbsoluteLayout android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/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的声明,否则系统将无法运行。

<?xmlversion="1.0"encoding="utf-8"?> <manifest xmlns:android="/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. <actionandroid:name="android.intent.action.MAIN"/> 15. <categoryandroid:name="android.intent.category.LAUNCHER"/> 16. </intent-filter> 17. </activity> 18. <activityandroid:name="EX03_11_1"></activity> 19. </application>

20. </manifest>

扩展学习

范例中为了在回到上一页时,能够显示之前所输入的数据,故将原本传递次Activity的Intent(里面包含了有数据的Bundle对象)再重新返回给主Activity1。如果要在次Activity2中返回其它的数据,例如,经过计算后的结果、数据,此时只需将要返回的数据再放入Bundle对象中即可达成。

此外,以本范例而言,其实使用startActivity()也可达成同样的结果,仅需在主Activity被create时去判断Intent内有没有数据,有的话,就将数据带入;没有的话,就带入空值(null)。但程序还需要再做有无值的比较,较为繁琐,既然Android API中有提供更好用的方法,何来不用的道理?更何况如果系统不是只有几行代码,而是几十行、几百行代码,那时头可就大了!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。