Как передать данные от 2-го действия до 1-го действия при нажатии? - Андроид

У меня есть 2 действия, Activity1 и Activity2.

В Activity1 у меня есть кнопка и TextView. Когда нажимается кнопка Активность2.

В Activity2 у меня есть EditText.

Я хочу отображать данные, полученные из EditText в Activity2 в TextView в Activity1, когда возвращается нажата с Activity2.

может кто-нибудь помочь мне с кодом, чтобы сделать эту работу?

Ответ 1

Запустите Activity2 с startActivityForResult и используйте метод setResult для отправки данных из Activity2 в Activity1. В Activity1 вам необходимо переопределить onActivityResult для обновления TextView с помощью EditText данных из Activity2.

Например:

В Activity1 запустите Activity2 as:

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();

И в Activity1, получите данные с помощью 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");
         }     
    }
} 

Если вы можете, также используйте SharedPreferences для обмена данными между действиями.

Ответ 2

В 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);
        }
    }
}

Ответ 3

Другие ответы не работали, когда я помещал setResult в onBackPressed. Комментируя вызов super onBackPressed и вызов finish вручную решает проблему:

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

И в первом действии:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}

Ответ 4

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

В Activity2,

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

В Activity1,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

Ответ 6

это ваш первый Activity1.

public class Activity1 extends Activity{
private int mRequestCode = 100;

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

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

Здесь вы начинаете свой Activity2.class с помощью startActivityForResult (mRequestCode, Activity2.class);

Теперь это ваше второе действие, имя - Activity2

public class Activity2 extends Activity {
private EditText mEditText;

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

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

Теперь, когда вы выполнили вторую операцию, вы вызываете метод setResult(), из onBackPress() или любой кнопкой, когда ваш Activity2 будет уничтожен, ваш метод обратного вызова Activity1 onActivityResult() будет звоните оттуда, вы можете получить свои данные от намерения.

Надеюсь, это поможет вам...:)

Ответ 7

От вашего FirstActivity вызовите SecondActivity, используя метод startActivityForResult().

Например:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

В вашей SecondActivity задайте данные, которые вы хотите вернуть в FirstActivity. Если вы не хотите возвращаться назад, не устанавливайте.

Например: В SecondActivity, если вы хотите отправить обратно данные:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Если вы не хотите возвращать данные:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Теперь в вашем классе FirstActivity напишите следующий код для метода onActivityResult().

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there no result
        }
    }
}

Ответ 8

TL; DR Используйте Activity.startActivityForResult

Длинный ответ:

Вам следует начать с чтения документации разработчика Android. В частности, тема вашего вопроса рассматривается в разделе Starting Activities and Getting Results документации Activity.

Как и в случае с кодом, Android SDK предоставляет хорошие примеры. Кроме того, другие ответы здесь дают вам короткие фрагменты кода примера для использования.

Однако, если вы ищете альтернативы, прочитайте этот вопрос SO. Это хорошая дискуссия о том, как использовать startActivityForResults с фрагментами, а также пару подходов для передачи данных между действиями.