1

Я использую Custom CoordinatorLayout Behavior для функциональности отслеживания прокрутки в CoordinatorLayout, чтобы объединить два виджета вместе и работает (что-то вроде Custom BottomSheetBehavior + другое поведение, чтобы следовать за положением нижнего листа), но при некоторых обстоятельствах он сломается.КоординаторLayout Пользовательское поведение onDependentViewChanged нарушается при изменении макета

Макет структура является немного сложным, но это так:

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 элемента зависит с помощью метода layoutDependsOn() на следующий элемент (CoordinatorLayout). И этот следующий элемент имеет собственное пользовательское поведение, которое сворачивает его с помощью жестов. В этом случае пользовательское поведение MapFragment получает событие onDependentViewChanged с каждым движением его зависимости.

Но если я вношу изменения в раздел, который я назвал некоторым контентом, например, я вызываю setVisibility, или я помещаю там ListView и вызываю setAdapter на него (этот метод взаимно вызывает метод requestLayout, что имеет какое-то отношение к изменению макета, setVisibility кажется) Он перестает работать, это означает, что пользовательское поведение MapFragment перестает получать onDependentViewChanged, даже если изменилась позиция зависимого представления.

Возможно, есть еще одно скрытое условие для этой проблемы, чтобы это произошло. Поэтому мне нужно либо найти скрытую причину, либо обходной путь, как заставить его работать.

Потому что, если я использую фрагмент Detail в действии, эта проблема возникает, но в другом действии она работает.

Я также забыл сказать, что он также показывает еще одну дополнительную проблему, что метод setVisibility не работает - элемент остается скрытым + поведение CL нарушено (в проблемной деятельности. Btw - также когда я listview в моем макете и назвал setAdapter на нем, это тоже не сработало - как я уже сказал, это явно похоже на метод setVisibility).

Да я попытался вызвать setVisibility явно через UI нить как

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

, но это не помогло. Благодарности

Дополнительные примечания:

  • В проблемном деятельности, метод поведения MapFragment onDependentViewChanged вызывается по крайней мере один раз (когда отображается активность - что следует указать зависимость должна быть правильно связаны) и я думаю, он находит правильный CoordinatorLayout в качестве своей зависимости. Но проблема в том, что это событие больше не увольняется, если я изменяю позицию его зависимости.

  • В коде фрагмента, где я вызываю метод setVisibility, я также попытался вызвать getView(). RequestLayout() после него, но это не помогло.

  • Также обратите внимание, что элемент, на котором я пытаюсь вызвать setVisibility, находится в этот момент вне экрана (поскольку пользовательское поведение в CoordinatorLayout после MapFragment - это что-то вроде BottomSheetBehavior), поэтому, если это не какая-то проблема (в рабочая деятельность она отображается на экране - BottomSheet отображается с расширен, а не скрыт или свернут как в проблемной деятельности)

Edit:

это должно быть что-то вроде полумертвых или ленивых UI системы обмена сообщениями или так, потому что я обнаружил, что, если я изменяю видимость какого-либо другого элемента в макете активности, пользовательское поведение volila-map снова начнет работать! - хотя элемент я пытался setVisibility видимым еще скрыт ..

Так вот код в фрагменте:

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 работает снова - хотя, как я уже сказал, элемент, который я пытался сделать видимым, по-прежнему скрыт - возможно, для этого уровня макета требуется некоторая «освежающая инъекция». (Вкладки находятся на том же уровне размещения, что и элемент DetailFragment)

ответ

0

Причина проблемы, вероятно, в том, что я анимационировал координаторLayout (после MapFragment) в своем пользовательском поведении с приведенным ниже кодом и во время анимации изменял видимость его дети.

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

псевдокод:

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

Я до сих пор не знаю, хотя, как добиться этого - изменить видимость детей при анимации родителя. Я попробовал runOnUIThread, также AsyncTask с runOnUIThread, но это не работает.

Смежные вопросы