Mã yêu cầu sai trong onActivityResult


310

Tôi đang bắt đầu một Hoạt động mới từ Mảnh vỡ của mình với

startActivityForResult(intent, 1);

và muốn xử lý kết quả trong Hoạt động chính của Fragment:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
    if (requestCode == 1) {
        // bla bla bla
    }
}

Vấn đề là tôi chưa bao giờ nhận được những requestCodegì tôi vừa đăng lên startActivityForResult().

Tôi đã nhận được một cái gì đó như 0x40001, 0x20001vv với một bộ bit cao hơn ngẫu nhiên. Các tài liệu không nói bất cứ điều gì về điều này. Có ý kiến ​​gì không?


Câu trả lời:


837

Bạn đang gọi startActivityForResult()từ của bạn Fragment. Khi bạn làm điều này, cái requestCodeđược thay đổi bởi Activitycái sở hữu Fragment.

Nếu bạn muốn có được sự chính xác resultCodetrong hoạt động của mình, hãy thử điều này:

Thay đổi:

startActivityForResult(intent, 1);

Đến:

getActivity().startActivityForResult(intent, 1);

44
Bởi vì nó sẽ quyết định đoạn nào sẽ cung cấp kết quả. Vì vậy, khi The Fragment gọi StartActivityForResult. Mã yêu cầu sẽ được thay đổi bởi Hoạt động, vì vậy nó sẽ biết cách phân phối kết quả đến đoạn nào. nếu bạn thực sự muốn nhận kết quả trong Activiy. chỉ cần gọi getActivity (). startActivityForResult ().
Changwei Yao

31
Chỉ cần một lưu ý: nếu bạn sử dụng startActivityForResulttrong một đoạn và mong đợi kết quả từ onActivityResultđoạn đó, chỉ cần đảm bảo bạn gọi super.onActivityResulttrong hoạt động máy chủ (trong trường hợp bạn ghi đè phương thức đó vào đó). Điều này là do hoạt động onActivityResultdường như gọi là phân đoạn onActivityResult. Ngoài ra, lưu ý rằng mã yêu cầu, khi nó đi qua hoạt động onActivityResult, bị thay đổi như được giải thích trong liên kết mà Dimanoid đăng trong câu trả lời của mình bên dưới. Bạn có thể không cần biết điều đó nhưng bạn không bao giờ biết ...
Ferran Maylinch 22/03/2016

31
"Mã yêu cầu được thay đổi bởi Hoạt động sở hữu Mảnh vỡ" - Phải yêu thiết kế Android ...
Tiago

13
Một thông tin quan trọng như vậy, mà bạn không thể tìm thấy bất cứ nơi nào rõ ràng trong các tài liệu. Phải yêu thiết kế Android được thiết kế để biến cuộc sống của bạn thành một địa ngục.
Driss Bounouar

2
Người đàn ông tôi yêu bạn, tôi đã dành nhiều ngày cố gắng để hiểu vấn đề này và sửa lỗi, cảm ơn!
tinyCoder

35

Mã yêu cầu không sai. Khi sử dụng các đoạn thư viện hỗ trợ v4, chỉ mục đoạn được mã hóa trong 16 bit trên cùng của mã yêu cầu và mã yêu cầu của bạn nằm trong 16 bit dưới cùng. Chỉ số đoạn sau đó được sử dụng để tìm đoạn đúng để cung cấp kết quả.

Do đó, đối với các Hoạt động bắt đầu hình thành đối tượng phân đoạn, hãy xử lý onActivityResult requestCode như bên dưới:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)

1
Thông tin tuyệt vời giải thích nguyên nhân chính xác cho vấn đề này
Muzikant

Câu hỏi nhanh: indexOfFragment là gì?
Louis Tsai

indexOfFragment là chỉ mục mà getSupportFragmentManager (). getFragments () tạo ra
HerberthObreb

25

Dễ dàng hơn:

Java : int unmaskedRequestCode = requestCode & 0x0000ffff

Kotlin : val unmaskedRequestCode = requestCode and 0x0000ffff

Kiểm tra 16 bit thấp hơn, chỉ cần vạch mặt nó làm logic VÀ với 16 bit trên bằng 0

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final int unmaskedRequestCode = requestCode & 0x0000ffff

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff

    }
}

1
Bạn có thể cho tôi biết lý do tại sao nó không cung cấp mã yêu cầu ban đầu?
K.Sopheak

3
Nguyên nhân do requestCode bị thay đổi bởi Activity sở hữu Fragment. Xem câu trả lời của Ashlesha Sharma
Jaime Agudo

cảm ơn bạn, đây là câu trả lời tôi đang tìm kiếm Tôi không thấy lý do tại sao Android không nên trả lại mã yêu cầu ban đầu.
tonisives

Điều này vô cùng hữu ích cho tôi ngày hôm nay và thực sự giải thích vấn đề thực sự độc đáo. Cảm ơn!
Billy Lazzaro

6

Nếu bạn đang cung cấp liên tục làm cho nó công khai và sau đó sử dụng trong startActivityResult

thí dụ:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);

2

Bạn cũng có thể xác định
super.onActivityResult(requestCode, resultCode, data)
trong Activity(nếu bạn ghi đè onActivityResult) tại đây

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {

        ...

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

và gọi startActivityForResult(intent, requestCode)bên trong của bạnFragment


0

trong mảnh vỡ

  getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);

trong Hoạt động chính:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
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.