Làm thế nào để đóng phân đoạn hiện tại bằng cách sử dụng Nút như nút quay lại?


86

Tôi đã cố gắng đóng phân đoạn hiện tại bằng cách sử dụng Imagebutton.

Tôi đang ở Fragment-A và nó sẽ chuyển sang Fragment-B khi tôi nhấp vào nút.

Và khi tôi nhấp vào nút tại Fragment-B, nó sẽ chuyển sang Fragment-C và đóng Fragment-B.

Nếu tôi nhấp vào nút quay lại tại Fragment-C, nó sẽ quay lại Fragment-A.

Mã tôi đã thử giống như sau

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

Khi tôi nhấp vào nút quay lại tại mảnh B, nó chuyển sang Mảnh-C.

Nhưng khi tôi nhấp vào nút quay lại trên Fragment-C, nó không quay lại Fragment-A. Nó trở lại nền trống. Nếu tôi muốn quay lại Fragment-A, tôi phải nhấp vào nút quay lại một lần nữa.

VẬY, có vẻ như không đóng xong phân đoạn hiện tại.

Làm thế nào để kết thúc phân đoạn hiện tại như nút quay lại của Android?


Cái gì thế này MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??. bạn cần phải thêm đoạn để backstak và pop cùng phù hợp
Raghunandan

Có thêm đoạn trong hàm addFragment.
Wun

thêm phân mảnh vào cái gì và một phương thức hoạt động ??
Raghunandan

2
getActivity (). onBackPressed (); có thể làm điều này
Viswanath Lekshmanan

Câu trả lời:


82

Từ Fragment A, để đến B, thay thế A bằng B và sử dụng addToBackstack()trước đó commit().

Bây giờ Từ Fragment B, để chuyển đến C, sử dụng lần đầu popBackStackImmediate(), điều này sẽ đưa trở lại A. Bây giờ thay A bằng C, giống như giao dịch đầu tiên.


4
for usinf popStackIm Instant (): -> getView (). setOnKeyListener (new View.OnKeyListener () {@Override public boolean onKey (View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity () .getSupportFragmentManager (). popBackStackIm Instant (); return true;} return false;}});
Yash Agrawal

131

Tôi thay đổi mã từ getActivity().getFragmentManager().beginTransaction().remove(this).commit();

đến

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

Và nó có thể đóng mảnh vỡ.


35
getActivity (). onBackPressed (); Điều này sẽ làm những gì bạn đã giải thích.
Viswanath Lekshmanan

4
@ suomi35 không. Khi bạn cần ghi đè onBackPressed (), bạn sẽ phải đối mặt với vấn đề với nhận thức như vậy
Le_Enot

Có vẻ như không hoạt động. vào năm 2016, thành setNavigationOnClickListener không hoạt động.

1
@ViswanathLekshmanan Tôi nghĩ đây nên là câu trả lời thay vì nhận xét. Và câu trả lời được chấp nhận, ngoài ra.
Francisco Romero

1
Nó cũng đóng Hoạt động! Chỉ cần đóng Fragment.
Zon

70

Dành cho những ai cần tìm ra cách đơn giản

Thử getActivity().onBackPressed();


getActivity () có thể là null nhiều lần.
Arpit J.

1
@ArpitJ. nó chỉ null trước khi onAttach () được gọi, một đoạn không thể tồn tại nếu không có hoạt động.
Tamim Attafi

@TamimAttafi Đúng, nhưng tôi đã đề cập đến các trường hợp như xoay hoặc hoạt động đã kết thúc và do một số lý do cá thể phân mảnh vẫn ở đó, sau đó nó sẽ trả về null.
Arpit J.

popBackStack()popBackStackImmediate()là những cách trực tiếp hơn để mở mảnh trên cùng mà không cần mô phỏng một thao tác nhấn nút. Sử dụng onBackPressed()trình kích hoạt OnBackPressedCallbacks; nếu trong tương lai bạn muốn xử lý cụ thể các lần nhấn nút Quay lại, bạn sẽ phải chuyển sang popBackStack()/ popBackStackImmediate()để tránh kích hoạt lệnh gọi lại theo chương trình.
Nolan Amy

Bạn đặt mã này bên trong phương thức onclick của các nút của Fragment.
Anon

6

getActivity().onBackPressedhiện tất cả những gì bạn cần. Nó tự động gọi phương thức onBackPressed trong hoạt động mẹ.


5

Đây là một cách Kotlin để làm điều này, tôi đã tạo nút trong bố cục phân mảnh và sau đó đặt onClickListner trong onViewCreate.

theo @ Viswanath-Lekshmanan bình luận

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

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

điều này kết thúc hoạt động, không phải phân đoạn
nibbana

4

Thử đi:

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

Vì vậy, khi bạn nhấn phím quay lại , hoạt động hiện tại (chứa nhiều phân đoạn) sẽ tải phân đoạn trước đó thay vì tự hoàn thiện.


4

Thử đi:

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

Bạn có thể thử logic này vì nó phù hợp với tôi.

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
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
rollstuhlfahrer

Đoạn mã đơn giản này thực sự loại bỏ chế độ xem phân đoạn hiện tại bằng nút OK hoặc Đóng trên đó. Tôi sử dụng nó để thoát khỏi bảng cài đặt ánh sáng được hiển thị dưới dạng Phân mảnh và quay lại Hoạt động. Xin lỗi vì thủ thuật này nhưng với Android 8, tôi nghĩ việc quản lý nhiều Fragment không thực tế lắm.
Bruno L.

1

Nếu bạn cần xử lý hành động cụ thể hơn bằng nút quay lại, bạn có thể sử dụng phương pháp sau:

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

Trong Phân đoạn của onCreateView(...)bạn, bạn có thể xóa chế độ xem bằng cách gọi container.removeView(view);. Vì vậy, nếu bạn muốn loại bỏ phân mảnh, thì viewgiá trị trả về phải là onCreateView,

ví dụ

    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;
    }

-7

Hãy thử cái này

getActivity().finish();

1
Hãy thử giải thích câu trả lời của bạn nhiều hơn, do đó dễ dàng của nó đối với OP và những người khác để hiểu được câu trả lời, người trở về với câu hỏi này trong tương lai
Aman Chhabra

7
này đóng cửa toàn bộ hoạt động, không phải là mảnh
BUSUU

Nó đã giúp đỡ tôi. Những người muốn biết thêm thông tin có thể google nó. Không cần sao chép tài liệu chính thức ở đây.
Alesha170 13/07/19

Nếu bạn đang sử dụng BottomNavigationView thường có một hoạt động, lệnh này sẽ đóng ứng dụng thay vì quay lại phân đoạn trước đó.
Aliton Oliveira
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.