startActivityForResult () từ một Fragment và kết thúc Hoạt động con, không gọi onActivityResult () trong Fragment


172

FirstActivity.Javacó một FragmentA.Javacuộc gọi mà startActivityForResult(). SecondActivity.Javagọi finish()nhưng onActivityResultkhông bao giờ được gọi mà được viết trong FragmentA.Java.

FragmentA.Java mã:

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // some code
    Intent i = new Intent(getActivity(), SecondActivity.class);
    i.putExtra("helloString", helloString);
    getActivity().startActivityForResult(i, 1);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    getActivity();
    if(requestCode == 1 && resultCode == Activity.RESULT_OK) {
       //some code
    }
  }

SecondActivity.Java mã:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       //some code
       Intent returnIntent = new Intent();
       returnIntent.putExtra("result", result);                          

       setResult(Activity.RESULT_OK,returnIntent);     
       finish();
  }

Tôi đã thử gỡ lỗi mã, nhưng onAcitvityResult()không bao giờ được gọi.


1
Hãy thử đặt nó (phương thức onActivityResult) trong lớp FirstActivity
viplzer

Câu trả lời:


271

Bạn phải viết onActivityResult()trong của bạn FirstActivity.Javanhư sau

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
}

Vì vậy, điều này sẽ gọi mảnh của bạn onActivityResult()

Chỉnh sửa: giải pháp là thay thế getActivity().startActivityForResult(i, 1);bằngstartActivityForResult(i, 1);


4
Cảm ơn @Kevin, tôi đã thử những gì bạn nói nhưng nó không hoạt động. Nhưng tôi sửa lỗi mã, tôi thấy onActivityresult()các FirstAcivity.Javabị gọi và onActivityresult()của FragmentA.Javakhông bao giờ được gọi. Xin vui lòng giúp đỡ.
Ông Roshan Pawar

52
Vui lòng thay thế getActivity (). StartActivityForResult (i, 1); với startActivityForResult (i, 1);
Kevin Adesara

14
Có thể là câu trả lời trong giải pháp được chấp nhận thực sự không phải là những gì sai ở đây, và giải pháp thực sự là chỉ sử dụng startActivityForResultthay vì getActivity().start...? Bởi vì theo như tôi có thể thấy, bạn đang ghi đè định nghĩa onActivityResultvới định nghĩa riêng của nó, trong Hoạt động (nghĩa là điều này hoạt động giống hệt như khi ghi đè trong câu trả lời không tồn tại).
amnn

@asQuirreL Vâng. đây có lẽ là lý do
nhà phát triển Android

1
Tôi cũng làm như bạn giải thích, ghi đè lênActivityResult () trong hoạt động cũng thành từng mảnh với siêu trong cả hai và tạo startActivityForResult (ý định, i), nhưng không hoạt động, tôi cần giúp đỡ
Amal Kronz 24/07/18

33

Câu trả lời của Kevin hoạt động nhưng thật khó để chơi với dữ liệu bằng giải pháp đó.

Giải pháp tốt nhất là không bắt đầu startActivityForResult()ở cấp độ hoạt động.

trong trường hợp của bạn đừng gọi getActivity().startActivityForResult(i, 1);

Thay vào đó, chỉ cần sử dụng startActivityForResult()và nó sẽ hoạt động hoàn toàn tốt! :)


27

Bạn phải viết onActivityResult () trong FirstActivity của bạn.Java như sau

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

Điều này sẽ kích hoạt phương thức phân đoạn onActivityResult trên FirstActivity.java


2
cảm ơn bạn đời! nhưng nó yêu cầu API cấp 26 .. vì vậy trong trường hợp của tôi, tôi đã sử dụng phương thức getSupportFragmentManager (). findFragmentByTag nhưng với ý tưởng của bạn
Dagnogo Jean-François

15

Đoạn đã có startActivityForResult, sẽ gọi onActivityResultđoạn đó nếu bạn sử dụng nó, thay vì getActivity()...


7

Điều quan trọng nhất, tất cả những gì còn thiếu ở đây là ... Mã khởi chạy của FirstActivity phải là SingleTop. Nếu là SingleInstance, onActivityResult trong FragmentA sẽ được gọi ngay sau khi gọi phương thức startActivityForResult. Vì vậy, Nó sẽ không chờ gọi phương thức finish () trong SecondActivity.

Vì vậy, trải qua các bước sau, Nó chắc chắn sẽ hoạt động vì nó cũng làm việc cho tôi sau một nghiên cứu dài.

Trong tệp AndroidManifest.xml, tạo launchMode của FirstActivity.Java dưới dạng singleTop.

<activity
        android:name=".FirstActivity"
        android:label="@string/title_activity_main"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar" />

Trong FirstActivity.java, ghi đè lên phương thứcActivityResult. Vì điều này sẽ gọi onActivityResult của FragmentA.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

Trong FragmentA.Java, ghi đè lên phương thứcActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("FragmentA.java","onActivityResult called");
}

Gọi startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);từ FragmentA.Java

finish();Phương thức gọi trong SecondActivity.java

Hy vọng điều này sẽ làm việc.


Đây là câu trả lời tốt nhất. Chi tiết xác định "launchMode" trong Manifest là rất quan trọng.
Pablo Insua

5

Chúng tôi có thể gọi startActivityForResult()trực tiếp từ Fragment Vì vậy, bạn nên gọi this.startActivityForResult(i, 1);thay vìgetActivity().startActivityForResult(i, 1);

Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);

Hoạt động sẽ gửi Kết quả hoạt động đến Đoạn của bạn.


1

Có thể là muộn cho câu trả lời. Nhưng sẽ hữu ích cho bất cứ ai.

Trong trường hợp của tôi muốn gọi hoạt động từ Fragment và setResult trở lại từ đoạn đó.

Tôi đã sử dụng getContext của Fragment Like.

startActivityForResult(new Intent(getContext(), NextActivity.class), 111);

Và đặt kết quả từ Fragment

getActivity().setResult(Activity.RESULT_OK);
                    getActivity().finish();

Bây giờ Nhận kết quả cho Mảnh vỡ với

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == 111) {

    }
}

0

onActivityResult () của MAinActivity sẽ gọi, onActivityResult () của Fragement sẽ không gọi vì đoạn được đặt trong Activity nên rõ ràng nó quay lại MainActivity



-6

gọi cho bạn onActivityresult()trong ParentActivity.


Cảm ơn câu trả lời @URAndroid, nhưng đã có giải pháp. Giải pháp của bạn không hoàn hảo. Đó không phải là lập trình tốt.
Ông Roshan Pawar

Điều này thực sự không được khuyến khích.
Lo-Tan
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.