Android: làm thế nào để tạo một hoạt động trả lại kết quả cho hoạt động gọi nó?


128

Tôi có một Locationhoạt động có thể được gọi từ nhiều hoạt động, chẳng hạn như Sign upOrder. Trong Locationhoạt động người dùng vào vị trí của mình, vì vậy hoạt động Locationsẽ trả lại vị trí mới này cho hoạt động được gọi là hoạt động đó.

Vì vậy, khi Sign uphoạt động gọi Locationhoạt động, nó phải trả lại dữ liệu cho Sign uphoạt động. Một lần khác, Orderhoạt động sẽ làm điều tương tự.

Ghi chú

Tôi biết bạn sẽ nói với tôi rằng tôi nên đăng mã, nhưng tôi không yêu cầu bạn đưa mã cho tôi; Tôi chỉ muốn một số lời khuyên, liên kết hoặc chủ đề tốt.


bạn có thể sử dụng kết thúc cuộc gọi () để quay lại ..
Harshid

1
Bạn đã kiểm tra StartActivityForResult developer.android.com/reference/android/app/Activity.html
vinaykumar

@Harshid bạn vui lòng cho tôi biết thêm chi tiết, hoặc nếu bạn có các liên kết sẽ được đánh giá cao
người dùng người dùng

Câu trả lời:


252

Để bắt đầu một hoạt động sẽ trả lại kết quả cho hoạt động gọi điện, bạn nên làm một cái gì đó như dưới đây. Bạn nên chuyển mã yêu cầu như hình bên dưới để xác định rằng bạn đã nhận được kết quả từ hoạt động bạn đã bắt đầu.

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

Trong hoạt động bạn có thể sử dụng setData()để trả về kết quả.

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

Vì vậy, một lần nữa trong hoạt động đầu tiên bạn viết mã dưới đây vào 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 dựa trên nhận xét của bạn: Nếu bạn muốn trả về ba chuỗi, thì hãy làm theo điều này bằng cách sử dụng các cặp khóa / giá trị với mục đích thay vì sử dụng Uri.

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

Đưa họ vào onActivityResult như dưới đây:

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

bạn nói gì thế Tôi không hiểu bình luận cuối cùng của bạn, xin lỗi tôi không giỏi tiếng Anh, tôi đang thử mã của bạn bây giờ, requestcodetôi có thể đặt bất kỳ số nguyên nào?
người dùng người dùng

1
Tôi đã nói, Không có vấn đề (NP) và như bạn nói bạn có thể bị chậm trễ trong việc thực hiện điều này, tôi đã trả lời rằng hãy dành thời gian của riêng bạn và sau đó nhận xét để tôi có thể nhận được thông báo. Đến với mã yêu cầu, có, bạn có thể đưa ra một giá trị số nguyên như int requestCode = 1;
Kanth

vâng, đó là công việc đúng, tôi chấp nhận câu trả lời của bạn, cảm ơn bạn rất tuyệt vời, tôi muốn giúp bạn nếu có một cách để không chỉ gửi chuỗi, tôi muốn gửi 3 chuỗi, như "thành phố", "đường phố", " nhà ", có cách nào để dán nhãn cho chuỗi?
người dùng người dùng

câu trả lời của bạn rất xuất sắc, nếu bạn muốn, hãy chỉnh sửa tiêu đề để nhiều người dùng có thể tìm kiếm nó
người dùng người dùng

Tôi đang tìm cách tạo ra ý định : new Intent(this, OtherActivity.class);Tôi có thể sử dụng mã này trong một Hoạt động.
Người dùng

3

Nếu bạn muốn kết thúc và chỉ cần thêm một resultCode(không có dữ liệu), bạn có thể gọi setResult(int resultCode)trước finish().

Ví dụ:

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

Sau đó, trong hoạt động gọi điện của bạn, hãy kiểm tra resultCodexem chúng tôi có ổn không.

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

Đừng quên gọi hoạt động với startActivityForResult(intent, someCustomRequestCode).


4
giá trị Activity.RESULT_OKthực sự là -1, trong trường hợp gây nhầm lẫn cho ai đó. Tôi chỉ đề nghị sử dụng các Activityhằng số
jacoballenwood
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.