您的位置:首页 > 移动开发 > Android开发

Android---如何返回上一Activity

2013-05-24 19:51 260 查看


转自:/article/5013383.html


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

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

原文链接:http://blog.csdn.net/weiyirong/article/details/7536495

很多人想从一个Activity返回到上一级Activity时,考虑通过在点击事件里调用OnKeyDown事件来返回上一级,如下:
toolbarBack.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){OnKeyDown(KeyEvent.KEYCODE_BACK,null);}});


会发现报空指针错误,具体原因看下源码,你没传入的参数(即null)在OnKeyDown方法中使用到了,所以空指针。

其实返回上一级,不用考虑如此复杂,我们可以使用如下:直接结束当前Activity不就行了。测试可用
toolbarBack.setOnClickListener(newOnClickListener()
{@OverridepublicvoidonClick(Viewv){
ReaderActivity.this.finish();
}
});


注意:
要在第一个activity向第二个activity跳转的时候将第一个activityfinish(),这样在第二个activity返回第一个activity时,就会执行第一个activity的onCreate()方法。


我尝试着在第一种方法中使用如下:

toolbarBack.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){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(Intentintent,intrequestcode)启动B,值得注意的是requestcode里的值在多个Activity时使用Reuest_OK,无法从B返回到a的onActivityResult。
重写A的onActivityResult(intrequestCode,intresultCode,Intentdata),B在返回前使用setResult(intresultCode,Intentdata)设置返回的数据,最后调用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后,再重新加载写回原本输入的值。


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.@Override
20.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.else
44.{
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.@Override
68.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.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。


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.@Override
19.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.else
40.{
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.else
84.{
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="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的声明,否则系统将无法运行。


<?xmlversion="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.<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)。但程序还需要再做有无值的比较,较为繁琐,既然AndroidAPI中有提供更好用的方法,何来不用的道理?更何况如果系统不是只有几行代码,而是几十行、几百行代码,那时头可就大了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: