CoordinatorLayout自定义行为在更改布局时on DependententViewChanged被损坏



i使用自定义协调员layout行为来跟踪CoordinatorLayout中的滑动以将两个小部件滑动并起作用(类似于自定义的底部表格behavior 另一种行为以遵循底部表的位置),但是在某些情况下它被打破了。

布局结构有点复杂,但它是这样的:

CoordinatorLayout (root tag of activity layout)
 - Fragment (DetailFragment)
   - CoordinatorLayout (root tag of DetailFragment)
     - Fragment (MapFragment - with custom app:layout_behavior)
     - CoordinatorLayout (also with another custom app:layout_behavior)
       - NestedScrollView
         - LinearLayout
           - LinearLayout
             - Some content

MapFragment元素上安装的自定义行为取决于以下元素(coordinatorlayout)上的layoutdependson()方法。并且以下元素具有自定义行为,它以滑动手势将其滑动。在这种情况下,MapFragment的自定义行为会随着其依赖性的每个动作而获得事件。

但是,如果我在本节中进行更改,我调用了一些内容,例如我调用setViability否则请在其中列出listView并在其上调用setAdapter(此方法在内外调用requestlayout方法 - 与布局更改相同,例如setVisibility似乎)它停止工作,这意味着即使相关视图位置发生了变化,也会停止接收依赖性视图的自定义行为。

可能还有其他隐藏条件可以使此问题发生。因此,我需要找到隐藏的原因,或解决方法如何使其工作。

因为,如果我在活动中使用细节片段,则会发生此问题,但是在另一项活动中,它似乎有效。

我也忘了说,它也显示为另一个额外的问题,固定性方法不起作用 - 元素仍然隐藏了Cl的 行为(在有问题的活动中。在我的布局并在其上称为setadapter中,它也没有起作用 - 正如我所说,它显然与固定性方法相似)。

是的,我试图通过UI线程明确调用setVisibily,例如

  getActivity().runOnUiThread(new Runnable(){
    @Override
    public void run() {
      xxx.setVisibility(View.VISIBLE);  
  }});

,但这无济于事。谢谢

其他注释:

  • 在有问题的活动中,MapFragment行为方法至少调用一次(当显示活动时 - 应正确链接依赖性时),我认为它将其依赖性依赖性为依赖性。但是问题是,如果我更改其依赖性位置,则不再触发此事件。

  • 在片段代码中,我调用setVisibily方法,我也尝试调用getView()。requestlayout(),但没有帮助。

  • 还要注意,我尝试调用setvisibility的元素在那一刻不在屏幕之外(因为mapfragment之后的坐标layout上的自定义行为类似于bottomsheetsheetbehavior),因此,如果这不是问题(如果这不是问题(在工作活动中,它显示在屏幕上 - 显示底部的表格扩展,而不是隐藏或折叠为有问题的活动)

编辑:

一定是半死或懒惰的UI事件消息系统左右,因为我发现如果我更改活动布局中其他元素的可见性,voila -map自定义行为再次开始工作! - 尽管我试图设置可见的元素仍然是隐藏的。

所以这是片段中的代码:

getView().findViewById(R.id.info_beer_bdark).setVisibility(View.VISIBLE);

如果我将其更改为:

getView().findViewById(R.id.info_beer_bdark).setVisibility(View.VISIBLE);
getActivity().findViewById(R.id.tabs).setVisibility(View.GONE);

MapFragment的行为再次起作用 - 尽管正如我所说,我试图使可见的元素仍然隐藏了 - 也许在该布局级别上也需要一些"清爽注入"。(标签与详细信息元素的布局级别相同)

问题的原因可能是因为我在其自定义行为中使用下面的代码在其自定义行为中对坐标layout(mapfragment之后)进行动画,并且在动画中更改了孩子的可见性。

 ViewCompat.postOnAnimation(child, new SettleRunnable(child, state));

伪代码:

 startCoordinatorUIAnimation(); // it takes like 300ms
 changeVisibilityOfCoordinatorChildren(); // doesn't work while animating + breaks Coordinator Behavior

我仍然不知道如何实现这一目标 - 在为父母动画时改变孩子的可见性。我尝试了runonuithread,也使用runonuithread Asynctask,但这无效。

最新更新