Android: як зробити, щоб активність повертала результати діяльності, яка її викликає?


128

У мене є Locationдіяльність, яку можна назвати з багатьох видів діяльності, таких як Sign upі Order. У цій Locationдіяльності користувач вводить своє місцезнаходження, тому активність Locationповерне це нове місцезнаходження до тієї діяльності, яка його назвала.

Отже, коли Sign upактивність викликає Locationактивність, вона повинна повернути дані в Sign upактивність. Іншим разом Orderдіяльність зробить те саме.

Примітка

Я знаю, ти скажеш мені, що я повинен опублікувати код, але я не прошу, щоб ти дав мені код; Я просто хочу кілька порад, посилань чи гарних тем.


ви можете використовувати
переклик для

1
Ви перевіряли StartActivityForResult developer.android.com/reference/android/app/Activity.html
vinaykumar

@Harshid ви б дали мені детальніше, або якщо у вас є посилання, які будуть вдячні
користувач користувача

Відповіді:


253

Для того, щоб розпочати діяльність, яка повинна повернути результат до виклику, слід зробити щось на кшталт нижче. Ви повинні передати код запиту, як показано нижче, щоб визначити, що ви отримали результат від розпочатої діяльності.

startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);

У діяльності ви можете скористатися, setData()щоб повернути результат.

Intent data = new Intent();
String text = "Result to be returned...."
//---set the data to pass back---
data.setData(Uri.parse(text));
setResult(RESULT_OK, data);
//---close the activity---
finish();

Тоді знову в першій діяльності ви пишете код нижче в onActivityResult ()

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String returnedResult = data.getData().toString();
            // OR
            // String returnedResult = data.getDataString();
        }
    }
}

EDIT на основі Вашого коментаря: Якщо ви хочете повернути три рядки, то виконайте це, використовуючи пари ключ / значення з наміром замість використання Uri.

Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();

Отримайте їх у onActivityResult, як показано нижче:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String street = data.getStringExtra("streetkey");
            String city = data.getStringExtra("citykey");
            String home = data.getStringExtra("homekey");
        }
    }
}

що ти сказала? я не розумію ваш останній коментар, вибачте, я не хороший англійська мова, я зараз пробую ваш код requestcode.
користувач користувача

1
Я сказав: "Ніяких проблем (НП)", і, як ви сказали, що ви можете запізнитися в реалізації цього, я відповів, що знайдіть свій час, а потім прокоментуйте це, щоб я міг отримати повідомлення. Перейшовши на код запиту, так, ви можете надати ціле значення, як int requestCode = 1;
Кант

так, це правильно, я приймаю вашу відповідь, дуже дякую, я хочу поцілувати вас, якщо є спосіб, щоб не просто надіслати рядок, я хочу надіслати 3 рядки, наприклад "місто", "вулиця", " додому ", є спосіб позначити рядки?
користувач користувача

ваша відповідь дуже відмінна, якщо ви хочете, редагуйте заголовок, щоб багато користувачів могли його шукати
користувач користувача

Я шукав, як створити намір : new Intent(this, OtherActivity.class);я можу використовувати цей код у діяльності.
Користувач

3

Якщо ви хочете закінчити і просто додати resultCode(без даних), ви можете зателефонувати setResult(int resultCode)раніше finish().

Наприклад:

...
if (everything_OK) {
    setResult(Activity.RESULT_OK); // OK! (use whatever code you want)
    finish();
}
else {
   setResult(Activity.RESULT_CANCELED); // some error ...
   finish();
}
...

Потім у вашій діяльності дзвінка перевірте resultCode, чи не все в порядку.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == someCustomRequestCode) {
        if (resultCode == Activity.RESULT_OK) {
            // OK!
        }
        else if (resultCode = Activity.RESULT_CANCELED) {
            // something went wrong :-(
        }
    }
}

Не забудьте зателефонувати за допомогою startActivityForResult(intent, someCustomRequestCode).


4
цінність Activity.RESULT_OKє насправді -1, якщо хтось бентежить. Я б просто запропонував використовувати Activityконстанти
jacoballenwood
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.