Отправка события Touch из окна «Диалоговое изображение» в представление родительской активности

Вот как выглядит мой макет:

Введите описание изображения здесь

У меня есть родительская активность, у которой есть пользовательский вид (view1, который обрабатывает события onTouch сам по себе) и 2 кнопки (view2 и view3). Диалоговое окно имеет видимый макет, а остальные прозрачны. Мои фрагменты диалогового окна выглядят следующим образом:

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

И файл макета выглядит следующим образом:

 <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> 

а также

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

Когда пользователь нажимает на внешний вид диалогового окна DialogFragment, я хочу: 1. отпустить фрагмент диалога 2. передать onTouch в родительскую активность и разрешить пользователю взаимодействовать с представлениями.

Поэтому в основном, если я перетаскиваю палец над View1, я хочу отклонить диалог и продолжить взаимодействие с view1.

Можно ли это достичь?

LE: также это не работает:

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

В конце концов, как предложил Luksprog, я закончил с канавкой DialogFragment. Я сделал тест, используя простой фрагмент, который размещен в FrameLayout для работы, поэтому он выглядит так же, как и оверлей, где мне это нужно. Таким образом, я все еще получаю все необходимое взаимодействие с остальными видами.

Спасибо всем за вашу поддержку.

Вместо этого я использовал бы диалоговое окно Alert, чтобы вы могли получить желаемый эффект:

 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(); 

Надеюсь это поможет 🙂

Вы можете переопределить boolean onInterceptTouchEvent(MotionEvent ev) в прозрачном представлении вашего диалога, событие catch, отправить его там, где вам нужно, отменить диалог и вернуть false (это означает, что событие касания не было потреблено).

Или, если вы не хотите переопределять класс View, вы можете переопределить boolean dispatchTouchEvent (MotionEvent ev) в своем диалоговом окне и попытаться выяснить, где произошел щелчок, проанализировав объект MotionEvent .

Если вы уже успешно захватили событие касания в LinearLayout , которое, как я понимаю, является прозрачным представлением, окружающим Dialog тогда вы сможете выполнить это с интерфейсом обратно к родительской Activity и вызовом общедоступного метода в вашем диалоговом окне класс. Я бы сделал следующие изменения:

Сначала – определите интерфейс в вашем TransparentView и добавьте общедоступный метод для установления обратного вызова вашей родительской активности.

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

Идея состоит в том, чтобы поймать событие движения и вручную передать его обратно на ваш хостинг. После того, как вы передадите событие движения в действие, все, что вам нужно сделать, это отклонить диалог. DialogFragment уже есть метод отклонения, построенный таким образом, пока вы держите ссылку на диалог с переменной экземпляра, вы должны иметь возможность сделать следующее

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

Если это не работает, просто добавьте метод в свой класс диалога и вызовите его. Из того, что я могу сказать из вашего примера, нам действительно не нужно ничего делать с событием движения, захваченным прозрачным представлением, потому что все, что мы хотим сделать, – это закрыть диалог при появлении касания. Поскольку обратный вызов должен активироваться только тогда, когда происходит прикосновение, нечего проверять (хотя вы могли бы расширить это позже, чтобы реализовать Handler и закрыть его только в том случае, если касание длилось определенное количество времени).