2016-03-07 71 views
6

Im試圖使用SpannableStringOnDragListener設置爲TextView的某些單詞。即時通訊能夠通過使用ClickableSpan在SpannableString上設置Drag Listener

hashText.setSpan(new ClickableSpan() { 

添加一個OnClick偵聽器,我想我會嘗試相同,但與OnDragListener取代ClickableSpan

我可以讀取不同的拖拽事件,但我無法將拖拽事件隔離到我選擇的特定單詞,因爲我能夠使用ClickableSpan

hashText.setSpan(new View.OnDragListener() { 
      @Override 
      public boolean onDrag(View targetView, DragEvent event) { 
       int action = event.getAction(); 
       TextView targetVariable = (TextView) targetView; 
       String textGetter; 
       textGetter = targetVariable.getText().toString(); 
       // boolean actionDropOutside = (DragEvent.ACTION_DRAG_ENDED != DragEvent.ACTION_DROP); 
       switch (event.getAction()) { 
       case DragEvent.ACTION_DRAG_STARTED: 


        Log.d(TAG, "DRAG STARTED"); 
        break; 
       case DragEvent.ACTION_DRAG_ENTERED: 

        ////create method that checks if text is empty if so lights up 
        //if (textGetter.equals("")) { 
        targetView.setBackgroundColor(CARD_SLECTED); 
        //lightupVariableCard(cardV); 
        Log.d(TAG, "DRAG ENTERED EMPTY TEXT"); 
        //} 

        Log.d(TAG, "DRAG ENTERED" + targetVariable.getText().toString()); 
        break; 
       case DragEvent.ACTION_DRAG_EXITED: 
        targetView.setBackgroundColor(CARD_UNSLECTED); 
        Log.d(TAG, "DRAG EXITED"); 
        break; 

       case DragEvent.ACTION_DROP: 
        // Dropped, reassign View to ViewGroup 
        //if (textGetter.equals("")) { 
        TextView draggedView = (TextView) event.getLocalState(); 
        ViewGroup owner = (ViewGroup) draggedView.getParent(); 
        targetVariable.setText(draggedView.getText()); 
        owner.setVisibility(View.INVISIBLE); 
        targetView.setBackgroundColor(CARD_UNSLECTED); 
        //fabDisplayCounter++; 
        //displayFab(); 
        Log.d(TAG, "DRAG DROPPED"); 
        //} 
        Log.d(TAG, "DRAG NOT POSSSIBLE HERE"); 
        break; 
       case DragEvent.ACTION_DRAG_ENDED: 
//    if (actionDropOutside == true){ 
//     Log.d(TAG, "DRAG DROPPED OUTSIDE TRUE"); 
//    } 
        Log.d(TAG, "DRAG ENDED"); 
        //default: 

       } 
       return true; 
      } 


      }, matcher.start(), matcher.end(), i); 
      the_question.setText(hashText); 
      the_question.setMovementMethod(LinkMovementMethod.getInstance()); 
      //the_question.setOnDragListener(new MyDragListener(hashText.nextSpanTransition())); 

回答

2

我不是這個領域的大專家,從來沒有把它挖出來。但既然你沒有答覆,我會試着給你一些提示/方向。

我覺得你需要的是自定義MovementMethod

Android平臺MovementMethod在這裏管理這個包裏面: https://github.com/android/platform_frameworks_base/tree/master/core/java/android/text/method

具體這個接口: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/MovementMethod.java

正如你看到它有一個onTouchEvent()方法。

ClickableSpan有一個onClick方法,但它僅適用,因爲有一個LinkMovementMethod處理觸摸事件,尋找ClickableSpan併發出對他們的onClick()

請參見: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/LinkMovementMethod.java

延伸: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/ScrollingMovementMethod.java

延伸 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/BaseMovementMethod.java

但最後並不會真正觸動有關。

ScrollingMovementMethod使用類Touch委派觸摸事件處理,你可以看到這個類在這裏: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/Touch.java

的代碼非常快看,我認爲你可以擴展LinkMovementMethod,並添加拖動檢測那裏。然後爲Drag創建一個新的Span類型並調用其中的拖動方法。

我知道我沒有給你一個解決方案,但我希望我指出你在正確的方向。

+0

嘿感謝您的反饋。我不打算作爲答案,因爲我不希望被mods大吼,但我繼續投票,確保你獲得積分。我已經對你提出了一些建議,但在此期間我已經走了另一個方向。只要有時間,我會重新考慮你的建議,並根據你的答案添加解決方案。再次感謝 – user1446988

+0

@ user1446988沒有問題的隊友,考慮用你找到的解決方案回答你自己的問題,它可以幫助別人甚至你未來的自我。如果你嘗試我的建議,讓我知道。 –