startActivityForResult () จากกิจกรรมย่อยและสิ้นสุดเด็กไม่เรียก onActivityResult () เป็นแฟรกเมนต์


172

FirstActivity.Javaมีที่โทร FragmentA.Java โทรแต่ไม่เคยได้รับการเรียกที่ถูกเขียนในstartActivityForResult()SecondActivity.Javafinish()onActivityResultFragmentA.Java

FragmentA.Java รหัส:

  @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 รหัส:

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

ฉันลองแก้ไขจุดบกพร่องของรหัส แต่onAcitvityResult()ไม่เคยถูกเรียก


1
ลองใส่ (onActivityResult method) ใน FirstActivity class
viplezer

2
เป็นไปได้ซ้ำกับonActivityResult ไม่ถูกเรียกใน Fragment
QED

คำตอบ:


271

คุณต้องเขียนonActivityResult()ของคุณFirstActivity.Javaดังนี้

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

ดังนั้นสิ่งนี้จะเรียกชิ้นส่วนของคุณ onActivityResult()

แก้ไข:การแก้ปัญหาคือการแทนที่getActivity().startActivityForResult(i, 1);ด้วยstartActivityForResult(i, 1);


4
ขอบคุณ @Kevin ฉันลองสิ่งที่คุณพูด แต่มันไม่ทำงาน แต่ฉันบั๊กรหัสที่ฉันเห็นonActivityresult()ของFirstAcivity.Javaได้รับการเรียกและonActivityresult()ของFragmentA.Javaที่ไม่เคยได้รับการเรียก กรุณาช่วย.
Mr Roshan Pawar

52
โปรดแทนที่ getActivity () startActivityForResult (i, 1); ด้วย startActivityForResult (i, 1);
Kevin Adesara

14
มันอาจจะเป็นว่าคำตอบในการแก้ปัญหาได้รับการยอมรับเป็นจริงไม่ได้เป็นสิ่งที่ไม่ถูกต้องที่นี่และจริงแก้ปัญหาคือการเพียงแค่ใช้startActivityForResultแทนgetActivity().start...? เพราะเท่าที่ฉันเห็นคุณกำลังเอาชนะคำจำกัดความของคำนิยามของonActivityResultตัวเองในกิจกรรม (เช่นสิ่งนี้จะทำงานเหมือนกับที่ว่าการแทนที่ในคำตอบนั้นไม่มีอยู่จริง)
amnn

@asQuirreL ใช่ นี่อาจเป็นเหตุผล
นักพัฒนา android

1
ฉันทำเช่นเดียวกับที่คุณอธิบายแทนที่ onActivityResult () ในกิจกรรมด้วยการแยกส่วนกับ super ในทั้งสองและทำให้ startActivityForResult (เจตนาฉัน) แต่ไม่ทำงานฉันต้องการความช่วยเหลือโปรด
Amal Kronz

33

คำตอบของ Kevin ทำงานได้ แต่มันยากที่จะเล่นกับข้อมูลโดยใช้โซลูชันนั้น

ทางออกที่ดีที่สุดไม่ได้เริ่มstartActivityForResult()จากระดับกิจกรรม

ในกรณีของคุณไม่โทร getActivity().startActivityForResult(i, 1);

แต่ใช้startActivityForResult()และมันจะทำงานได้อย่างสมบูรณ์แบบ! :)


27

คุณต้องเขียน onActivityResult () ใน FirstActivity.Java ของคุณดังนี้

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

สิ่งนี้จะทริกเกอร์ onActivityResult วิธีการแฟรกเมนต์บน FirstActivity.java


2
ขอบคุณเพื่อน! แต่มันต้องการ API ระดับ 26 ขึ้นมาดังนั้นในกรณีของฉันฉันใช้ getSupportFragmentManager () วิธี findFragmentByTag แต่ด้วยความคิดของคุณ
Dagnogo Jean-François


7

สิ่งที่สำคัญที่สุดที่ทุกอย่างหายไปที่นี่คือ ... การเปิดตัวโหมดแรกของกิจกรรมจะต้องเป็นยอดเดียว หากเป็น singleInstance จะเรียกใช้ onActivityResult ใน FragmentA หลังจากเรียกใช้งาน startActivityForResult () ดังนั้นมันจะไม่รอการเรียกใช้ของ finish () ใน SecondActivity

ดังนั้นทำตามขั้นตอนต่อไปนี้มันจะทำงานอย่างแน่นอนเช่นเดียวกับที่ทำงานให้ฉันด้วยหลังจากการวิจัยที่ยาวนาน

ในไฟล์ AndroidManifest.xml ให้สร้าง launchMode ของ FirstActivity.Java เป็น singleTop

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

ใน FirstActivity.java ให้แทนที่ overActivityResult วิธีการ เช่นนี้จะเรียกว่า onActivityResult of FragmentA

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

ใน FragmentA.Java ให้แทนที่ onActivityResult วิธีการ

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

โทรstartActivityForResult(intent, HOMEWORK_POST_ACTIVITY);จาก FragmentA.Java

finish();วิธีการโทรใน SecondActivity.java

หวังว่ามันจะใช้ได้


นี่คือคำตอบที่ดีที่สุด รายละเอียดของการกำหนด "launchMode" ใน Manifest นั้นมีความสำคัญ
Pablo Insua

5

เราสามารถโทรstartActivityForResult()โดยตรงจาก Fragment ดังนั้นคุณควรโทรthis.startActivityForResult(i, 1);แทนgetActivity().startActivityForResult(i, 1);

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

กิจกรรมจะส่งผลกิจกรรมไปยังส่วนของคุณ


1

ขอให้ตอบช้าหน่อย แต่จะเป็นประโยชน์สำหรับทุกคน

ในกรณีของฉันต้องการเรียกกิจกรรมจาก Fragment และ setResult กลับมาจากแฟรกเมนต์

ฉันใช้ getContext of Fragment Like แล้ว

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

และตั้งค่าผลลัพธ์จากแฟรกเมนต์

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

ตอนนี้รับผลลัพธ์เพื่อแฟรกเมนต์ด้วย

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

    }
}

0

onActivityResult () ของ MAinActivity จะโทร, onActivityResult () ของ Fragement จะไม่เรียกเพราะแฟรกเมนต์ถูกวางไว้ในกิจกรรมดังนั้นเห็นได้ชัดว่ามันกลับมาที่ MainActivity



-6

โทรหาคุณonActivityresult()ใน ParentActivity


ขอบคุณสำหรับคำตอบ @URAndroid แต่ได้รับการแก้ไข โซลูชันของคุณไม่สมบูรณ์แบบ การเขียนโปรแกรมมันไม่ดี
Mr Roshan Pawar

อันนี้ไม่แนะนำจริงๆ
Lo-Tan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.