Disparar Evento táctil desde la vista DialogFragment a la vista de actividad principal

Así es como se ve mi diseño:

Introduzca aquí la descripción de la imagen

Tengo una actividad principal que tiene una vista personalizada (view1 que maneja los eventos onTouch por sí mismo) y 2 botones (view2 y view3). El DialogFragment tiene una disposición visible mostrada y el resto es transparente. Mis fragmentos de diálogo tienen este aspecto:

public class FragmentText extends DialogFragment{ public static FragmentText newInstance() { FragmentText frag = new FragmentText(); frag.setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar); return frag; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); // instantiate the custom layout final View layout = inflater.inflate(R.layout.fragment_layout, null); ..... } } 

Y el archivo de diseño se ve así:

 <com.TransparentView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/layMain" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginBottom="70dp" android:background="@color/transparent" android:gravity="bottom" android:orientation="vertical" android:paddingBottom="70dp" > <LinearLayout android:id="@+id/layContent" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_margin="5dp" android:background="@drawable/bk_text_edit" android:orientation="vertical" android:padding="@dimen/margin" > all my layouts and buttons </LinearLayout> </com.TransparentView> 

y

 public class TransparentView extends LinearLayout { @SuppressLint("NewApi") public TransparentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TransparentView(Context context, AttributeSet attrs) { super(context, attrs); } public TransparentView(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return false; // event get propagated } } 

Cuando el usuario presiona fuera del diseño visible del DialogFragment quiero: 1. descartar el fragmento de diálogo 2. pasar el onTouch a la actividad principal y permitir al usuario interactuar con las vistas.

Así que básicamente si arrastre mi dedo sobre View1, quiero descartar el diálogo y continuar mi interacción de arrastrar contra view1.

¿Es posible lograr esto?

LE: también esto no funciona:

 layMain.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { getActivity().dispatchTouchEvent(event); return false; } }); 

Al final, como Luksprog sugirió, terminé con la zanja DialogFragment. Hice una prueba usando el fragmento simple que se aloja en FrameLayout de una actividad así que parece apenas una capa en donde lo necesito. De esta manera todavía obtengo toda la interacción que necesito con el resto de las vistas.

Gracias por todo tu apoyo.

En su lugar, utilizaría un diálogo de alerta para obtener el efecto deseado:

 AlertDialog.Builder Dialog = new AlertDialog.Builder(this); Dialog.setMessage("Text you wish to enter in the dialog")); //Use this if you would like to include a button at the bottom of the alert dialog. Otherwise just leave it blank. Dialog.setNeutralButton("Back to App", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); Dialog.show(); 

Espero que esto ayude 🙂

Puedes reemplazar boolean onInterceptTouchEvent(MotionEvent ev) en la vista transparente de tu diálogo, capturar evento, enviarlo donde lo necesites, descartar el diálogo y devolver false (lo que significa que no se consumió el evento touch).

O bien, si no desea reemplazar la clase View, puede reemplazar boolean dispatchTouchEvent (MotionEvent ev) en su diálogo e intentar averiguar dónde se produjo el clic analizando el objeto MotionEvent .

Si ya está captando correctamente el evento táctil en su LinearLayout , que entiendo que es la vista transparente que rodea el cuadro de Dialog entonces debería ser capaz de lograr esto con una interfaz de nuevo a la Activity principal y una llamada a un método público en su diálogo clase. Haría las siguientes modificaciones:

Primero: defina una interfaz dentro de su TransparentView y añada un método público para establecer una devolución de llamada a su actividad principal.

 public class TransparentView extends LinearLayout { public interface TouchCallback{ public void onMotionEvent(MotionEvent e); } private TouchCallback mCallback; @SuppressLint("NewApi") public TransparentView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TransparentView(Context context, AttributeSet attrs) { super(context, attrs); } public TransparentView(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { callback.onMotionEvent(ev); return false; // event get propagated } public setCallback(TouchCallback callback){ mCallback = callback; } } 

La idea es capturar el evento de movimiento y pasarlo manualmente de vuelta a su actividad de alojamiento. Una vez que pase el evento de movimiento de vuelta a la actividad todo lo que necesita hacer es descartar el diálogo. DialogFragment ya tiene un método de descarte incorporado, siempre y cuando mantenga una referencia al diálogo con una variable de instancia debería ser capaz de hacer lo siguiente

 @Override public void onMotionEvent(MotionEvent e){ mDialog.dismiss(); } 

Si eso no funciona, simplemente agregue un método en su clase de diálogo y llámelo. Por lo que puedo decir de su ejemplo realmente no necesitamos hacer nada con el evento de movimiento capturado por la vista transparente porque todo lo que queremos hacer es cerrar el diálogo cuando se produce un toque. Dado que la devolución de llamada sólo debe activarse cuando se produce un toque, no hay nada que comprobar (aunque podría expandirlo más tarde para implementar un Handler y cerrar el diálogo si el toque duró una cantidad de tiempo específica).

  • PopupWindow TouchInterceptor no funciona
  • GC y onTouch causan un error de señal fatal 11 (SIGSEGV) en la aplicación que utiliza ffmpeg a través de ndk
  • android arrastrar y soltar ImageView onTouchListener
  • Tiempo de aumento de OnLongPress
  • Método único para implementar onTouchListener () para varios botones
  • Usando OnTouchListener y OnLongClickListener interfiere entre sí
  • Analog SetOnTouchListener o cómo se utiliza en xamarin, qué argumento debe ser
  • Limitación de Drag de ImageView en Android
  • Ocultar teclado en android mientras se toca fuera Editar área de texto
  • Android: ImageView getID (); Devolver entero
  • Manejo del evento de toque Intercept sin extender ViewGroup
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.