问题描述
我想在片段中管理 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()
方法,并在按下后退按钮时处理您希望片段完成的任务。