2012-12-07 108 views
1

我试图在锁定屏幕上显示DialogFragment。 当用户通过新的keyguard小部件功能触发操作时,必须发生这种情况。在锁定屏幕上显示Dialogfragment

特别是它显示了一个timepicker对话框,但用户只有在他解锁屏幕时才会看到它。即使屏幕锁定,我如何设法显示它?

我已经尝试过这种标志的所有组合,但没有成功:

AlertDialog dialog = dBuilder.create(); 
    Window window = dialog.getWindow(); 

    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
      + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
      + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
      + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

这就是所谓的onCreateView。

感谢您的支持!

+0

对不起,没有足够的时间来尝试它。当我这样做时,我会接受你的答案。非常感谢您给我一个提示! – user1806772

回答

1

对话框窗口不显示在锁定屏幕上,因为它们是浮动窗口,我不能给你一个真正的原因,为什么Android不显示它们,但它可能与绘制底层锁定屏幕有关组件,因为这些都是“安全组件”的所有意图和目的。

之前处理过您的问题,我最终做的是做一个单独的活动,使用Activity.getWindow().setFlags()将上面的窗口标志设置为活动窗口,然后显示我的DialogFragment。这不是很好,但它似乎最接近可靠设置正确。幸运的是,用户界面明智的你可以设置活动的主题为Theme.Wallpaper.NoTitleBar,这看起来不错。

0
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
         | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
     PowerManager powerMgr = (PowerManager) getSystemService(POWER_SERVICE); 
     wakeLock = powerMgr.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP 
       | PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, 
       "noti"); 
     KeyguardManager keyMgr = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
     keyLock = keyMgr.newKeyguardLock("noti"); 
keyLock.disableKeyguard(); 

wakeLock.acquire(); 

抱歉不好的代码格式。

0

此代码工作,如果你是你的对话框片段。

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog dialog = super.onCreateDialog(savedInstanceState); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.requestWindowFeature(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 
    Window window = dialog.getWindow(); 

    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
      + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
      + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
      + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
    return dialog; 
}