在SpannableString上设置Drag Listener

时间:2016-03-07 23:02:47

标签: javascript android drag-and-drop spannablestring

我正在尝试使用OnDragListenerTextView设置为SpannableString的某些字词。我可以使用OnClick

添加ClickableSpan监听器

hashText.setSpan(new ClickableSpan() {

所以我想我会尝试相同但用ClickableSpan替换OnDragListener

我能够阅读不同的拖动事件,但我无法将拖动事件与我选择的特定单词隔离开来,因为我可以使用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 个答案:

答案 0 :(得分: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类型,并调用其中的拖动方法。

我知道我没有给你一个解决方案,但我希望我指出你正确的方向。