如何避免片段娱乐?

时间:2017-10-31 08:49:15

标签: android android-fragments

我有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 在前景时再次重新创建。

3 个答案:

答案 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之前,您都会创建新的FragmentF1F2。你有几个选择:

  1. 在创建F1/F2时保留对null的全局引用。因此,如果它们是F1/F2,则只创建一个新的。
  2. 或者,如果您不想保留全局参考,请为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(); 。然后你做你的交易。
  3. 选项2的示例:

    Operating system (CmdExec)