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