【问题标题】:Failing moving data from Activity C through Activity B to Activity A无法将数据从活动 C 通过活动 B 移动到活动 A
【发布时间】:2020-06-14 03:00:05
【问题描述】:

我正在尝试移动一些数据,问题是,当我直接从活动 A 跳转到活动 C(以下称为 A 和 C)时,进行一些更改并按下按钮,我从 C 回到 A 时没有数据丢失。它完美地更新了我的不同文本框、搜索栏等。

但是当我从 A 经由 B 到 C,然后返回 - 再次通过 B - 到 A 时,我没有随身携带我的数据。 A 不会随着 C 中所做的更改而更新。

这是我尝试过的(我尝试只显示我认为相关的代码):

活动 A(主要):

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(savedInstanceState!=null)
        games= (ArrayList<Game>) savedInstanceState.getSerializable("SAVED");
    else
        loadArrayFile();

...
A lot of unrelated code ..
...
// Here I want to go from A to B
        listMyGames.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
            Game game = (Game) arg0.getItemAtPosition(position);
            Intent intent = new Intent(MainActivity.this, SpecialsActivity.class);

            intent.putExtra("game", game);
            intent.putExtra("pos", position);
            intent.putExtra("image", game.getImage());

            startActivity(intent); <<<<<<<< HERE IS THE ERROR
        }
    });

我猜这部分工作正常。

然后我在 Activity A 中有一个 onActivityResult 方法 - 当我从 C 到 B 再到 A 时处理来自 B 的“输入”:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if (resultCode == RESULT_OK) {
            Game updatedGameSpecials = (Game)data.getSerializableExtra("updatedGameSpecials");
            int position = data.getIntExtra("pos", -1);

            adapter.remove(adapter.getItem(position));
            adapter.insert(updatedGameSpecials, position);
        }
    }
}

...
...

这就是我认为与 A 相关的内容。继续活动 B

// Inside the onCreate-method:
...
    btnGoToChangesActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    Intent intent = new Intent(SpecialsActivity.this, ChangesActivity.class);

        intent.putExtra("game", game);
        intent.putExtra("pos", position);
        intent.putExtra("image", game.getImage());
        startActivityForResult(intent, 1);
    }
});

但我在 B 中也有一个 onActivityResult 方法,如下所示:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if (resultCode == RESULT_OK) {
            Game updatedGameSpecials = (Game)data.getSerializableExtra("updatedGameSpecials");
            int position = data.getIntExtra("pos", -1);
            data.putExtra("updatedGameSpecials", updatedGameSpecials);
            data.putExtra("pos", position);
            setResult(RESULT_OK, data);
            finish();
        }
    }
}

最后是我的活动 C。在这里我做了一些更改——使用搜索栏对主题进行评分、填写文本框等。

我有一个按钮,当我按下它时,它应该转到 B(在 C 中所做的更改),从那里直接到 A。这样做的原因而不是从 C 直接跳转到 A 和“ finish()" B,当从 B 转到 C 时,我无法完成() B,因为我在 C 中有一个“取消”按钮,按下时会将我从 C 带到 B:

btnSaveChanges.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    game.setGameChanges(etGameChanges.getText().toString());

    Intent data = new Intent();

    position = getIntent().getIntExtra("pos", -1);
    data.putExtra("pos", position);
    data.putExtra("updatedGameSpecials", game);
    setResult(RESULT_OK, data);
    finish();
}
});

请注意,当在 Activity A 中使用 onItemLongClick 时,它会以某种方式起作用……但这不是本意。目的是通过 B 到 C 并通过 B 从 C 到 A... 因此,当我使用此功能并从 A 转到 C 并再次返回时,数据(/C 中的更改)不会丢失,而是在 A 中更新:

listMyList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    Game game = (Game)parent.getItemAtPosition(position);
    Intent intent = new Intent(MainActivity.this, ChangesActivity.class);

    intent.putExtra("game", game);
    intent.putExtra("position", position);
    intent.putExtra("image", game.getImage());
    startActivityForResult(intent, 1);
    return true;
 }
});

我错过了什么或做错了什么?我看不到任何错误,我认为我把Extra放在了正确的地方,但我显然遗漏了一些东西..

【问题讨论】:

    标签: java android-studio android-activity android-lifecycle


    【解决方案1】:

    在尝试了几个小时不同的事情后,我发现,这一切都恢复了使用

    startActivity(intent)
    

    改为

    startActivityForResult(intent, 1)
    

    在活动 A...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2021-10-30
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多