背景:作业里边有一题,要求为物理按键——返回键,实现数据传递的功能。当点击返回键时,保存已经在当前activity中输入的数据,并将数据传递给目标activity(这里目标activity为mainactivity)。如图↓
于是先在网上搜索,Android 按返回键怎么传递数据?
网上的描述都很简单,寥寥几行代码。主要有两种方法。
方法一:重写返回键方法
public boolean onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)
{
这里写自己的操作,此方法兼容Android 1.0到Android 2.1
}
}
我这里的代码:
//注:Intent黄色因为我在搜索Intent。backIntent有下划线是我重复定义了两次,当时写的时候小失误,后面已更正。
乍一看,这里的代码好像就可以实现功能了。但是实际上运行的时候,并不能达到想要的效果,点击返回时,不但没有保存我在当前activity已经输入的数据,而且还将我的mainactivity给重置为了初始状态。
问题出在哪里呢?问题在于我这里少写了一句话,又多写了一句话。
少写的代码:setResult(RESULT_OK,backIntent);
将这句代码加入到最后一行。
该方法的原型:setResult(int resultCode, Intent data)
第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED , RESULT_OK该值默认为-1。
第二个参数:一个Intent对象,返回给主Activity的数据。在intent对象携带了要返回的数据,使用putExtra( )方法。
加入这句话后,成功实现事件。点击返回键,成功保存数据。直到这里我才得到了启发:实际上我们需要做的事就是,给返回键添加一个相当于确定键的功能。点击返回键,相当于点击了确定键。
确定键的部分代码如下:
我只需要给返回键添加与确定键一样的返回值,就可以实现事件。点击确定键返回RESULT_OK,即resultCode==RESULT_OK
。所以我给上面的代码添加了setResult(RESULT_OK,backIntent);
之后,返回键的返回值就跟确定键的返回值一样了。
多的一句话是startActivity(backIntent);
为什么呢?
我们知道,activity的调用实际上在内存中是一个压栈的过程,调用一个activity就压一次栈。
以这个代码为例,这个app有两个activity:
启动app,首先调用的是LifePriceMainActivity,将该Activity压栈,随后我们通过事件(在这不特别指出调用事件的代码,这不是我们的重点)调用了GoodEditActivity,此时压栈GoodEditActivity。
所以我们不需要为返回键添加startActivity方法,因为点击返回键,GoodEditActivity出栈,LifePriceMainActivity回到栈顶,也就是此时显示的是LifePriceMainActivity,所以调用这个方法是多此一举的,删掉删掉。
完整代码:
@Override
// 重写物理返回键方法
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK){
String back_name=((EditText)findViewById(R.id.edit_text_good_name)).getText().toString();
String back_price=((EditText)findViewById(R.id.edit_text_good_price)).getText().toString();
Intent backIntent = new Intent(GoodEditActivity.this,LifePriceMainActivity.class);
Bundle back_bundle = new Bundle();
back_bundle.putCharSequence("back_name",back_name);
back_bundle.putCharSequence("back_price",back_price);
backIntent.putExtras(back_bundle);
setResult(RESULT_OK,backIntent);
GoodEditActivity.this.finish();
}
return super.onKeyDown(keyCode,event);
}
}
方法二:捕获返回按钮事件
@Override
public void onBackPressed() {
// 这里写自己的操作,该方法仅适用于2.0或更新版的sdk
return;
}
有了上面的思考,用这个方法写就很顺利了,一样的思路,写完操作代码后,加上这句代码setResult(RESULT_OK,backIntent);
就可以
完整代码:
@Override
//捕获返回按钮事件方法
public void onBackPressed(){
Intent backIntent = new Intent();
backIntent.putExtra("edit_position",editPosition);
backIntent.putExtra("good_name",editTextGoodName.getText().toString());
backIntent.putExtra("good_price",Double.parseDouble(editTextGoodPrice.getText().toString()));
setResult(RESULT_OK,backIntent);
GoodEditActivity.this.finish();
}
总结:多思考,多尝试,就会得到启发。(随便吐槽一句,网上这方面的代码好多都没有注释,对初学者太不友好了)