我有2 Fragment
F1 和 F2 。我使用以下代码从Activity
打开第一个MyFragment f1 = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("GameLevelType", "Learn");
dialog.setArguments(bundle);
FragmentTransaction gameTransaction = getSupportFragmentManager().beginTransaction();
gameTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
gameTransaction.add(android.R.id.content, f1).addToBackStack(null).commit();
F1 :
Fragment
然后从Fragment
F1 我使用以下代码打开另一个MySecondFragment f2 = new MySecondFragment();
Bundle bundle = new Bundle();
FragmentTransaction transaction = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
bundle.putInt("CurrentPosition", getAdapterPosition());
bundle.putIntArray("x", kolamTracingGameList.get(getAdapterPosition()).getX());
bundle.putIntArray("y", kolamTracingGameList.get(getAdapterPosition()).getY());
bundle.putInt("Level", (getAdapterPosition() + 1));
bundle.putString("GameType", "Kolam");
fragment.setArguments(bundle);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.replace(android.R.id.content, f2).addToBackStack(null).commit();
F2 :
Fragment
问题是当我关闭Fragment
F2 并且onViewCreated()
F1 来到前台时。整个 F1 正在重新创建(再次调用let officialAccountObservable : Observable<[SearchUser]> = SearchAPI.sharedAPI.suggestAccounts()
officialAccountObservable.bind(to: tableView.rx.items(cellIdentifier: "followcell", cellType: FollowCell.self)) {
(index, user , cell) in
if user.profileImagePath.isEmpty == false {
cell.profile.af_setImage(withURL: URL.init(string: user.profileImagePath)!)
}else {
cell.profile.image = UIImage.init(named: "icon_user_03")
}
cell.nickName.text = user.nickName
cell.follow.rx.tap
.debounce(0.3, scheduler: MainScheduler.instance)
.subscribe(onNext: {
[unowned self] in
cell.setFollow(user: user, completion: { (result) in
if(result == true){
}
})
}).addDisposableTo(self.disposeBag)
}.addDisposableTo(disposeBag)
func suggestAccounts() -> Observable<[SearchUser]> {
let uri = Constants.VyrlSearchURL.suggestUsers
return Observable.create { observer in
let request = Alamofire.request(uri, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: Constants.VyrlAPIConstants.getHeader()).responseArray { (response: DataResponse<[SearchUser]>) in
let value = response.result.value
observer.onNext(value!)
observer.onCompleted()
}
return Disposables.create(with: request.cancel)
}
}
)。我不希望 F1 在前景时再次重新创建。
答案 0 :(得分:2)
对于第二个片段,请使用add而不是replace。
replace
- 删除现有片段并添加新片段。当片段F2中按下后退按钮时,再次调用oncreateView中的片段。
add
- 保留现有片段并添加一个新片段,表示现有片段将处于活动状态,并且它们不会处于'暂停'状态。当片段F2中按下后退按钮时,没有任何方法片段F1再次被调用。
transaction.add(android.R.id.content, f2).addToBackStack(null).commit();
答案 1 :(得分:2)
如果您希望Fragment保持状态并且不通过onCreateView
,则无法替换它。让我们来看看Fragment的生命周期:
当您在片段上调用replace时,您基本上是告诉容器删除所有当前片段,并添加一个新片段。如果你删除一个片段,onPause()
将一直被调用到onViewDestroyed()
,这意味着如果你得到片段实例并将其添加到容器中,它就没有View,所以{{1将被调用。
如果你在Fragment2上调用add,它将是可见片段,但Fragment1仍将在容器中。现在,一旦删除Fragment2(backPress或以编程方式),Fragment1将在不调用onCreateView()
或任何其他状态的情况下变为可见。
代码:
替换它:
onCreateView()
使用:
transaction.replace(android.R.id.content, f2).addToBackStack(null).commit();
答案 2 :(得分:-1)
每次执行FragmentTransaction
之前,您都会创建新的Fragment
,F1
或F2
。你有几个选择:
F1/F2
时保留对null
的全局引用。因此,如果它们是F1/F2
,则只创建一个新的。FragmentManager.findFragmentByTag()
指定唯一标记。这样您就可以致电Fragment
,如果它仍然存在,它会返回FragmentManager supportFragmentManager = getSupportFragmentManager();
MyFragment f1 = supportFragmentManager.findFragmentByTag("f1_fragment");
if (f1 != null) f1 = new MyFragment();
FragmentTransaction gameTransaction = supportFragmentManager.beginTransaction();
gameTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
gameTransaction.replace(android.R.id.content, f1, "f1_fragment")
.commit();
。然后你做你的交易。选项2的示例:
Operating system (CmdExec)