无法将数据从 Activity C 通过 Activity B 移动到 Activity A
Failing moving data from Activity C through Activity B to Activity A
我正在尝试移动一些数据,问题是,当我直接从 Activity A 跳转到 Activity C(以下称为 A和 C),做一些更改并按下按钮,当从 C 返回到 A 时,我没有丢失数据。它完美地更新了我不同的文本框、搜索栏等。
但是当我通过 B 从 A 到 C,然后返回 - 再次通过 B - 到 A 时,我没有得到我的数据。 A 不会随着 C 中所做的更改而更新。
这是我尝试过的方法(我尝试只显示我认为相关的代码):
Activity 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-method - 当我从 C 到 B 再到 A 时处理来自 B 的 "input":
@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 相关的内容。继续 Activity 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();
}
}
}
最后是我的 Activity C。我在这里做了一些更改 - 使用搜索栏对主题进行评分,填写文本框等。
我有一个按钮,当我按下它时,它应该转到 B(在 C 中进行了更改),从那里直接转到 A。这样做的原因而不是从 C 直接跳到 A "finish()" B,当从 B 到 C 时,我无法完成()B,因为我在 C 中有一个 "cancel"-按钮,当按下时,我从 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,从C通过B去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 放到了正确的地方,但我显然遗漏了一些东西..
在尝试了几个小时不同的东西之后,我发现,一切都恢复了使用
startActivity(intent)
改为
startActivityForResult(intent, 1)
里面Activity一个...
我正在尝试移动一些数据,问题是,当我直接从 Activity A 跳转到 Activity C(以下称为 A和 C),做一些更改并按下按钮,当从 C 返回到 A 时,我没有丢失数据。它完美地更新了我不同的文本框、搜索栏等。
但是当我通过 B 从 A 到 C,然后返回 - 再次通过 B - 到 A 时,我没有得到我的数据。 A 不会随着 C 中所做的更改而更新。
这是我尝试过的方法(我尝试只显示我认为相关的代码):
Activity 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-method - 当我从 C 到 B 再到 A 时处理来自 B 的 "input":
@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 相关的内容。继续 Activity 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();
}
}
}
最后是我的 Activity C。我在这里做了一些更改 - 使用搜索栏对主题进行评分,填写文本框等。
我有一个按钮,当我按下它时,它应该转到 B(在 C 中进行了更改),从那里直接转到 A。这样做的原因而不是从 C 直接跳到 A "finish()" B,当从 B 到 C 时,我无法完成()B,因为我在 C 中有一个 "cancel"-按钮,当按下时,我从 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,从C通过B去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 放到了正确的地方,但我显然遗漏了一些东西..
在尝试了几个小时不同的东西之后,我发现,一切都恢复了使用
startActivity(intent)
改为
startActivityForResult(intent, 1)
里面Activity一个...