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

У меня два действия: Activity1 и Activity2.

В Activity1 у меня есть Button и TextView. При нажатии кнопки запускается Activity2.

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

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

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


person kumareloaded    schedule 12.01.2013    source источник
comment
читать о startActivityForResult   -  person Dmitry Zaytsev    schedule 12.01.2013
comment
stackoverflow.com/ questions / 2694947 /   -  person Chris Conway    schedule 12.01.2013
comment
Другой способ: Activity2 помещает значение в постоянное хранилище и Activity1 считывает его оттуда.   -  person Henry    schedule 12.01.2013
comment
@kumareloaded: Не могли бы вы поделиться решением здесь. Pastebin на данный момент не работает в моей стране.   -  person user1903022    schedule 04.06.2015
comment
Возможный дубликат Как передать значения из одного активность к предыдущей активности   -  person andeart    schedule 27.01.2016
comment
если я выхожу из действия 3, каким будет код ...   -  person PankajR    schedule 13.05.2018
comment
Возможный дубликат Как передавать данные между действиями в Android приложение?   -  person Trilarion    schedule 25.04.2019
comment
onActivityResult устарел, используйте этот метод stackoverflow.com/questions/62671106/   -  person Ehsan Taghavi    schedule 09.06.2021


Ответы (9)


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

Например:

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

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

person ρяσѕρєя K    schedule 12.01.2013
comment
спасибо, чувак, не могли бы вы помочь мне с аналогичной частью кодирования для SharedPreferences, чтобы сделать то же самое :) - person kumareloaded; 12.01.2013
comment
@kumareloaded: добро пожаловать, друг. если вы хотите сделать то же самое, используя SharedPreferences, просмотрите это пример - person ρяσѕρєя K; 12.01.2013
comment
устал, что у человека были проблемы, но с использованием startActivityForResult он отлично работает. будет полезно, если вы предоставите мне код для вышеуказанного сценария с помощью SharedPref :) - person kumareloaded; 12.01.2013
comment
@kumareloaded: если вы дадите мне ссылки на коды обоих классов с тем, что вы пробовали использовать pastebin.com, я отредактирую ваш код - person ρяσѕρєя K; 12.01.2013
comment
нет, братан :( вот мой полный код с SharedPref (не работает) и startActivityForResult (в виде комментария, который отлично работает) .. pastebin. com / gydfWpHN - person kumareloaded; 12.01.2013
comment
@kumareloaded: теперь используйте этот код, и это будет работать - person ρяσѕρєя K; 12.01.2013
comment
@ ρяσѕρєяK: Не могли бы вы поделиться кодом для вышеуказанного сценария, используя SharedPref в своем ответе. Pastebin не открывается во многих странах. Поделитесь им здесь, это будет большим подспорьем, спасибо. - person user1903022; 04.06.2015
comment
Я не могу поверить! Спустя столько лет я впервые узнал о startActivityForResult. Большое спасибо!!! - person ulaserdegor; 24.10.2019
comment
Que Agradable Sujeto - person Fernando Torres; 23.12.2019

Activity1 должно начинаться с Activity2 с startActivityForResult().

Activity2 должен использовать setResult() для отправки данных обратно в Activity1.

В 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);
        }
    }
}
person Swayam    schedule 12.01.2013
comment
@Swayam Я думаю, поскольку вы не упомянули, что activity1 следует начинать activity2 с startactivityforresult. - person LutfiTekin; 06.03.2018
comment
@LutfiTekin: Вполне может быть! Спасибо, что указали на это! Отредактировал свой ответ. :) - person Swayam; 07.03.2018

Другие ответы не работали, когда я вставлял 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;
        }
    }
}
person FindOut_Quran    schedule 05.11.2015

Воспользуйтесь этим как альтернативой 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");
} 
person katmanco    schedule 26.01.2015
comment
Это не может использоваться для объекта (только строка, логическое значение и т. Д.) - person FindOut_Quran; 05.11.2015
comment
В моем случае я запускал действие из элемента списка в MainActivity и хотел вернуть данные, созданные пользователем, в этот элемент списка. startActivityForResult () был недоступен для меня в этом случае, когда я использовал mContext.startActivity (). Пример @katmanco здесь был полезной работой. - person Faulty; 18.07.2017
comment
для меня это плохие выборы. существует actionForResult - person marlonpya; 18.12.2017

это ваш первый 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);
}

}

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

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

person Vishesh Chandra    schedule 12.01.2013

Из вашего 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's no result
        }
    }
}
person Manoj Reddy    schedule 26.04.2017

Прочтите это:

  1. Вернуть результат в onActivityResult ()
  2. Получение результата из вызываемого действия - Руководство по Android для начинающих

Эти статьи помогут вам понять, как передавать данные между двумя действиями в Android.

person Dixit Patel    schedule 12.01.2013

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

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

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

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

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

person Franci Penov    schedule 12.01.2013

и у меня есть проблема, которую я хотел сделать, чтобы отправить этот тип данных в мягкой кнопке, которую я сделал, и softKey, которая используется по умолчанию на каждом устройстве Android, поэтому я сделал это, сначала я сделал Intent в мой "А" Activity:

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

Затем в моем втором действии я объявил Поле в моем "B" Activity:

private static int resultCode = 40;

затем после того, как я успешно сделал свой запрос или когда бы я ни хотел сообщить Activity «A», что эта работа здесь успешно выполнена, измените значение resultCode на то же, что я сказал в «A» Activity, которое в моем случае равно «60» а потом:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PS: Не забудьте удалить Super из метода onBackPressed, если вы хотите, чтобы это работало правильно.

тогда я должен также вызвать метод onActivityResult в моем действии "A":

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

вот и все, надеюсь, это поможет вам. #HappyCoding;

person Arash Afsharpour    schedule 16.07.2018