據我所知, s 只有在他們已經實作或設定了之前(或對于 API 24 )被呼叫View時才接收s。然后,如果他們回傳,他們將繼續接收額外的拖動事件。DragEventonDragEvent()OnDragListener startDrag()startDragAndDrop()trueDragEvent.ACTION_DRAG_STARTED
但是,我正在尋找一種在拖動操作已經開始后DragEvent接收s的方法,因為 s 在拖動操作期間被添加到布局中。View
為了說明原因,我的情況大致如下:
我有一個可以拖動串列項的片段ViewPager2。ListView如果我將一個專案拖到另一個專案上,我會“輸入”該專案,并且ListView會顯示一個帶有新子專案的新片段。這作業正常。
但是,由于在開始拖動操作時這些新的子項不存在,因此DragEvent當我繼續將項拖動到這些新項上時,它們不會收到 s。
所以,基本上,我希望能夠在一次連續拖動操作中進入多個層次。
是否可以為正在進行的拖動操作添加新View的 s receive ?DragEvent
uj5u.com熱心網友回復:
好的,我已經設法通過將原始DragEvent(帶有 action 的DragEvent.ACTION_DRAG_STARTED那個)重新發送到我的主要組件來解決它,這是ViewGroup.
在檢查源代碼時,ViewGroup.dispatchDragEvent()我發現ViewGroup有一個名為的成員變數mChildrenInterestedInDrag填充了對拖動事件感興趣的孩子,何時DragEvent.ACTION_DRAG_STARTED收到。
ViewGroup.dispatchDragEvent()因此,當我使用原始s呼叫時DragEvent,在我在串列中輸入一個專案以查看其子專案后,那些新的ListView子專案現在正在回應附加DragEvent的 s。
我有點擔心這種方法可能會產生意想不到的副作用。如果我在進一步測驗時遇到這種影響,我會更新這個答案。但現在它會做。
如果有人知道這確實可能會產生意想不到的副作用和/或有更好的解決方案,我很想聽聽。
附錄:
在存盤原件DragEvent以便重新調度時,我不得不“克隆”該事件,因為雖然它在 API 19 模擬器中正常作業,但在 API 19 手機上,原件DragEvent的動作在拖動程序中不斷改變,所以它的動作不會' 不再反映DragEvent.ACTION_DRAG_STARTED并且重新調度沒有將新添加View的 s 注冊為對正在進行的拖動操作感興趣的預期效果。
由于DragEvents 不能被克隆或構造,我不得不在 a 的幫助下“克隆”它Parcel:
void storeStartEvent(DragEvent startEvent) {
Parcel parcel = Parcel.obtain();
startEvent.writeToParcel(parcel, 0);
// important to "rewind" the Parcel first
parcel.setDataPosition(0);
this.startEvent = DragEvent.CREATOR.createFromParcel(parcel);
}
除此之外,我還沒有遇到任何明顯的問題,所以它可能很好地解決了我的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/472083.html
