Wednesday, March 16, 2016

Set Drag Listener on SpannableString

Leave a Comment

Im trying to set an OnDragListener to certain words of a TextView using SpannableString. Im able to add an OnClick Listener by using ClickableSpan

by doing

hashText.setSpan(new ClickableSpan() { 

So I figured I would try the same but replace ClickableSpan with OnDragListener.

I'm able to read the different drag events, but I have not been able to isolate the drag events to the specific words I choose, as Im able to do with 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())); 

1 Answers

Answers 1

I'm not a big expert in this field, never had to dig it out. But since you have no replies I try to give you some hint / direction.

I think what you need is a custom MovementMethod.

The android platform MovementMethod are managed here inside this package: https://github.com/android/platform_frameworks_base/tree/master/core/java/android/text/method

Specifically this interface: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/MovementMethod.java

As you see it has a onTouchEvent() method.

ClickableSpan has an onClick method, but it only works because there's a LinkMovementMethod handling the touch events, looking for ClickableSpan and issuing the onClick() on them.

See: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/LinkMovementMethod.java

which extend: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/ScrollingMovementMethod.java

which extend https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/BaseMovementMethod.java

but this last is not really related with touches.

ScrollingMovementMethod use the class Touch to delegate the touch event handling, you can see this class here: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/method/Touch.java

Looking at the code very quickly I think you can extend the LinkMovementMethod and add the drag detection there. Then create a new Span type for the Drag and call the dragging methods inside it.

I know I did not gave you a solution but I hope I pointed you in the right direction.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment