如何在片段中管理 BackPress 超过 10 次?

问题描述

我想在片段中管理 backpress,我知道通过调用 onBackpress 方法来处理活动中的 brackpress。

import SwiftUI

struct ContentView: View {
    @Observedobject var viewmodel = viewmodel()

    var body: some View {
        ScrollView(showsIndicators: false,content: {
            ScrollViewReader(content: { scrollViewProxy in
                Lazyvstack(content: {
                    ForEach(viewmodel.fragments,id: \.id) { fragment in
                        Text(fragment.content + fragment.id)
                            .background(fragment == viewmodel.currentFragment ? Color.yellow : Color.gray)
                            .frame(height: 100)
                            .font(.largeTitle)
                            .id(fragment.id)
                    }
                })
                .id("ContentView-Lazyvstack-Animation")
                .onReceive(viewmodel.$currentFragment,perform: { currentFragment in
                    guard let currentFragment = currentFragment else {
                        return
                    }
                    withAnimation(.easeInOut(duration: 2)) {
                        scrollViewProxy.scrollTo(currentFragment.id,anchor: .center)
                    }
                })
            })
        })
        .id("ContentView-ScrollView-Animation")
    }
}

final class viewmodel: ObservableObject {
    @Published var fragments: [Fragment] = [Int](0..<100).map({ Fragment(id: "\($0)",content: "Some text yeah! super cool.") })
    @Published var currentFragment: Fragment?

    private var scrollingTimer: Timer?

    init() {
        currentFragment = fragments.first

        setupRandomScroll()
    }

    func setupRandomScroll() {
        scrollingTimer = Timer.scheduledTimer(withTimeInterval: 0.2,repeats: true,block: { [weak self] _ in
                                                guard let self = self else {
                                                    return
                                                }
                                                let newIndex = Int.random(in: 70..<100)
                                                self.currentFragment = self.fragments[newIndex]
                                              })
    }
}

final class Fragment: ObservableObject,Equatable,Hashable {
    var id: String
    @Published var content: String

    init(id: String,content: String) {
        self.id = id
        self.content = content
    }

    static func == (lhs: Fragment,rhs: Fragment) -> Bool {
        return lhs.id == rhs.id
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
}

但是我在 Activity 中实现了 Fragment 并将其替换了 10 多次以上,所以每当我按下返回键应用程序关闭时。

所以我想多次在片段中管理backpress。

如果有人知道最佳解决方案,请给出您的答案,我已经尝试过类似问题给出的许多解决方案,但都不起作用。

提前致谢:)

解决方法

您可以使用这种方式处理 Fragment 上的背压

    @Override
public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
    super.onViewCreated(view,savedInstanceState);
    if (getView() != null) {
        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View view,int keyCode,KeyEvent keyEvent) {
                if (keyEvent.getAction() == KeyEvent.ACTION_DOWN)
                    if (keyCode == KeyEvent.KEYCODE_BACK)
                        if (Constants.getInstance().checkIsAudioPlay()) {
                            stopAudioPlaying();
                            refreshView();
                            btnPlayALL.setText(R.string.play_all);
                            return true;
                        } else {
                            return false;
                        }

                return false;
            }
        });
    }
}
,

在您的 Activity 的 onBackPressed() 方法中添加以下内容:

    FragmentManager fragmentManager = getSupportFragmentManager();
    if (fragmentManager.getFragments().size() > 0) {
        fragmentManager.popBackStack();
    }else {
        super.onBackPressed();
    }

另外不要忘记覆盖片段的 onPause() 方法,并在按下后退按钮时处理您希望片段完成的任务。