如何在按下后退箭头图标时将意图数据发送回上一个 activity?
How to send intent data back to previous activity when back arrow icon is pressed?
我有一个 Android 应用程序,它在 GridView 中显示元素:这些元素中的每一个都是可点击的,并启动一个 Activity 及其详细信息;然后你可以通过第二个 activity 来添加更多数据。
我的问题是:当我从 3rd 返回到 2nd activity 时,我的应用程序崩溃了(我知道这是因为从 3rd activity 返回到 2nd 时,所谓的 2nd 没有得到意图它需要的数据)。
我该怎么做才能解决这个问题?
我的 Gridview 调用第二个 activity
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);
}
});
我的第二个 activity 呼叫第三个:
pokeDetails.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(), MyPokeDetails.class);
startActivity(i);
}
});
您应该使用 startActivityForResult()
而不是 startActivity()
有关详细信息,请参阅 this answer and Official documentation
您可以使用 startActivityForResult()
例如:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
在您的 SecondActivity
中,将您想要 return 的数据设置回 FirstActivity
。如果您不想return返回,请不要设置。
例如:在secondActivity中如果要发回数据:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
如果你不想return数据:
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
现在在您的 FirstActivity
class 中为 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
您可以使用按钮的相同功能覆盖 onBackPressed() 方法。
@Override
public void onBackPressed() {
//put Intent to go back here
}
您的 activity 应该会在您回到上次状态时重新创建。您是否检查您的第二个 activity 中的数据意图是否为非空?我想该应用程序可能因此而崩溃。
您还可以使用 savedInstanceState。
覆盖 onSaveInstanceState
并将您需要的 ID 放入包中。如果第二个 Activity 的 onCreate
被调用,请查看 Bundle
是否为非 null 并获取您的值。
更多信息:https://developer.android.com/training/basics/activity-lifecycle/recreating.html
我有一个 Android 应用程序,它在 GridView 中显示元素:这些元素中的每一个都是可点击的,并启动一个 Activity 及其详细信息;然后你可以通过第二个 activity 来添加更多数据。 我的问题是:当我从 3rd 返回到 2nd activity 时,我的应用程序崩溃了(我知道这是因为从 3rd activity 返回到 2nd 时,所谓的 2nd 没有得到意图它需要的数据)。
我该怎么做才能解决这个问题? 我的 Gridview 调用第二个 activity
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);
}
});
我的第二个 activity 呼叫第三个:
pokeDetails.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getApplicationContext(), MyPokeDetails.class);
startActivity(i);
}
});
您应该使用 startActivityForResult()
而不是 startActivity()
有关详细信息,请参阅 this answer and Official documentation
您可以使用 startActivityForResult()
例如:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
在您的 SecondActivity
中,将您想要 return 的数据设置回 FirstActivity
。如果您不想return返回,请不要设置。
例如:在secondActivity中如果要发回数据:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
如果你不想return数据:
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
现在在您的 FirstActivity
class 中为 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
您可以使用按钮的相同功能覆盖 onBackPressed() 方法。
@Override
public void onBackPressed() {
//put Intent to go back here
}
您的 activity 应该会在您回到上次状态时重新创建。您是否检查您的第二个 activity 中的数据意图是否为非空?我想该应用程序可能因此而崩溃。 您还可以使用 savedInstanceState。
覆盖 onSaveInstanceState
并将您需要的 ID 放入包中。如果第二个 Activity 的 onCreate
被调用,请查看 Bundle
是否为非 null 并获取您的值。
更多信息:https://developer.android.com/training/basics/activity-lifecycle/recreating.html