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


186

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

У Activity1меня есть кнопка и TextView . Когда кнопка нажата, Activity2 запускается.

У Activity2меня есть EditText .

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

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


2
читать оstartActivityForResult
Дмитрий Зайцев


Другой способ: Activity2помещает значение в постоянное хранилище и Activity1читает его оттуда.
Генри

@kumareloaded: не могли бы вы поделиться решением здесь. Pastebin не работает в моей стране на данный момент.
user1903022

Ответы:


328

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

Например:

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


1
спасибо, если можешь, можешь помочь мне с аналогичной частью кода для SharedPreferences сделать то же самое :)
kumareloaded

1
@kumareloaded: самый желанный друг. если вы хотите сделать то же самое , используя SharedPreferencesзатем посмотреть этот пример
ρяσѕρєя K

2
@kumareloaded: если вы дадите мне кодовые ссылки обоих классов с тем, что вы пробовали с помощью pastebin.com, тогда я отредактирую ваш код
ρяσѕρєя K

1
@kumareloaded: теперь используйте этот код, и это сработает
ρяσѕρєя K

1
@ ρяσѕρєяK: Не могли бы вы поделиться кодом для вышеуказанного сценария, используя SharedPref в своем ответе. Pastebin не открывается во многих странах. Поделиться здесь было бы очень полезно, спасибо.
user1903022

27

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

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

В деятельности2 ,

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

В Деятельности1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

@ Swayam Я полагаю, потому что вы не упомянули активность1, нужно начинать деятельность2 с startactivityforresult.
LutfiTekin

1
@LutfiTekin: Это вполне может быть! Спасибо за указание на это! Отредактировал мой ответ. :)
Сваям

17

Другие ответы не работают , когда я ставлю setResultв onBackPressed. Комментирование вызова супер 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;
        }
    }
}

6

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

В Деятельности2

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

В Деятельности1,

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

Это не может быть использовано для объекта (только строка, логическое значение и т. Д.)
FindOut_Quran

1
В моем случае я запускал действие из элемента списка в MainActivity и хотел вернуть созданные пользователем данные обратно в этот элемент списка. startActivityForResult () был недоступен для меня в этом случае, когда я использовал mContext.startActivity (). Пример @katmanco здесь был полезен.
Неисправен

для меня это плохие выборы. существует actionForResult
marlonpya

3

Из вашей 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
        }
    }
}

2

это ваша первая деятельность1.

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

Теперь это ваша вторая активность, зовут деятельность 2

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 () , откуда вы можете получить свои данные из намерения. ..

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



1

TL; DR Использование Activity.startActivityForResult

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

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

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

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


0

и у меня есть проблема, которую я хотел сделать, отправляя этот тип данных в программной кнопке, которую я сделал, и программную клавишу, которая используется по умолчанию на каждом устройстве 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;

затем, после того, как я сделал свой запрос успешно или когда я захотел сообщить «A» Activity, что это задание успешно выполнено, измените значение 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;

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.