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, не могли бы вы дать мне более подробную информацию, или, если у вас есть ссылки, которые будут оценены по достоинству
пользователь user

Ответы:


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

ИЗМЕНИТЬ на основе вашего комментария: если вы хотите вернуть три строки, следуйте этому, используя пары ключ / значение с намерением вместо использования 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я могу поставить любое целое число?
пользователь user

1
Я сказал: «Нет проблем» (НП), и, как вы сказали, что, возможно, опоздаете с реализацией этого, я ответил, что не торопитесь, а затем прокомментирую это, чтобы я мог получить уведомление. Переходя к коду запроса, да, вы можете указать целочисленное значение, например int requestCode = 1;
Kanth

да, это работает правильно, я принимаю ваш ответ, большое спасибо, я хочу спросить вас, есть ли способ, чтобы не просто отправлять строку, я хочу отправить 3 строки, например "город", "улица", " home ", есть способ пометить строки?
пользователь user

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

Я искал, как создать намерение : new Intent(this, OtherActivity.class);я могу использовать этот код в Activity.
Пользователь

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_OKis на самом деле -1, если это кого-то смущает. Я бы просто предложил использовать Activityконстанты
jacoballenwood
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.