Android: jak sprawić, by działanie zwracało wyniki do działania, które je wywołuje?

128

Mam Locationdziałanie, które można wywołać z wielu działań, takich jak Sign upi Order. W Locationdziałaniu użytkownik wprowadza swoją lokalizację, więc działanie Locationzwróci tę nową lokalizację do działania, które ją wywołało.

Więc kiedy Sign updziałanie wywołuje Locationdziałanie, musi zwrócić dane do Sign updziałania. Innym razem Orderczynność zrobi to samo.

Uwaga

Wiem, że powiesz mi, że mam wysłać kod, ale nie proszę o podawanie mi kodu; Chcę tylko wskazówek, linków lub dobrych wątków.

użytkownik użytkownika
źródło
możesz użyć funkcji call to back z finish () ..
Harshid,
1
Czy sprawdziłeś StartActivityForResult developer.android.com/reference/android/app/Activity.html
vinaykumar
@Harshid, czy możesz podać mi więcej szczegółów lub jeśli masz linki, które byłyby wdzięczne
użytkownik użytkownika

Odpowiedzi:

253

Aby rozpocząć działanie, które powinno zwrócić wynik do działania wywołującego, powinieneś zrobić coś jak poniżej. Powinieneś przekazać kod żądania, jak pokazano poniżej, aby zidentyfikować wynik rozpoczętej czynności.

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

W ćwiczeniu możesz setData()zwrócić wynik.

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

Więc znowu w pierwszym działaniu piszesz poniższy kod w 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();
        }
    }
}

EDYTUJ na podstawie Twojego komentarza: Jeśli chcesz zwrócić trzy ciągi, postępuj zgodnie z tym, używając par klucz / wartość z intencją zamiast używać Uri.

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

Zdobądź je w onActivityResult, jak poniżej:

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");
        }
    }
}
Kanth
źródło
co powiedziałeś nie rozumiem twojego ostatniego komentarza, przepraszam, nie jestem dobry po angielsku, próbuję teraz twojego kodu, co requestcodemogę wstawić jakąkolwiek liczbę całkowitą?
użytkownik
1
Powiedziałem: No Problems (NP) i jak powiedziałeś, że możesz się spóźnić z wdrożeniem tego, odpowiedziałem, że nie spiesz się, a następnie skomentuj to, abym mógł otrzymać powiadomienie. Przechodząc do requestcode, tak, możesz podać wartość całkowitą, taką jak int requestCode = 1;
Kanth
tak, działa dobrze, przyjmuję twoją odpowiedź, bardzo dziękuję, chcę cię powiadomić, jeśli jest sposób, więc nie tylko wysyłaj ciąg, chcę wysłać 3 ciągi, takie jak "miasto", "ulica", " home ”, czy jest sposób na oznaczenie napisów?
użytkownik
twoja odpowiedź jest bardzo doskonała, jeśli chcesz, edytuj tytuł, aby wielu użytkowników mogło go wyszukiwać
użytkownik użytkownik
Szukałem, jak stworzyć intencję : new Intent(this, OtherActivity.class);mogę użyć tego kodu w działaniu.
Użytkownik
3

Jeśli chcesz zakończyć i po prostu dodać resultCode(bez danych), możesz zadzwonić setResult(int resultCode)wcześniej finish().

Na przykład:

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

Następnie w swojej aktywności związanej z dzwonieniem sprawdź resultCode, czy wszystko w porządku.

@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 :-(
        }
    }
}

Nie zapomnij wywołać czynności za pomocą startActivityForResult(intent, someCustomRequestCode).

lenooh
źródło
4
wartość Activity.RESULT_OKjest faktycznie -1, na wypadek, gdyby ktoś myślał. Sugerowałbym po prostu użycie Activitystałych
jacoballenwood