我有一个Android应用程序,它在GridView中显示元素:这些元素中的每一个都是可点击的,并以其详细信息启动一个Activity;然后你可以通过第二个活动进行另一个活动来添加更多数据。 我的问题是:当我从第3个活动回到第2个活动时,我的应用程序崩溃了(我知道这是因为从第3个活动到第2个活动,所谓的第2个活动没有得到它需要的意图数据。)
我该怎么做才能解决这个问题? 我的Gridview调用了第二个活动
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Intent i = new Intent(getApplicationContext(), PokemonDetails.class);
i.putExtra("id", position);
startActivity(i);
}
});
我的第二个活动叫第3个:
pokeDetails.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(), MyPokeDetails.class);
startActivity(i);
}
});
答案 0 :(得分:2)
您可以使用 startActivityForResult()
例如:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
在SecondActivity
中设置要返回FirstActivity
的数据。如果您不想退回,请不要设置任何内容。
例如:在secondActivity中,如果要发回数据:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
如果您不想返回数据:
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
现在,在FirstActivity
课程中,请为onActivityResult()
方法编写以下代码。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}//onActivityResul
答案 1 :(得分:1)
你可以使用相同的按钮功能覆盖onBackPressed()方法。
@Override
public void onBackPressed() {
//put Intent to go back here
}
答案 2 :(得分:1)
当您返回时,应从最后一个状态重新创建您的活动。您是否在第二个活动中检查数据的意图是否为空?我想应用程序可能因此而崩溃。 您也可以使用savedInstanceState。
覆盖onCreate
并将您需要的ID放入捆绑包中。如果调用了第二个Activity的Bundle
,请查看<video loop autoplay muted poster="path/to/screenshot.jpg">
<source src="path/to/video.webm" type="video/webm">
<source src="path/to/video.ogg" type="video/ogg">
<source src="path/to/video.mp4" type="video/mp4">
</video>
是否为非null并获取您的值。
更多信息:https://developer.android.com/training/basics/activity-lifecycle/recreating.html
答案 3 :(得分:0)
您应该使用startActivityForResult()
代替startActivity()
。有关详细信息,请参阅this answer和Official documentation