簡體   English   中英

更改布局時,CoordinatorLayout自定義行為onDependentViewChanged將被破壞

[英]CoordinatorLayout Custom Behavior onDependentViewChanged is broken when layout is changed

我使用Custom CoordinatorLayout Behavior來跟蹤CoordinatorLayout中的滑動功能,將兩個小部件一起滑動並且它可以工作(類似於Custom BottomSheetBehavior +另一個跟隨底部位置的行為),但在某些情況下它會被破壞。

布局結構有點復雜,但它是這樣的:

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的自定義行為會在其依賴項的每次移動時接收事件onDependentViewChanged。

但是,如果我在部分中進行了更改,我調用了一些內容,例如我調用setVisibility或者我將ListView放在其上並調用setAdapter(此方法通常會調用requestLayout方法 - 這與布局更改有關,就像setVisibility一樣)它停止工作,這意味着即使依賴視圖位置已更改,MapFragment的自定義行為也會停止接收onDependentViewChanged。

這個問題可能還有一些隱藏的條件讓它發生。 所以我需要找到隱藏的原因,或者解決方法如何使其工作。

因為,如果我在活動中使用Detail片段,則會出現此問題,但在另一個活動中,它似乎正常工作。

我也忘了說,它還顯示另一個額外的問題,即setVisibility方法不起作用 - 元素保持隱藏+ CL的行為被破壞(在有問題的活動中。順便說一下 - 當我在我的布局中有listview時並且在它上面調用了setAdapter,它也不起作用 - 正如我所說的,它顯然與setVisibility方法類似)。

是的,我試圖通過UI線程顯式調用setVisibility

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

但它沒有幫助。 謝謝

補充筆記:

  • 在有問題的Activity中,至少調用一次onDevivment行為方法onDependentViewChanged(當顯示活動時 - 應指示依賴關系應該正確鏈接),我認為它找到正確的CoordinatorLayout作為其依賴關系。 但問題是,如果我改變其依賴關系的位置,則不再觸發此事件。

  • 在我調用setVisibility方法的片段代碼中,我也嘗試在它之后調用getView()。requestLayout()但它沒有幫助。

  • 還要注意我嘗試調用setVisibility的元素是在屏幕外的那一刻(因為MapFragment之后的CoordinatorLayout上的自定義行為就像BottomSheetBehavior),所以如果它不是一些問題(在工作活動中它是顯示在屏幕上 - BottomSheet顯示為擴展,未隱藏或折疊,如有問題的活動)

編輯:

它必須是半死或懶惰的UI事件消息系統左右,因為我發現如果我改變活動布局中其他元素的可見性,瞧 - 地圖自定義行為再次開始工作! - 雖然我試圖將setVisibility設置為visible的元素仍然是隱藏的..

所以這是片段中的代碼:

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元素位於相同的布局級別)

問題的原因可能是因為我在其自定義行為中使用下面顯示的代碼動畫了CoordinatorLayout(在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,但這不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM