В вашем методе onTouch()
вы можете проверить, что источник события касается вашего TextView2 TextView. В этом случае проигнорируйте событие и позвольте методу onClick () вашего textview2 обработать его:
linear1.setOnTouchListener(new View.OnTouchListener() {
float initX;
float initY;
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v == textview2) {
return;
}
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
initX = event.getX();
initY = event.getY();
break;
case MotionEvent.ACTION_UP:
initX -= event.getX();
initY -= event.getY();
if (initY > len) {
//Logic For Swipe Right
} else if(initY < -len) {
//Logic For Swipe Left
}
break;
}
return true;
}
});
Вы можете сделать то, что, по-видимому, делает Process.MainWindowHandle
: использовать P / Invoke для вызова функции EnumWindows
, которая вызывает метод обратного вызова для каждого окно верхнего уровня в системе.
В обратном вызове вызовите GetWindowThreadProcessId
и сравните идентификатор процесса окна с Process.Id
; если идентификаторы процессов совпадают, добавить дескриптор окна в список.
First, you'll have to get the windowhandle of the application's mainwindow.
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
IntPtr hWnd = (IntPtr)FindWindow(windowName, null);
Then, you can use this handle to get all childwindows:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
private List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
}