11

アプリ内でアプリケーションオブジェクトをドラッグアンドドロップするために使用する予定のカスタムmimeタイプがあります。これは機能しているようですが、EditTextフィールドもドロップアクションを受け入れていることがわかりました。私はこれが起こらないようにしたい。

まず、次のようにcustomemimeタイプを定義しました。

public static final String MIME_TYPE_MYNODE = "com.example.mockup/mynode";

次に、ソースオブジェクトのonTouchハンドラーに次のものがあります。

  @Override
  //-----------------------------------------------------------------------------
  public boolean onTouch (View v, MotionEvent e)
  {
    ...
    else if (e.getAction() == MotionEvent.ACTION_MOVE)
    {
      String[] mimeTypes = {MIME_TYPE_MYNODE};
      ClipData data = new ClipData ("Task Tamer Note", mimeTypes, new ClipData.Item ("unused"));
      View.DragShadowBuilder shadow = new View.DragShadowBuilder(this);
      Object localState = v;
      startDrag (data, shadow, localState, 0);
      return false;
    }
  }
  ...
}

EditTextウィジェットに「ドロップ」すると、テキスト領域に「未使用」が挿入されます。どうすればこれを防ぐことができますか?ありがとう。

4

4 に答える 4

9

私は同じ行動に遭遇しました。TextView クラスにある理由を見つけました。

メソッド onDragEvent(DragEvent event) はここでオーバーライドされ、以下のようになります。

@Override
public boolean onDragEvent(DragEvent event) {
    switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
            return mEditor != null && mEditor.hasInsertionController();

        case DragEvent.ACTION_DRAG_ENTERED:
            TextView.this.requestFocus();
            return true;

        case DragEvent.ACTION_DRAG_LOCATION:
            final int offset = getOffsetForPosition(event.getX(), event.getY());
            Selection.setSelection((Spannable)mText, offset);
            return true;

        case DragEvent.ACTION_DROP:
            if (mEditor != null) mEditor.onDrop(event);
            return true;

        case DragEvent.ACTION_DRAG_ENDED:
        case DragEvent.ACTION_DRAG_EXITED:
        default:
            return true;
    }
}

テキスト => EditText を挿入できる場合、ドラッグはそこで処理され、受け入れられます。View クラスは OnDragListener を使用していないため、この動作を回避することはできません。

editText.setOnDragListener(null);

ここでの解決策は、ここのように EditText をサブクラス化し、onDragEvent() メソッドをオーバーライドすることです。

 public class YourEditText extends EditText {

 ...
 // other stuff
 ...

 @Override
 public boolean onDragEvent(DragEvent event) {
    switch (event.getAction()) {
       case DragEvent.ACTION_DRAG_STARTED:
           if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
               return true;
           }
           return false;
       default:
           return super.onDragEvent(event);
    }
}

}

YourEditText は MIMETYPE_TEXT_PLAIN のドラッグのみを受け入れるようになりました。ドラッグ ドロップをまったく無効にしたい場合は、このメソッドで false を返すだけです`

@Override
public boolean onDragEvent(DragEvent event) {
    return false;    
}

以上です。それが役立つことを願っています。

于 2014-03-13T14:36:33.570 に答える
3

レイアウトにドロップ アクションを受け入れさせたくないという点で、同様の問題が発生しました。

setOnDragListener を介してドラッグ リスナーを編集フィールドにアタッチします。

edtText.setOnDragListener(new MyDragListener());

onDrag イベントのターゲット ビューが編集テキストかどうかを確認します。

class MyDragListener implements OnDragListener {

    @Override
    public boolean onDrag(View v, DragEvent event) {

      switch (event.getAction()) {
         case DragEvent.ACTION_DROP:
             //check whether it has been dropped onto your edit text
              if(v!=edtText)
                  //your code here
    }
于 2012-09-04T09:23:48.007 に答える
1

ドラッグ イベントが正常に処理された場合は true を返し、ドラッグ イベントが処理されなかった場合は false を返します。false は、View がその onDragEvent() ハンドラーを呼び出すようにトリガーすることに注意してください。

これは onDrag(View v, DragEvent event) のドキュメントからのステートメントです。したがって、false を返すと、イベントは EditText の onDragEvent() によって処理されます。したがって、最も簡単な解決策は次のとおりです。

editText.setOnDragListener(new OnDragListener() {

        @Override
        public boolean onDrag(View v, DragEvent event) {
            return true;
        }
    });

いくつかの機能を実行したい場合は、Drag イベントに基づいて指定すると実行されます。

于 2014-09-27T15:11:41.717 に答える