1

当调用另一个活动时,我可以确定我存储在当前活动中的变量在它返回时会存在吗?

new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapter, View item, int pos, long id)  {
        Intent i = new Intent(Activity1.this, Activity2.class);
        i.putExtra("position", pos); // 1
        position = pos; // 2
        startActivityForResult(i, REQUEST_CODE); // brings up the edit item activity
    }
});

对于上面的代码,我可以通过存储在当前活动实例字段中来使用 (2),还是应该使用 (1) 传递值,然后使用getIntExtra()inonActivityResult()来恢复该值?

4

4 回答 4

1

是的,它会在您返回Activity1时出现,因此无需使用getIntExtra. 只需将您的位置存储在Activity1的全局变量中。

于 2016-06-09T14:02:39.657 回答
1

理想情况下,您只需将状态保存在Activity1. 这样你就不必传递变量Activity2,然后将结果(这不完全是在 中所做的任何事情的结果Activity2)传回Activity1. position要保存in的值,Activity1您应该在您的内部执行以下操作Activity

    private static final String KEY_ARG_POSITION = "KEY_ARG_POSITION";

    private int position;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Do whatever you are doing in onCreate already...

        if (savedInstanceState != null) {
            position = savedInstanceState.getInt(KEY_ARG_POSITION);
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt(KEY_ARG_POSITION, position);
    }

如果您不想在屏幕方向更改或操作系统终止并重新启动您的活动时丢失该值,这也是相关的。

最后,为了保持代码井井有条,除非您需要使用positionin的值,否则Activity2我建议不要暴露Activity2任何不需要管理的数据。如果你正在开发一个大型应用程序,这些事情可能会加起来很快就会变得一团糟。

于 2016-06-09T16:25:20.727 回答
0

我的建议:在 中传递足够的信息Intent来唯一标识感兴趣的数据项。不要只传递一个位置,因为如果项目的顺序发生变化或其他项目从列表中添加/删除,位置可能会发生变化。想象一个场景,您将位置 2 传递给Activity2,但是在Activity2启动时,Activity1重新加载其数据并且位置 2 现在是其他项目。

此外,我不会依赖调用 Activity 的实例成员(即position = pos代码中的行)。Activity1当另一个活动是直接的前台活动时,您可能会被杀死。在那种情况下,返回结果时会重新创建它Activity1,但它会是一个新的Activity1实例,所以你的实例成员position不会有你之前设置的数据。

于 2016-06-09T14:55:58.153 回答
0

使用 startActivityForResult... 时,您提供的请求代码将在您的 onActivityResult 方法中返回。在那里,您将获得请求代码以及结果代码(成功、失败等)以及您可以从您开始的活动中设置的 Intent 数据。

所以你可以这样做:

Intent i = new Intent(Activity1.this, Activity2.class);
i.putExtra("position", pos);
startActivityForResult(i, REQUEST_CODE);

然后在您的 Activity2 课程中

Intent intent = new Intent();
intent.putExtras(getIntent().getExtra("position"));
setResult(RESULT_OK, intent);
finish();

在您的第一个活动中将调用:

 onActivityResult(int requestCode, int resultCode, Intent data) {
//Check it's your requestCode,
//Check resultCode == RESULT_OK or whatever you need
//Grab your position from the data intent
}

有关更多信息,请参阅https://developer.android.com/training/basics/intents/result.html

于 2016-06-09T14:02:25.810 回答