การจบกิจกรรมปัจจุบันจากส่วนย่อย


98

ฉันมีชิ้นส่วนในกิจกรรมที่ฉันใช้เป็นลิ้นชักการนำทาง มันมีปุ่มที่เมื่อคลิกเริ่มกิจกรรมใหม่ (startActivity จากแฟรกเมนต์เรียกว่า startActivity ในกิจกรรมปัจจุบัน)

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

ฉันต้องการบรรลุบางสิ่งเช่นนี้ในส่วน:

@Override
public void onClick(View view) {
    // TODO Auto-generated method stub
    if (view == mButtonShows) {
        Intent intent = new Intent(view.getContext(), MyNewActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        finish();
    } 
}

แต่ดูเหมือนว่า Fragment.class จะไม่ใช้ Finish () (เหมือนจะใช้ startActivity (... ))

ฉันต้องการให้กิจกรรมแบ็คสแต็คเคลียร์เมื่อพวกเขาเปิดตัวกิจกรรมที่ 2 (ดังนั้นการกดกลับจากกิจกรรมใหม่ในทางเทคนิคจะทำให้พวกเขากลับไปที่ตัวเรียกใช้งาน)

คำตอบ:


284

เมื่อทำงานร่วมกับชิ้นส่วนแทนการใช้หรือหมายถึงบริบทการใช้งานเสมอthis getActivity()คุณควรโทร

getActivity().finish();

เพื่อจบกิจกรรมของคุณจากส่วนย่อย


12
getActivity()ได้nullในบางกรณี แล้วเราควรทำอย่างไร?
Matjaz Kristl

3
@ user983956 finishในกรณีเช่นกิจกรรมที่ถูกทำลายแล้วดังนั้นเพียงแค่ทำไม่ได้โทร
Cristian

2
เคล็ดลับ: getActivity อาจเป็นโมฆะได้หากคุณพยายามใช้ก่อนที่จะขยายมุมมอง
csanonymus

1
กิจกรรมควรเป็นตัวควบคุม / เรียกเก็บเงินไม่ใช่ส่วนย่อยคุณควรโทรกลับกิจกรรมผ่านอินเทอร์เฟซการเรียกกลับและปล่อยให้กิจกรรมตัดสินใจว่าควรจะเสร็จสิ้นเองหรือไม่
อาเหม็ด

1
นอกจากนี้หากคุณฉีดเสื้อกล้ามในกิจกรรมอย่าลืมทำลายมันจะทำให้เกิดการรั่วไหลของหน่วยความจำหรือหากมีการเรียกกลับให้ลบออกเช่น ถ้า (getActivity ()! = null) {getActivity (). removeCallbacks (); getActivity (). destroy (); }
omersem

26

จริงๆแล้ว...

ฉันจะไม่ให้ Fragment พยายามทำกิจกรรมให้เสร็จ นั่นเป็นการให้อำนาจกับ Fragment มากเกินไปในความคิดของฉัน ฉันจะใช้คำแนะนำที่นี่: http://developer.android.com/training/basics/fragments/communicating.html

ให้ Fragment กำหนดอินเทอร์เฟซที่กิจกรรมต้องใช้ โทรหากิจกรรมจากนั้นให้กิจกรรมตัดสินใจว่าจะทำอย่างไรกับข้อมูล หากกิจกรรมต้องการที่จะเสร็จสิ้นเองก็สามารถทำได้


2
นั่นเป็นจุดที่ดีเนื่องจากกิจกรรมเดียวสามารถมีหลายส่วนได้ ดังที่คุณกล่าวถึงวิธีที่ต้องการสำหรับแฟรกเมนต์ในการสื่อสารกลับไปยังกิจกรรมของมันคือผ่านอินเทอร์เฟซ
Sasquatch

11

ตามที่Jon F Hancockกล่าวไว้นี่คือวิธีที่ส่วนย่อยสามารถ 'ปิด' กิจกรรมได้โดยแนะนำให้ปิดกิจกรรม สิ่งนี้ทำให้ชิ้นส่วนพกพาเป็นเหตุผลสำหรับพวกเขา หากคุณใช้ในกิจกรรมอื่นคุณอาจไม่ต้องการปิดกิจกรรมนั้น

โค้ดด้านล่างเป็นตัวอย่างจากกิจกรรมและส่วนที่มีปุ่มบันทึกและยกเลิก

PlayerActivity

public class PlayerActivity extends Activity 
    implements PlayerInfo.PlayerAddListener {

    public void onPlayerCancel() {
       // Decide if its suitable to close the activity, 
       //e.g. is an edit being done in one of the other fragments?
       finish();
    }
}

PlayerInfoFragment ซึ่งมีอินเทอร์เฟซที่กิจกรรมการโทรจำเป็นต้องใช้

public class PlayerInfoFragment extends Fragment {
   private PlayerAddListener callback; // implemented in the Activity

   @Override
   public void onAttach(Activity activity) {
     super.onAttach(activity);
     callback= (PlayerAddListener) activity;
   }

   public interface PlayerAddListener {
       public void onPlayerSave(Player p); // not shown in impl above
       public void onPlayerCancel();
   }

   public void btnCancel(View v) {
      callback.onPlayerCancel(); // the activity's implementation
   }
}


1

ทุกครั้งที่ใช้ Finish เพื่อปิดชิ้นส่วนกิจกรรมทั้งหมดจะปิดลง ตามเอกสารชิ้นส่วนควรยังคงอยู่ตราบเท่าที่กิจกรรมหลักยังคงอยู่

แต่ฉันพบว่าฉันสามารถเปลี่ยนมุมมองกลับกิจกรรมพาเรนต์โดยใช้คำสั่งนี้: setContentView (R.layout.activity_main);

สิ่งนี้ทำให้ฉันกลับไปที่กิจกรรมหลัก

ฉันหวังว่าสิ่งนี้จะช่วยคนอื่นที่อาจกำลังมองหาสิ่งนี้


1

ง่ายมาก...

1- เพียงแค่คว้ากิจกรรมgetActivity()ในส่วน

2- แล้วโทร finish();

ก็getActivity().finish();เป็นอันเสร็จสิ้นกิจกรรมผู้ปกครอง


1

ใน Fragment ให้ใช้ getActivity.finishAffinity ()

getActivity().finishAffinity();

มันจะลบส่วนทั้งหมดที่ผลักดันโดยกิจกรรมปัจจุบันออกจากกองที่มีกิจกรรมด้วย ...


FinishAffinity () จะลบกิจกรรมทั้งหมดที่มีความสัมพันธ์เดียวกันดังนั้นกิจกรรมที่อยู่ด้านล่างกิจกรรมปัจจุบันซึ่งมีแฟรกเมนต์ในสแต็กก็สามารถทำได้เช่นกัน
Zakaria M. Jawas

0

ลองทำตามนี้ ไม่ควรมีคำเตือนใด ๆ ...

            Activity thisActivity = getActivity();
            if (thisActivity != null) {
                startActivity(new Intent(thisActivity, yourActivity.class)); // if needed
                thisActivity.finish();
            }

0

15 มิถุนายน 2020 - อัปเดตคำตอบ

คุณมีสองตัวเลือกสำหรับ Java และ Kotlin อย่างไรก็ตามตรรกะของทั้งสองวิธีเหมือนกัน คุณควรจะเรียกกิจกรรมหลังจากที่โทรชัย ()วิธีการ

คำตอบสำหรับ Kotlin ,

หากกิจกรรมของคุณไม่สามารถเป็นโมฆะใช้ANSWER_1 แต่ถ้ากิจกรรมของคุณสามารถเป็นโมฆะใช้ANSWER_2

Answer_1: activity!!.finish()
Answer_2: activity?.finish()

คำตอบสำหรับ Java

getActivity().finish();

@canerkaseler


0

สิ่งนี้ไม่จำเป็นต้องมีการยืนยันการอัปเดตล่าสุดในส่วนใน Android JetPack

requireActivity().finish();

-1

ลองใช้สิ่งนี้

ใช่Fragment.classไม่ได้ใช้งานfinish()

getActivity()เมื่อทำงานร่วมกับชิ้นส่วนแทนการใช้นี้หรือหมายถึงบริบทการใช้งานเสมอ คุณควรโทร


11
บอกความแตกต่างระหว่างคำตอบของคุณกับคำตอบแรกด้านบน (โดย @ coder_For_Life22) ...
Filipe Brito

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