วิธีการปิดส่วนปัจจุบันโดยใช้ปุ่มเหมือนปุ่มย้อนกลับ?


91

ฉันพยายามปิดส่วนปัจจุบันโดยใช้ Imagebutton

ฉันอยู่ใน Fragment-A และมันจะเปลี่ยนเป็น Fragment-B เมื่อฉันคลิกปุ่ม

และเมื่อฉันคลิกปุ่มที่ Fragment-B มันจะเปลี่ยนเป็น Fragment-C และปิด Fragment-B

ถ้าฉันคลิกปุ่มย้อนกลับที่ Fragment-C มันจะกลับไปที่ Fragment-A

รหัสที่ฉันได้ลองมีดังต่อไปนี้

camera_album = (ImageButton) view.findViewById(R.id.camera_album);

camera_album.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

                    closefragment();
        Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
        MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;


    }
});

private void closefragment() {
    getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}

เมื่อฉันคลิกปุ่มย้อนกลับที่แฟรกเมนต์ -B มันจะเปลี่ยนเป็น Fragment-C

แต่เมื่อฉันคลิกปุ่มย้อนกลับบน Fragment-C มันจะไม่กลับไปที่ Fragment-A กลับสู่พื้นหลังที่ว่างเปล่า ถ้าฉันต้องการกลับไปที่ Fragment-A ฉันต้องคลิกปุ่มย้อนกลับอีกครั้ง

ดังนั้นดูเหมือนว่าจะไม่ปิดส่วนปัจจุบันที่สมบูรณ์

จะจบส่วนปัจจุบันเช่นปุ่มย้อนกลับของ Android ได้อย่างไร


นี่คืออะไรMainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??. คุณต้องเพิ่มส่วนใน backstak และป๊อปอัพตามนั้น
Raghunandan

มีการเพิ่มส่วนในฟังก์ชัน addFragment
Wun

เพิ่มส่วนของอะไรและวิธีกิจกรรม ??
Raghunandan

2
getActivity (). onBackPressed (); ทำได้
Viswanath Lekshmanan

คำตอบ:


83

จากส่วนหนึ่งที่จะไป B เปลี่ยน A กับ B และการใช้งานก่อนaddToBackstack()commit()

ตอนนี้จาก Fragment B ไปที่ C ใช้ครั้งแรกpopBackStackImmediate()สิ่งนี้จะนำ A กลับมาแทนที่ A ด้วย C เช่นเดียวกับธุรกรรมแรก


4
สำหรับ usinf popStackImmediate (): -> getView (). setOnKeyListener (View OnKeyListener ใหม่ () {@Override บูลีนสาธารณะ onKey (View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity () .getSupportFragmentManager (). popBackStackImmediate (); return true;} return false;}});
Yash Agrawal

134

ฉันเปลี่ยนรหัสจาก getActivity().getFragmentManager().beginTransaction().remove(this).commit();

ถึง

getActivity().getFragmentManager().popBackStack();

และสามารถปิดส่วน


36
getActivity (). onBackPressed (); สิ่งนี้จะทำตามที่คุณได้อธิบายไว้
Viswanath Lekshmanan

5
@ suomi35 เลขที่ เมื่อคุณต้องการแทนที่ onBackPressed () คุณจะประสบปัญหากับการรับรู้ดังกล่าว
Le_Enot

ดูเหมือนจะไม่ทำงาน ในปี 2559 ใน setNavigationOnClickListener ไม่ทำงาน

1
@ViswanathLekshmanan ฉันคิดว่านี่น่าจะเป็นคำตอบแทนความคิดเห็น และคำตอบที่ได้รับการยอมรับนอกจากนี้
Francisco Romero

1
ปิดกิจกรรมด้วย! จำเป็นต้องมีการปิด Fragment เท่านั้น
Zon

72

สำหรับผู้ที่ต้องการหาวิธีง่ายๆ

ลอง getActivity().onBackPressed();


getActivity () สามารถเป็นค่าว่างได้หลายครั้ง
Arpit J.

1
@ArpitJ. เป็นโมฆะเท่านั้นก่อนที่จะเรียก onAttach () ส่วนที่ขาดไม่ได้หากไม่มีกิจกรรม
Tamim Attafi

@TamimAttafi True แต่ฉันอ้างถึงกรณีเช่นการหมุนหรือกิจกรรมเสร็จสิ้นและเนื่องจากเหตุผลบางประการยังคงมีอินสแตนซ์แฟรกเมนต์อยู่จึงจะคืนค่าว่าง
Arpit J.

popBackStack()และpopBackStackImmediate()เป็นวิธีที่ตรงมากขึ้นในการโผล่ส่วนบนสุดโดยไม่ต้องจำลองการกดปุ่ม การใช้onBackPressed()ทริกเกอร์OnBackPressedCallbacks; หากในอนาคตคุณต้องการจัดการกับการกดปุ่มย้อนกลับโดยเฉพาะคุณจะต้องเปลี่ยนเป็นpopBackStack()/ popBackStackImmediate()เพื่อหลีกเลี่ยงการเรียกใช้การโทรกลับโดยใช้โปรแกรม
Nolan Amy

คุณใส่รหัสนี้ไว้ในวิธีการคลิกปุ่มของ Fragment
อานนท์

6

getActivity().onBackPressedทำทุกอย่างที่คุณต้องการ โดยอัตโนมัติเรียกใช้เมธอดonBackPressedในกิจกรรมหลัก


5

นี่เป็นวิธีของ Kotlin ในการทำสิ่งนี้ฉันได้สร้างปุ่มในเค้าโครงแฟรกเมนต์จากนั้นตั้งค่า onClickListner ใน onViewCreated

ตามความเห็นของ @ Viswanath-Lekshmanan

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) 
{
     super.onViewCreated(view, savedInstanceState)

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}

สิ่งนี้ปิดกิจกรรมไม่ใช่ส่วน
nibbana

4

ลองสิ่งนี้:

ft.addToBackStack(null);   // ft is FragmentTransaction

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


4

ลองสิ่งนี้:

public void removeFragment(Fragment fragment){
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
}

4

คุณสามารถลองใช้ตรรกะนี้ได้เพราะมันใช้ได้กับฉัน

frag_profile profile_fragment = new frag_profile();

boolean flag = false;
@SuppressLint("ResourceType")
public void profile_Frag(){
    if (flag == false) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1);
        transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment");
        transaction.commit();
        flag = true;
    }

}

@Override
public void onBackPressed() {
    if (flag == true) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.remove(profile_fragment);
        transaction.commit();
        flag = false;
    }
    else super.onBackPressed();
}

3
Button ok= view.findViewById(R.id.btSettingOK);
Fragment me=this;
ok.setOnClickListener( new View.OnClickListener(){
    public void onClick(View v){
     getActivity().getFragmentManager().beginTransaction().remove(me).commit();
    }
});

3
แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มมูลค่าในระยะยาว
rollstuhlfahrer

1
โค้ดง่ายๆนี้จะลบมุมมองแฟรกเมนต์ปัจจุบันโดยใช้ปุ่มตกลงหรือปิด ฉันใช้มันเพื่อออกจากแผงการตั้งค่าแสงที่แสดงเป็น Fragment และกลับไปที่กิจกรรม ขออภัยสำหรับเคล็ดลับนี้ แต่ภายใต้ Android 8 ฉันคิดว่าการจัดการ Fragment หลาย ๆ ชิ้นนั้นใช้ไม่ได้จริง
Bruno L.

1

หากคุณต้องการจัดการการกระทำโดยเฉพาะด้วยปุ่มย้อนกลับคุณสามารถใช้วิธีการต่อไปนี้:

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            onCloseFragment();
            return true;
        } else {
            return false;
        }
    }
});

0

ในเศษเสี้ยวของคุณคุณสามารถลบมุมมองโดยการเรียกonCreateView(...) container.removeView(view);ดังนั้นหากคุณต้องการที่จะลบส่วนแล้วviewควรจะมีค่าตอบแทนของonCreateView,

ตัวอย่างเช่น

    public View onCreateView(...){
        final View view = inflater.inflate(R.layout.your_fragments_layout,container,false);
        //Do something
        finishButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                container.removeView(view);
            }
        });
        return view;
    }


-8

ลองอันนี้

getActivity().finish();

1
ลองอธิบายคำตอบของคุณให้มากขึ้นเพื่อให้ OP และผู้อื่นเข้าใจคำตอบที่จะกลับมาที่คำถามนี้ในอนาคตได้ง่ายขึ้น
Aman Chhabra

7
สิ่งนี้จะปิดกิจกรรมทั้งหมดไม่ใช่ส่วน
busuu

มันช่วยฉัน ผู้ที่ต้องการข้อมูลเพิ่มเติมสามารถ google ได้ ไม่จำเป็นต้อง copypaste ที่นี่เอกสารอย่างเป็นทางการ
Alesha170

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