Як передати дані від 2-ї активності до 1-ї діяльності при натисканні назад? - андроїд


185

У мене 2 дії, Activity1 та Activity2 .

У Activity1мене кнопка та TextView . Після натискання кнопки запускається Activity2 .

У Activity2мене є EditText .

Я хочу відобразити дані, отримані з EditText у Activity2, у TextView в Activity1, коли натиснути назад із Activity2 .

може хтось допоможе мені з кодом, щоб зробити цю роботу?


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


Інший спосіб: Activity2додає значення в постійне зберігання і Activity1зчитує його звідти.
Генрі

@kumareloaded: Чи можете ви, будь ласка, поділитися рішенням тут. Пастебін зараз не працює у моїй країні.
user1903022

Відповіді:


327

Запустіть 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: тепер використовуйте цей код, і це спрацює
ρyaσѕρєя K

1
@ ρyaσѕρєяK: Чи можете ви поділитися кодом для вищезгаданого сценарію, використовуючи SharedPref у своїй відповіді. Пастебін не відкривається у багатьох країнах. Поділитися тут було б дуже корисно, дякую.
user1903022

26

Activity1 повинні почати деятельності2 з 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 зі зоряної активності.
LutfiTekin

1
@LutfiTekin: Це дуже могло бути! Дякуємо, що вказали на це! Відредагував мою відповідь. :)
Swayam

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

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

Тепер це ваша друга діяльність, назва - 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 () зателефонує звідти, і ви зможете отримати свої дані з наміру ..

Сподіваюся, це допоможе тобі ... :)



2

З вашого 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
        }
    }
}

1

TL; DR Використання Activity.startActivityForResult

Довга відповідь:

Спершу слід прочитати документацію для розробників Android. Зокрема, тема вашого питання висвітлена у Starting Activities and Getting Resultsрозділі "Activity документації.

Що стосується, наприклад, коду, Android SDK надає хороші приклади. Також інші відповіді дають вам короткі фрагменти зразкового коду для використання.

Однак якщо ви шукаєте альтернативи, прочитайте це питання . Це хороша дискусія про те, як використовувати startActivityForResultsфрагменти, а також пару підходів для передачі даних між видами діяльності.


0

і у мене є проблема, з якою я хотів зробити цей тип передачі даних на Soft Button, який я створив, і 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;

потім після того, як я зробив свій запит успішно або щоразу, коли я хотів сказати "А" діяльності, що ця робота успішно виконується тут, змініть значення resultCode на те, що я сказав у "А", Activityщо в моєму випадку "60" і тоді:

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

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

PS: Не забудьте видалити Superз методу onBackPress, якщо ви хочете, щоб це працювало належним чином.

тоді я також повинен назвати onActivityResultМетод у своїй "А" діяльності:

   @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.