ฉันจะรักษาโหมดใหญ่พิเศษใหม่ได้อย่างไรเมื่อกิจกรรมของฉันแสดงกล่องโต้ตอบที่กำหนดเอง
ฉันกำลังใช้รหัสด้านล่างเพื่อรักษาโหมดใหญ่พิเศษในกล่องโต้ตอบ แต่ด้วยวิธีแก้ปัญหาดังกล่าว NavBar จะปรากฏขึ้นเป็นเวลาน้อยกว่าหนึ่งวินาทีเมื่อฉันเริ่มกล่องโต้ตอบที่กำหนดเองจากนั้นก็จะหายไป
วิดีโอต่อไปนี้อธิบายปัญหาได้ดีขึ้น (ดูที่ด้านล่างของหน้าจอเมื่อ NavBar ปรากฏขึ้น): http://youtu.be/epnd5ghey8g
ฉันจะหลีกเลี่ยงพฤติกรรมนี้ได้อย่างไร?
รหัส
พ่อของกิจกรรมทั้งหมดในใบสมัครของฉัน:
public abstract class ImmersiveActivity extends Activity {
@SuppressLint("NewApi")
private void disableImmersiveMode() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_FULLSCREEN
);
}
}
@SuppressLint("NewApi")
private void enableImmersiveMode() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
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_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
);
}
}
/**
* Set the Immersive mode or not according to its state in the settings:
* enabled or not.
*/
protected void updateSystemUiVisibility() {
// Retrieve if the Immersive mode is enabled or not.
boolean enabled = getSharedPreferences(Util.PREF_NAME, 0).getBoolean(
"immersive_mode_enabled", true);
if (enabled) enableImmersiveMode();
else disableImmersiveMode();
}
@Override
public void onResume() {
super.onResume();
updateSystemUiVisibility();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
updateSystemUiVisibility();
}
}
กล่องโต้ตอบที่กำหนดเองทั้งหมดของฉันเรียกวิธีนี้ว่าonCreate(. . .)
เมธอด:
/**
* Copy the visibility of the Activity that has started the dialog {@link mActivity}. If the
* activity is in Immersive mode the dialog will be in Immersive mode too and vice versa.
*/
@SuppressLint("NewApi")
private void copySystemUiVisibility() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
getWindow().getDecorView().setSystemUiVisibility(
mActivity.getWindow().getDecorView().getSystemUiVisibility()
);
}
}
แก้ไข - การแก้ปัญหา (ขอบคุณ Beaver6813 ดูคำตอบของเขาสำหรับรายละเอียดเพิ่มเติม):
กล่องโต้ตอบที่กำหนดเองทั้งหมดของฉันจะแทนที่วิธีการแสดงด้วยวิธีนี้:
/**
* An hack used to show the dialogs in Immersive Mode (that is with the NavBar hidden). To
* obtain this, the method makes the dialog not focusable before showing it, change the UI
* visibility of the window like the owner activity of the dialog and then (after showing it)
* makes the dialog focusable again.
*/
@Override
public void show() {
// Set the dialog to not focusable.
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
copySystemUiVisibility();
// Show the dialog with NavBar hidden.
super.show();
// Set the dialog to focusable again.
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}