Переключить полноэкранный режим
Мне нужна помощь в полноэкранном режиме. У меня есть настройка на экране предпочтений, чтобы перейти в полноэкранный режим. В моей основной деятельности onResume у меня есть:
if(mFullscreen == true) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
} else
{
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
Но это не работает, потому что его нужно вызвать до setContentView
правильно?
... Но кроме того, у меня есть requestWindowFeature(Window.FEATURE_NO_TITLE);
до setContentView
, и он отображает заголовок и строку состояния... Может ли кто-нибудь помочь?
--- Edit ---
Хорошо, у меня была ошибка, из-за которой это не срабатывало. Так оно и есть. Теперь мне просто нужно знать, как переключить строку заголовка.
Ответы
Ответ 1
private void setFullscreen(boolean fullscreen)
{
WindowManager.LayoutParams attrs = getWindow().getAttributes();
if (fullscreen)
{
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
}
else
{
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
}
getWindow().setAttributes(attrs);
}
Ответ 2
/**
* toggles fullscreen mode
* <br/>
* REQUIRE: android:configChanges="orientation|screenSize"
* <pre>
* sample:
* private boolean fullscreen;
* ................
* Activity activity = (Activity)context;
* toggleFullscreen(activity, !fullscreen);
* fullscreen = !fullscreen;
* </pre>
*/
private void toggleFullscreen(Activity activity, boolean fullscreen) {
if (Build.VERSION.SDK_INT >= 11) {
// The UI options currently enabled are represented by a bitfield.
// getSystemUiVisibility() gives us that bitfield.
int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();
int newUiOptions = uiOptions;
boolean isImmersiveModeEnabled =
((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
if (isImmersiveModeEnabled) {
Log.i(context.getPackageName(), "Turning immersive mode mode off. ");
} else {
Log.i(context.getPackageName(), "Turning immersive mode mode on.");
}
// Navigation bar hiding: Backwards compatible to ICS.
if (Build.VERSION.SDK_INT >= 14) {
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
// Status bar hiding: Backwards compatible to Jellybean
if (Build.VERSION.SDK_INT >= 16) {
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
}
// Immersive mode: Backward compatible to KitKat.
// Note that this flag doesn't do anything by itself, it only augments the behavior
// of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample
// all three flags are being toggled together.
// Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
// Sticky immersive mode differs in that it makes the navigation and status bars
// semi-transparent, and the UI flag does not get cleared when the user interacts with
// the screen.
if (Build.VERSION.SDK_INT >= 18) {
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}
activity.getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
} else {
// for android pre 11
WindowManager.LayoutParams attrs = activity.getWindow().getAttributes();
if (fullscreen) {
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
} else {
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
}
activity.getWindow().setAttributes(attrs);
}
try {
// hide actionbar
if (activity instanceof ActionBarActivity) {
if (fullscreen) ((ActionBarActivity) activity).getSupportActionBar().hide();
else ((ActionBarActivity) activity).getSupportActionBar().show();
} else if (Build.VERSION.SDK_INT >= 11) {
if (fullscreen) activity.getActionBar().hide();
else activity.getActionBar().show();
}
} catch (Exception e) {
e.printStackTrace();
}
// set landscape
// if(fullscreen) activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
// else activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
мой код отлично работает с Android 2.3 и 4.4.2
Ответ 3
Так как Jellybean (4.1) есть новый метод, который не полагается на WindowManager. Вместо этого используйте setSystemUiVisibility в окне Window, это дает вам более подробный контроль над системными барами, чем использование флажков WindowManager. Вот как вы включаете полноэкранный режим:
if (Build.VERSION.SDK_INT < 16) { //ye olde method
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else { // Jellybean and up, new hotness
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.hide();
}
И вот как вы вернете приведенный выше код:
if (Build.VERSION.SDK_INT < 16) { //ye olde method
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else { // Jellybean and up, new hotness
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
decorView.setSystemUiVisibility(uiOptions);
// Remember that you should never show the action bar if the
// status bar is hidden, so hide that too if necessary.
ActionBar actionBar = getActionBar();
actionBar.show();
}
Ответ 4
В моем решении сочетаются ответы от:
Я добавил эти методы в свою активность. Чтобы переключить полноэкранный режим, используйте setFullScreen(!isFullScreen())
.
public boolean isFullScreen() {
return (getWindow().getAttributes().flags &
WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
}
@SuppressLint("NewApi")
public void setFullScreen(boolean full) {
if (full == isFullScreen()) {
return;
}
Window window = getWindow();
if (full) {
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
if (Build.VERSION.SDK_INT >= 11) {
if (full) {
getActionBar().hide();
} else {
getActionBar().show();
}
}
}
В моем случае я хотел, чтобы кнопка меню выполняла переключение. Проблема: на устройстве без кнопки меню оборудования скрытие панели действий также скрывает переключатель для возврата из полноэкранного режима. Таким образом, я добавил дополнительную логику, поэтому он скрывает панель действий, если устройство имеет кнопку меню аппаратного обеспечения. Обратите внимание, что устройства, работающие с SDK 11-13, не имели.
if (Build.VERSION.SDK_INT >= 14
&& ViewConfiguration.get(this).hasPermanentMenuKey()))) {
if (full) {
getActionBar().hide();
} else {
getActionBar().show();
}
}
Старые устройства (бегущие пряники или ранее) имеют панель заголовка вместо панели действий. Следующий код скроет его, но имейте в виду, что панель заголовка не может быть показана/скрыта после начала действия. Я включил в мое справочное руководство сообщение о том, что изменения в полноэкранном режиме могут не в полной мере влиять на старые устройства до тех пор, пока они не перезапустят приложение/действие (что, конечно же, предполагает, что вы сохраняете свой выбор и выполняете этот код, только если они этого хотят полный экран).
// call before setContentView()
if (Build.VERSION.SDK_INT < 11) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
Ответ 5
Существует более короткая реализация метода полного экрана:
private void toggleFullscreen() {
WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags ^= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
}
Он использует побитую логику XOR для переключения FLAG_FULLSCREEN
.