Don't close this question since this is very old but i cant find the solution.
I'm new to android. I want to disable the soft keys at the bottom and the status permanently once the user opens my app.
It should not appear even on user interaction.
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
}
This code just hides the navigation bar. But when i swipe from the bottom it appears. This should not happen. Please help.
To come out of my app i will provide a way.
Thanks
Don't close this question since this is very old but i cant find the solution. I'm new to android. I want to disable the soft keys at the bottom and the status permanently once the user opens my app.
It should not appear even on user interaction.
I am pretty sure you cannot disable the navigation bar permanently. Otherwise the user will be stuck with your app forever with no way of getting out of it.
Related
So I am working on an app which has full screen. The code does work excellently. But when I do switch to any other app and come back to it, the navigation bar and status bar both won't hide. This also happens when I take a screenshot.
Here is a preview:
Coming back, here is what I have coded:
private fun funcFullScreen() {
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
}
And I just simply call the function like this funcFullScreen().
What I have tried?
1] androidFocusableInTouchMode="true"
2] I also tried adding onWindowFocusChange thing but that gave me another headache, the navigation bar will appear for a second or two when I switch the activities in my app itself. And fixing that seems difficult, I've already tried every possible solution for that available on the internet.
Any way to solve this? By the I'm fine with either Java or Kotlin, my app is made up from both (some activities in Java while others in Kotlin) and both suffer from this issue.
3] Also tried adding the code in onResume, this works when I switch back from another app but not when I take a screenshot.
So basically I think you are writing this all code in onCreate() method of that activity, When you go to another app, it's activity screen by default show status bar and navigation bar, and you again come back then you don't get a callback in onCreate(), instead, get it in onResume(), So you need to move your code in OnResume() from onCreate() so that it gets called when you come back again to this screen.
I am trying to get my Xamarin.Forms application to use Android's immersive mode, since I am using a device with small screen, so soft keys and navigation bar is stealing my precious screen real estate.
Since the device I am using features hardware keyboard, I wanted to hide the soft keyboard. Currently I solved this by installing a "Null Input Method" keyboard. The keyboard is still there however, so every time focus is requested on Entry element, the keyboard is "shown". This causes application to exit immersive mode. The same is true when I show an Alert from my forms application.
Ideally I would want my application to stay in immersive mode all the time, at least when focus on Entry is requested (soft keyboard is not "shown" at all or immersive mode is not disabled when keyboard is "shown"). For Alerts I would like the application to reenter immersive mode when Alert is hidden. Currently I solved this by extending the Page class with custom DisplayAlert methos, which toggles immersive mode after DisplayAlert Task is completed.
I did some research and found the following articles:
Immersive mode while using keyboard
Appereantly user managed to solve the issue, so there could be a solution?
https://forums.xamarin.com/discussion/33034/prevent-entry-soft-keyboard-from-showing-on-android
But this solution does not work on Entry elements, and I would like to avoid writing custom renderers for elements.
Is there someone that faced a similiar issue before and managed to solve it?
It's not the best solution but defiantly the most simple for me.
Try this:
final Handler forceImmersive = new Handler();
Runnable runnable = new Runnable() {
#Override
public void run() {
// Enables regular immersive mode.
// For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
// Set the content to appear under the system bars so that the
// content doesn't resize when the system bars hide and show.
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// Hide the nav bar and status bar
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN);
forceImmersive.postDelayed(this, 1000);
}
};
forceImmersive.postDelayed(runnable, 1000);
I am creating a lock screen application right now. I have been searching and trying some tricks to do it but still can't find the best approach. My previous approach that I used is to use TYPE_SYSTEM_ERROR. it worked well. it prevents navigation and status bar to get any touches. it also run any other app behind my app, including the power off options dialog.
unfortunately I think this is bad because when the app got freeze or not responding, user can't do anything but force restart his/her phone.
I have been looking and analyze some existing lock screen apps in play store. They use different ways to lock the phone but I found one app that I think I can follow. It makes the nav and status bar overlay the app. nav and status bar still can be clicked but it's all opened behind the lock screen. and when I tried to open the power off dialogs, the NavigationBar still overlay the lock screen.
I changed my app to follow that approach. I am able to make the bars overlay my lock screen but I am still not able to:
1. make other app run behind my lock screen (lock screen always on top)
2. the NavigationBar stays overlay when power off dialog appear and when user move to home as well. in my case, the NavigationBar pushed up the screen and my screen looks ugly (some components move to wrong place) and after the Dialog dismissed, it doesn't move back to original position. it's fixed but I noticed a similar problem when I touch the home button and still searching to fix this.
Here's a snippet of my codes (updated):
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
} else {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
mOverlay = (RelativeLayout) inflater
.inflate(R.layout.main, (ViewGroup) null);
mOverlay.setFitsSystemWindows(false);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
mWindowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);
And here a screenshot of app in PlayStore that I want to follow:
I have a fullscreen activity in which I have some editing area. For Android 4.3 and before, I set fullscreen mode with
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
In the editing view, I use the method described here to get notified when the soft keyboard visibility changes and also to get its height. Everything works fine.
From 4.4, in order to profit immersive mode, the normal mode is set (when status bar is visible) with:
activity.getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
But apparently, the method mentioned above to get soft keyboard height is no longer working with getWindowVisibleFrame() returns always the same rectangle whether the keyboard is visible or not.
Here my question: is there any other way to get soft keyboard state and its height on 4.4 that works with SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN?
Thanks in advance.
I'm trying to replace the stock lock screen with my own app.
In my code, i want to disable the Home button.
I know how to do this in Android 2.3 and below,
but the same code doesn't work with Android 4.0+ (return to desktop when Home button pressed)
Recently I found out an app called MiHome which has its own lock screen and is able to disable the Home button.
Does anyone know how it achieves this???
There is no way to intercept the home button on Android, unless you make your app the home screen. This is for security reasons, so that malicious apps cannot take over your device by overriding all the buttons that can exit. The home button is the one sure shot way to be able to leave any app.
If you want to handle the HOME button, implement a home screen.
Mucking with the home button is disabled for security/reliability reasons in ICS. (Most apps use it for evil than good)
Please refer to the following questions for workarounds.
how can I disable android 4.0 home button
override Home key in android ICS
Disable Home Button in Android ICS (4.0)
Seems like the only way is to implement a home screen
Try this
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
} else {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
mOverlay = (RelativeLayout) inflater
.inflate(R.layout.main, (ViewGroup) null);
mOverlay.setFitsSystemWindows(false);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
mWindowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);