Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Evitar la caída de arrastre del tipo mime personalizado a EditText

Tengo un tipo de mime personalizado que tengo la intención de utilizar para arrastrar y soltar objetos de aplicación dentro de la aplicación. Esto parece estar funcionando pero estoy encontrando que los campos de EditText también están aceptando la acción de la gota. No quiero que esto suceda.

Primero, he definido el tipo del mime del custome como esto:

  • El dispositivo Android no aparece en la lista de anuncios
  • Cambiar la barra de acción en color
  • Ciclo de vida del fragmento con respecto a su actividad
  • Zoom en phonegap para android
  • Cómo llamar a getFragmentManager en Recycler.Adapter?
  • Compruebe si la actividad se está ejecutando desde el servicio
  • public static final String MIME_TYPE_MYNODE = "com.example.mockup/mynode"; 

    Luego, en el controlador onTouch para el objeto de origen tengo:

      @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; } } ... } 

    Cuando "me caigo" en un widget EditText, inserta "unused" en el área de texto. ¿Cómo puedo evitar esto? Gracias.

  • Efecto de ondulación sobre un elemento de RecyclerView que contiene ImageView
  • Botón de acción flotante que no se muestra completamente dentro de un fragmento
  • Añadir degradado a la vista de imagen
  • ¿Cómo inicio un servicio en un nuevo hilo?
  • Credenciales de Webservice - OpenID / Android AccountManager?
  • Deslizamiento entre fragmentos
  • 4 Solutions collect form web for “Evitar la caída de arrastre del tipo mime personalizado a EditText”

    Me encontré con el mismo comportamiento. He encontrado la razón, que se encuentra en la clase TextView.

    El método onDragEvent (evento DragEvent) es overrriden aquí y se ve como a continuación.

     @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; } } 

    Si es posible insertar texto => EditarTexto, cualquier arrastre será procesado y aceptado allí. La clase View no utiliza OnDragListener, por lo que no es posible evitar este comportamiento por

     editText.setOnDragListener(null); 

    La solución aquí es subclase el EditText como aquí y el método override 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); } } 

    }

    Ahora YourEditText aceptará sólo drags con MIMETYPE_TEXT_PLAIN. Si quieres deshabilitar el arrastrar gota en todo simplemente devolver false en este método `

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

    Y eso es. Espero que ayude.

    Me encontré con un problema similar en que no quería un diseño para aceptar la acción de la gota.

    Adjuntar un oyente de arrastrar a su campo de edición a través de setOnDragListener.

     edtText.setOnDragListener(new MyDragListener()); 

    Compruebe si la vista de destino en el evento onDrag es el texto de edición.

     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 } 

    Puedes escribir

     edit.setEnabled(false); edit.setFocusable(false); 

    Justo después de llamar a startDrag() , y restaurar valores antiguos para ese control particular de editText justo después de DragEvent.ACTION_DRAG_ENDED .

    Pero, honestamente, este enfoque es muy sucio.

    Devuelve true si el evento de arrastre se manejó correctamente o false si el evento de arrastrar no se trató. Tenga en cuenta que false activará la vista para llamar a su controlador onDragEvent ().

    Esta es una declaración de los documentos de onDrag (Ver v, evento DragEvent). Así que si devuelves false entonces el evento es manejado por onDragEvent () de EditText. Por lo tanto las soluciones más simples son:

     editText.setOnDragListener(new OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { return true; } }); 

    En caso de que desee realizar algunas funciones, especifique basándose en el evento Drag y se ejecutarán.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.