如何实现导航栏上划显示,触摸隐藏,扫码枪也不能使其展示

如何实现导航栏上划显示,触摸隐藏,扫码枪也不能使其展示

简介

	公司最近在做零售相关的业务,其中不需要使用软键盘,同时还需要隐藏导航栏,
	但是可以上划展示导航栏,一半这种展示时间大约是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>

做了下更新,还是很完美的,希望对大家有所帮助吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值