Установить прослушиватель перетаскивания на SpannableString

Я пытаюсь установить OnDragListener на определенные слова TextView используя SpannableString . Я могу добавить слушателя OnClick с помощью ClickableSpan

при выполнении

 hashText.setSpan(new ClickableSpan() { 

Поэтому я решил, что попробую, но заменим ClickableSpan на OnDragListener .

Я могу читать разные события перетаскивания, но мне не удалось выделить события перетаскивания для конкретных слов, которые я выбираю, поскольку Im способен делать с 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())); 

Я не большой специалист в этой области, и мне никогда не приходилось его выкапывать. Но поскольку у вас нет ответов, я пытаюсь дать вам несколько намеков / направлений.

Я думаю, что вам нужен пользовательский MovementMethod .

Платформа MovementMethod Android поддерживает управление внутри этого пакета: 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 на код, я думаю, что вы можете расширить LinkMovementMethod и добавить там обнаружение перетаскивания. Затем создайте новый тип Span для Drag и вызовите методы перетаскивания внутри него.

Я знаю, что не дал вам решения, но надеюсь, что указал вам в правильном направлении.

Intereting Posts
Каковы различия между FLAG_ACTIVITY_RESET_TASK_IF_NEEDED и FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP? Как измерить использование данных моего приложения в ответном нативном? Есть ли способ вызвать код python в Android-версии без установки sl4a? OpenCV + Eclipse + Android: ошибка org.opencv.video Video.java Как включить внешнюю сборку в Android Studio на постоянной основе? Обои не подходят для экрана устройства SensorEvent.timestamp – абсолютная метка времени (utc)? Как установить значение MultiSelectListPreference defaultValue в коде Как выбрать несколько флажков в подменю на Android? MyLocationOverlay или LocationManager для обновления текущего местоположения Открыть файл при нажатии уведомления? Фрагмент Tabhost Ошибка: java.lang.IllegalStateException: нет закладки, известной для тега null При недоступности подключения к Интернету Исключить Nexus 7 из поддерживаемых устройств Что оптимизировано? Android Studio – Gradle: Execution failed for task ': Foo: dexDebug' – но почему?