У меня 3 занятия. Намерение передается от Activity 1 к Activity 2 с некоторыми данными, которые должны использоваться для транзакций БД. Из действия 2 данные и намерение передаются в действие 3.
Теперь я хочу перейти от Activity 3 к Activity 2, но поскольку действие 2 получает намерение от Activity 1, оно возвращает некоторую ошибку, которая приводит к нулевым исключениям: /
Итак, я хочу обновить действие 2 по возвращении из действия 3, но без намерения или надлежащего использования намерения, которое не влияет на данные.
2 ответа
Начните Activity2 с Activity1 как:
Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);
В Activity2 используйте setResult
для отправки данных обратно:
Intent intent = new Intent();
intent.putExtra("edittextvalue","value_here")
setResult(RESULT_OK, intent);
finish();
А в First Activity получить данные как onActivityResult:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if(resultCode == RESULT_OK){
String stredittext=data.getStringExtra("edittextvalue");
}
}
}
ИЛИ
Вы можете использовать это В Activity2 ,
@Override
public void onBackPressed() {
String data = mEditText.getText();
Intent intent = new Intent();
intent.putExtra("MyData", data);
setResult(resultcode, intent);
}
В Activity1
onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == RESULT_OK) {
String myStr=data.getStringExtra("MyData");
mTextView.setText(myStr);
}
}
}
ИЛИ
Вы можете использовать SharedPreferences также для обмена данными между действиями
Для этого можно использовать интерфейсы. Пример: в Activity3 создайте интерфейс:
interface Communicator {
void receiveData(Object toSend);
}
Затем вы реализуете свой Activity2 следующим образом:
public class Activity2 extends Activity implements Activity3.Communicator, Serializable {
//You'll have to implement the method
public void receiveData(Object toSend) {
//do what you have to do with your object once it's been sent back.
}
}
Чтобы использовать этот шаблон, вам нужно будет использовать намерение для начала Activity3
, как вы это делали. Я использовал Serializable
, потому что вы хотите передать экземпляр Activity через Intent
:
Intent intent = new Intent(this, Activity3.class);
intent.putExtra("activity2", this);
startActivity(intent);
Вы получаете объект Activity2 в Activity3 в его методе onCreate
:
public class Activity3 extends Activity {
private Communicator mActivity2; //your activity
private Object mData; //Whatever object you want to send
public void onCreate(Bundle bundle) {
//...
Intent intent = getIntent();
Serializable object = intent.getSerializableExtra("activity2");
if (object != null && object instanceof Communicator) {
//make sure the object is not null and implements the Communicator
mActivity2 = (Communicator) object;
}
}
}
По завершении работы с Activity3
(после его закрытия) вы реализуете такой метод, как onBackPressed
или onDestroy
, следующим образом:
@Override
public void onDestroy() { //better if the back button is not pressed
super.onDestroy();
if (mActivity2 != null) { //check if is not null
mActivity2.receiveData(mData);
}
}
И ваша активность должна обновляться без использования намерений.
Кстати, использование фрагментов с использованием этого шаблона НАМНОГО лучше, чем Activity. Вместо этого вам следует использовать фрагменты.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.