Part of my Android app uses speech-to-text, and I want to disable touch events while it does that because otherwise the user can accidentally touch their phone and stop the conversation.
I'm trying to use a ViewGroup that can be the parent for that Activity and absorb the touch events, but am having trouble with it.
I have an Activity, and from there I pull up a DialogFragment where the user can enter information using speech-to-text.
When I tried using an overlay to absorb the touch events from the dialog, it only covered the DialogFragment and not the whole screen. And when I added it to the Activity, I couldn't access it from the DialogFragment.
In any case, it never stopped the touch events anyways because my main problem is when the speech-to-text dialog is up and that would come up on top of the overlay and I don't know how to get the handle for that.
Anyone here done anything like this before? Thanks.
Related
I have a activity themed like a dialog and I have it setup so that it finishes when the user click outside.
this.setFinishOnTouchOutside(true);
As expected when the user clicks outside, it finishes. The activity is marked as floating activity and is only shown on top of the phone.
Now, if the user click on any other part of screen like the phone button/contact button on home screen, then the activity gets finished, but the user has to click on phone/contact app icon again to open phone/conatct app.
What I want is that if user click outside my activity, then the action must be performed as if the activity is not at all present on screen. Something like notification, which does not prevent user from doing other other tasks.
The only way you might be able to do this is by using a hidden WindowManager.LayoutParams flag, FLAG_SLIPPERY.
This allows touches starting on your View to continue to whatever View is below when the touch leaves your View but remains on the screen. However, I don't think this will work.
Android prevents you from touching "through" a touchable Window because it assumes that Window should be receiving the TouchEvent. Android also prevents you from programmatically "touching" the screen (without root or system access), most likely for security reasons.
I dug through AOSP for a while and found this.
Reading the comments, it's possible to infer that, while what you see doesn't take up the whole screen, the Activity's Window does. So, while nothing in your Activity is clicked, the Window is still overlaying everything, just with a transparent background, and is dealing with the touches that aren't passed to your Activity's UI. This brings us back to the "touching through" issue.
There are some application that disables all the touch inputs, including the touch events that occur on the navigation bar.
Examples are Touch Lock or UnTouch. How one can do that?
By analyzing the second linked app seems that there is a hidden layout that capture the touch events (like an empty onClickListener).
Initially I tried to draw a transparent foreground using the SYSTEM_ALERT_WINDOW permission and by assigning an empty touch listener. However in this way I cannot draw on the navigation bar, so the user can touch the home button and the back button.
Another way that I tried is to launch an Activity with transparent background and in fullscreen mode. In this way I can capture all the events. This works, but obviously this causes other activities to go in pause state.
So my question is, how can one reach the goal? Alternatively is possible to use some root/system commands?
Thanks!
Try this link. If you want to do it on just 1 view then edit out the iteration in the methods given.
I need to know when the user is using the screen over my activity, even when he is not strictly on my activity (for instance when he drawed the notification drawer, or when he is on Messenger). That is because i want my app to do something after a certain time of absence of action by the user, and such cases mess with the timer, as the activity is not paused.
I tried with dispatchTouchEvent() and onTouchEvent() but they only handle event made on my activity.
So is there a way to detect touch event made on layout that has been drawn by other app over my activity?
You can cretae transparent overlay window by system alert. It always on top.
Then you can handle touch event and stretching further.
Creating a system overlay window (always on top)
in my application I would like to receive touchEvent(MotionEvent) event while the user is typing using his soft keyboard on a TextView. I have already tried using dispatchTouchEvent(MotionEvent) on the main activity, but during the typing this event is not fired. Is there a way to handle it?
EDIT:
The main idea is to have from the soft key two different events, one for the letter submitted (for example as with keyUp and keyDown) and one relative to the touch like dispatchTouchEvent, since when you press for a letter you touch the screen, meaning that you should arise a dispatchTouchEvent or something similar.
It's not possible to get touch events from the soft keyboard as Android keyboards are basically separate Android apps that already consume their touch events. However you can react on their key presses using the onKeyDown and onKeyUp events. See also http://developer.android.com/training/keyboard-input/commands.html
Using Sencha Touch 2.0.1.1 and Cordova 2.0.0, I'm having trouble with the focus of elements.
In multiple situations, elements in the background gain focus after an element in the foreground disappears by a tap.
After an Ext.Msg.alert()'s OK button is clicked, the focus immediatly shifts to an underlying textfield behind the mask in the background
When clicking the slideButton on WNielson's facebook menu, the focus immediatly shifts to the searchfield that's 'below' the slideButton (https://github.com/wnielson/sencha-SlideNavigation)
When clicking a list item on WNielson's facebook menu, I get instantly get redirected to a link that's 'below' the menu.
This occurs on Android and iOS only, but not in Chrome on pc or iOS. I've tried disabling the background element/view until the foreground element is gone, but this doesn't seem to work.
Does anyone have a solution to this problem? Is this a bug in sencha touch?
Edit: I've uploaded an example on http://www.senchafiddle.com/full/!NxY8s/, view it with an android device, and see what I mean.
I've seen this behavior once, the problem was there were elements that were listening to click events instead of just tap events as generated by sencha.