У меня 3 занятия. Намерение передается от Activity 1 к Activity 2 с некоторыми данными, которые должны использоваться для транзакций БД. Из действия 2 данные и намерение передаются в действие 3.

Теперь я хочу перейти от Activity 3 к Activity 2, но поскольку действие 2 получает намерение от Activity 1, оно возвращает некоторую ошибку, которая приводит к нулевым исключениям: /

Итак, я хочу обновить действие 2 по возвращении из действия 3, но без намерения или надлежащего использования намерения, которое не влияет на данные.

0
Vishal Solanki 9 Май 2016 в 21:29

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 также для обмена данными между действиями

1
Arpit Patel 9 Май 2016 в 18:44

Для этого можно использовать интерфейсы. Пример: в 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. Вместо этого вам следует использовать фрагменты.

0
The Drummer from Kubuntu 9 Май 2016 в 18:50