如何实现导航栏上划显示,触摸隐藏,扫码枪也不能使其展示
简介
公司最近在做零售相关的业务,其中不需要使用软键盘,同时还需要隐藏导航栏,
但是可以上划展示导航栏,一半这种展示时间大约是4s,就自动缩回去了,这个可是一个非常头痛的需求你
第一步
将AndroidManifest.xml中的设置默认的软键盘不显示属性 android:windowSoftInputMode="stateHidden|stateAlwaysHidden"
第二步
需要设置状态栏的动态显示,首先给一个直接代码
public static void hideSystemUI(View decorView) {
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN //用于全屏展示状态栏
| View.SYSTEM_UI_FLAG_FULLSCREEN //用于全屏展示状态栏
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //使得虚拟导航栏隐藏,用户可以从屏幕下边缘“拖出”且不会再次消失,同时activity界面会被挤压
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION //效果使得导航栏出现的时候不会挤压activity高度,导航栏会覆盖在activity之上
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //它被称作“粘性”的沉浸模式,这个模式会在状态栏和导航栏显示一段时间后,自动隐藏(你可以点击一下屏幕,立即隐藏)。同时需要重点说明的是,这种模式下,状态栏和导航栏出现的时候是“半透明”状态,
| View.SYSTEM_UI_FLAG_IMMERSIVE //4.4以后这个属性是用来实现“沉浸式”效果的
);
}
这个是控制导航栏动态显示的核心代码
但是该怎么使用呢?
我们需要在BaseActivity中两处设置这个控制代码,一个是Activity创建,二个是全局的焦点控制
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
mView = getWindow().getDecorView();
PackageUtils.hideSystemUI(mView);
setContentView(getLayoutId());
}
// 这个是通过控制全局焦点来动态隐藏代码
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
PackageUtils.hideSystemUI(getWindow().getDecorView());
}
//以下方法是今日头条适配方案插拔扫码钱会导致对话框失效的代码
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
AutoSizeCompat.autoConvertDensityBaseOnHeight(getResources(),1080);
// Log.d("result-->", "onConfigurationChanged: 横屏");
}
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 这个是用来设置扫码枪扫码防止出现软件盘的核心方法
以上做完之后,你会发现你的Activity是不会出现闪烁了,那么对话框应该怎么操作呢
同样的也是控制窗体焦点,我的写法如下
@Override
public void show() {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
super.show();
}
这个是重写show方法,让整个窗体不具备焦点,这样就没有问题了,这个操作不会影响Edtext 对焦点的获取
<activity
android:name=".ui.MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:launchMode="singleTask"
android:screenOrientation="landscape"
android:windowSoftInputMode="stateHidden|stateAlwaysHidden" />
//内部所有的activity都要实现这个windowSoftInputMode
//主题样式
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowFullscreen">true</item>
<!-- 全屏即无通知栏-->
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="colorControlActivated">@color/colorAccent</item>
</style>
做了下更新,还是很完美的,希望对大家有所帮助吧