如何在按下后退箭头图标时将意图数据发送回上一个 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