Android-StackOverflower主细节流导航错误

Android-StackOverflower主细节流导航错误,android,android-fragments,Android,Android Fragments,我们有一个主-细节流程,主片段和细节片段都是通过片段管理器“添加”的,如下图所示 我们将homefragment中的主片段添加为 getActivity().getSupportFragmentManager().beginTransaction() .add(R.id.container, <masterfragment>, "master") .addToBackStack()

我们有一个主-细节流程,主片段和细节片段都是通过片段管理器“添加”的,如下图所示

我们将homefragment中的主片段添加为

getActivity().getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, <masterfragment>, "master")
                    .addToBackStack()
                    .commit();
经过几个小时的分析,我们发现每次我们在片段中用工具栏设置SupportActionBar时(master和detail片段都有不同的工具栏)

创建一个新的ToolbarActionBar对象,并使用新的wrappedwindow回调设置窗口回调(以下代码段从类AppCompateDelegateImplv7的android源代码复制)

在ToolbarActionBar类中创建了一个新的ToolbarCallbackWrapper(以下代码段是从android源代码复制的),正如在下面的源代码中一样,新的回调包装是从上一个窗口回调中再次创建的

 public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window window) {
        mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
        mWindowCallback = new ToolbarCallbackWrapper(window.getCallback());
        mDecorToolbar.setWindowCallback(mWindowCallback);
        toolbar.setOnMenuItemClickListener(mMenuClicker);
        mDecorToolbar.setWindowTitle(title);

        mWindow = window;
    }
因此,对于每次调用set support actionbar,它都会创建一个toolbarcallbackwrapper类的嵌套对象,如下面的调试“对象跟踪”所示

this = {ToolbarActionBar$ToolbarCallbackWrapper@5428} 
 this$0 = {ToolbarActionBar@5429} 
 mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5423} 
  this$0 = {ToolbarActionBar@5424} 
  mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5417} 
   this$0 = {ToolbarActionBar@5418} 
   mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5412} 
    this$0 = {ToolbarActionBar@5413} 
    mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5382} 
     this$0 = {ToolbarActionBar@5383} 
     mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5309} 
      this$0 = {ToolbarActionBar@5310} 
      mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5196} 
       this$0 = {ToolbarActionBar@5198} 
       mWrapped = {AppCompatDelegateImplV14$AppCompatWindowCallbackV14@5443} 
所以,每当工具栏为一个片段“准备好”时,回调就会一次又一次地被调用,导致stackoverflow错误(因为在大约100多次导航之后,嵌套对象的深度已经超过了100)

我们如何解决这个问题

getActivity().setSupportActionBar(mToolBar);
 ToolbarActionBar tbab = new ToolbarActionBar(toolbar, ((Activity) mContext).getTitle(),
            mWindow);
    setSupportActionBar(tbab);
    mWindow.setCallback(tbab.getWrappedWindowCallback());
 public ToolbarActionBar(Toolbar toolbar, CharSequence title, Window window) {
        mDecorToolbar = new ToolbarWidgetWrapper(toolbar, false);
        mWindowCallback = new ToolbarCallbackWrapper(window.getCallback());
        mDecorToolbar.setWindowCallback(mWindowCallback);
        toolbar.setOnMenuItemClickListener(mMenuClicker);
        mDecorToolbar.setWindowTitle(title);

        mWindow = window;
    }
this = {ToolbarActionBar$ToolbarCallbackWrapper@5428} 
 this$0 = {ToolbarActionBar@5429} 
 mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5423} 
  this$0 = {ToolbarActionBar@5424} 
  mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5417} 
   this$0 = {ToolbarActionBar@5418} 
   mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5412} 
    this$0 = {ToolbarActionBar@5413} 
    mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5382} 
     this$0 = {ToolbarActionBar@5383} 
     mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5309} 
      this$0 = {ToolbarActionBar@5310} 
      mWrapped = {ToolbarActionBar$ToolbarCallbackWrapper@5196} 
       this$0 = {ToolbarActionBar@5198} 
       mWrapped = {AppCompatDelegateImplV14$AppCompatWindowCallbackV14@5443}