我将onRreate()中的setResult(200)放在子活动中。
但是一旦我从父母调用了finishActivity(),我得到了resultCode 0。
我不知道如何解释这种情况。
04-25 11:52:55.191: D/TEST(28141): onActivityResult 1000 : 0 : null
父母是:
public class Main extends Activity {
Button b;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(Main.this, Popup.class);
startActivityForResult(intent, 1000);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
Main.this.finishActivity(1000);
}
}, 1000);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("TEST", "onActivityResult " + requestCode + " : " + resultCode + " : " + data);
super.onActivityResult(requestCode, resultCode, data);
}
}
孩子:
public class Popup extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setResult(200);
}
}
更新:
我明白,当儿童活动结束时,onActivityResult()
会被调用
并且调用finishActivity()
无法获得子活动的ActivityResult。
但是,一旦子活动被父活动破坏,我想知道获取ActivityResult(resultCode和intent数据)的正确方法。
是否有任何理由不应该像波纹管代码那样做? (我只是很好奇。)
因为看起来工作正常。
我这样编码:
public class Main extends Activity {
Button b;
public static boolean closePopup = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
closePopup = false;
Intent intent = new Intent(Main.this, Popup.class);
startActivityForResult(intent, 1000);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
closePopup = true;
}
}, 1000);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("TEST", "onActivityResult " + requestCode + " : " + resultCode + " : " + data);
super.onActivityResult(requestCode, resultCode, data);
}
}
public class Popup extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCloseHandler.sendEmptyMessage(0);
}
Handler mCloseHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (Main.closePopup == true) {
Popup.this.finish();
} else {
mCloseHandler.sendEmptyMessageDelayed(0, 100);
}
}
};
@Override
public void finish() {
setResult(200);
super.finish();
}
}
答案 0 :(得分:1)
在Popup
活动中使用
if(null != getParent())
getParent().setResult(200);
else
setResult(200);
而不只是setResult(200);
因为您需要将数据绑定到父活动并设置结果。
<强>更新强>
了解finish()
和finishActivity (int requestCode)
完成()
在您的活动完成后调用此选项并应关闭。该 ActivityResult会传播回通过你发送给你的人 onActivityResult()。
finishActivity(int requestCode)
强制完成您之前开始的另一项活动 startActivityForResult(Intent,int)。
因此,在您的情况下,您正在finishActivity
上调用正在完成子活动Main
的{{1}}。因此,您将结果代码设置为0,将intent设置为null(默认值),因为数据不会传播回Main(Parent)。
我建议您按如下方式修改代码并尝试:
在Popup
中的finish()
之后致电setResult(200);
。
Popup
更新2: 让我进一步解释一下。
使用if(null != getParent())
getParent().setResult(200);
else
setResult(200);
finish();
方法调用启动活动时,子活动结束后,将调用子活动上的startActivityForResult()
方法,您可以根据结果执行操作。
启动的活动(子活动)还可以设置调用者可以用来确定活动是否被取消的结果代码。(您的情况)
子活动使用onActivityResult()
方法创建新意图并将数据放入其中。它还通过finish()
方法调用设置结果。
如果子活动完成,它可以通过setResult()
将数据发送回其呼叫者。这是在Intent
方法中完成的。所以你可以按如下方式覆盖finish方法。
finish()