工作日志(2018-11)

     又是一年双十一… Jingle bell, Jingle bell, Jingle all the way! 但是真相是: Single dog, Single dog, Single all the day!

Wednesday 14th

     产品同学最近扔过来一个比较奇怪的需求: 进入我们的 app 应用时, 不显示导航栏(就是目前市面上主流手机最下面那一栏, 返回键, Home 键, 列表键那一栏).
     我的第一反应是他们想做一个沉浸式(Immersive mode)的效果, (Note: 这个说法并不是官方的说法, 不过大家都这么说, 用不了多久也就成官方的了吧). 但是仔细一想, 不太一样. 沉浸式效果, 接收到 touchEvent 事件时, 导航栏还是会显示出来的, 但我我们的产品同学要完全的隐藏导航栏. = -!
     因为我们的设备是定制设备, 针对商场收银用, 爱捯饬的工程师们在设置界面, 发现一个这个选项.



     既然系统设置有相关的选项, 那么肯定可以通过 Java 层的代码调用, 可能使用广播的方式, 或者通过 PendingIntent, 具体的肯定要跟 room 定制的厂商联系, 不过这个联系的过程就不说了…
     那就采用另外一种方式, 通过代码层级控制, 官方文档也给出了相应的方案, 但是都是针对 Activity 的, 但是在 DialogFragment 弹出时, 导航栏还是会显示出来. stackOverFlow 上有很多种方案, 但是尝试一圈都不怎么管用. 最后在 csdn 上找到一种比较合适解决方案:

     重写 DialogFragment 中的 setDialog() 方法. 给 Dialog 对应的 Window 设置 LayoutParams.FLAG_NOT_FOCUSABLE 参数.

1
2
3
4
5
6
7
8
9
10
public class HideNavigationBarFragment extends DialogFragment {
@Override
public void setupDialog(Dialog dialog, int style) {
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
dialogWindow.setAttributes(lp);
}
}

     单独设置或者通过继承, 设计模式的相关知识点就不展开了.
     然后 DialogFragment 的 style 设置 (还包括隐藏软键盘, 去掉默认背景色的设置):

1
2
3
4
5
6
7
8
9
10
<style name="wx_self_pay_dialog_style">
<item name="android:windowFullscreen">false</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowSoftInputMode">stateAlwaysHidden</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowActionModeOverlay">true</item>
</style>

     在 api-21 的设备上, 测试有效, 导航栏没有显示.

    

~感谢捧场,您的支持将鼓励我继续创作~