请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

FragmentManager.findFragmentByTag == null ?

public class MainActivity extends FragmentActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    Button btn = findViewById(R.id.button1);
    btn.setOnClickListener(v -> {
        with();
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        with();
    });
}

public void with() {
    FragmentManager fm = this.getSupportFragmentManager();
    Fragment fragment = fm.findFragmentByTag("abc");
    if (fragment == null) {
        Log.i("hunter", "这一行执行了两次");
        fragment = new Fragment();
        fm.beginTransaction().add(fragment, "abc").commitAllowingStateLoss();
    }
}

}

老师,上面的代码new Fragment()怎么执行了两次,第一次添加Fragment的时候设置了tag呀

正在回答

1回答

因为fragment添加不是同步的,第一个with调用完以后你阻塞了主线程,所以fragment根本没有办法真正添加。

1 回复 有任何疑惑可以回复我~
  • 提问者 AndroidHunter #1
    把这一行Thread.sleep(4000)去掉,new Fragment()还是执行了两次
    回复 有任何疑惑可以回复我~ 2019-12-13 18:01:36
  • bennyhuo 回复 提问者 AndroidHunter #2
    只要你在这里连续调用with就一定是这样,异步添加,需要在下一个主线程循环执行。
    回复 有任何疑惑可以回复我~ 2019-12-13 18:06:32
  • 提问者 AndroidHunter 回复 bennyhuo #3
    异步添加,fragment难道是在子线程里添加的
    回复 有任何疑惑可以回复我~ 2019-12-13 18:10:36
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信