2017-04-26 76 views
1

我試圖實現拖放目標可見(或添加它們),只要用戶開始拖動。當拖動開始時顯示拖放目標

文檔解釋說,這應該onDrag當接收ACTION_DRAG_STARTED,然後可以用來說突出View爲能夠接受拖來處理。

但是,當沒有拖動時,我的視圖(實際上是LinearLayout)應該看起來不同,並且在啓動拖動時顯示拖放目標。

普通的樣子:

[Item A][Item B] 

當拖動開始就應該是這樣的:

[ ][Item A][ ][Item B][ ] 

當空括號表示這是拖動可以被丟棄的位置。

我嘗試了下面的事情來實現這一目標:

1)動態添加視圖

當頂層容器接收ACTION_DRAG_STARTED,動態添加放置目標的看法。問題:新添加的視圖本身(或任何其他事件)永遠不會收到ACTION_DRAG_STARTED,因此它們不能接受放置。

2)有隱藏放置目標

總是有View.GONE放置目標中可用的實際項目所有的時間之間,只是讓他們View.VISIBLE當拖拽開始:

if(event.getAction() == DragEvent.ACTION_DRAG_STARTED) { 
     // Make all containers visible: 
     for(int i = 0; i < cc.getChildCount(); i++) { 
     cc.getChildAt(i).setVisibility(View.VISIBLE); 
     } 
    } 

問題:顯然View.GONE也意味着該視圖不會收到事件。與View.INVISIBLE一樣。

那麼,我有什麼選擇?使用如View.VISIBLE並在拖動開始/結束時做一些動態調整大小?似乎真的很傻...

有什麼更好的建議嗎?

+0

你可以動態地添加視圖,拖動監聽器 這裏是一個例子,但onClick Listener嘗試將其更改爲onDrag Lister http://stackoverflow.com/questions/8722595/how-to-add-onclicklistener-to -dynamically-generated-text-view/8722685 – Radwa

回答

1

您需要在致電startDrag()startDragAndDrop()之前更改能見度。我證明在this sample appthis book,來自this chapter,FWIW)。

在該樣本,如果你在平板電腦上運行它,我將啓動一個項目的長期點擊一拖拖放操作在RecyclerView

@Override 
    public boolean onLongClick(View v) { 
    if (listener!=null) { 
     listener.onStartDrag(); 
    } 

    ClipData clip=ClipData.newRawUri(title.getText(), videoUri); 
    View.DragShadowBuilder shadow=new View.DragShadowBuilder(thumbnail); 

    itemView.startDrag(clip, shadow, Boolean.TRUE, 0); 

    return(true); 
    } 

但在此之前我打電話startDrag() ,我讓一個註冊的聽衆知道我即將開始拖動。這監聽是主機的活動,這讓我的「熱點」降目標可見:

@Override 
    public void onStartDrag() { 
    info.setVisibility(View.VISIBLE); 
    } 

淨效果是類似於一個主屏幕,在具體的「行動」的出現(例如,卸載)當您啓動阻力。

我最初嘗試了第二種方法,但沒有奏效。我的假設是,調用startDrag()startDragAndDrop()基本上會捕獲可見拖放目標的名單,因此對該名單(新的小部件,新顯示的小部件)的更改在此之後不起作用。

+0

謝謝,這讓我走上正軌! – john16384