android沉浸式简单实现

这篇博客介绍了如何在Android应用中实现沉浸式状态栏。通过在EditText点击事件中监听并设置窗口装饰视图的系统UI可见性变化,实现了界面与状态栏的无缝融合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

布局就是一个EditText用来测试,点击后监听显示方法getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this);

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;

public class MainActivity extends AppCompatActivity implements View.OnSystemUiVisibilityChangeListener {

private Handler mHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // 保持屏幕常亮
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    // 开启沉浸式
    getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this);
    startImmerse(this);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mHandler = new Handler();

}

private void startImmerse(MainActivity mainActivity) {
    mainActivity.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_HIDE_NAVIGATION // hide nav bar
            | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
            | View.SYSTEM_UI_FLAG_IMMERSIVE);

}

@Override
public void onSystemUiVisibilityChange(int visibility) {
    Log.d("immerse", "onSystemUiVisibilityChange: " + visibility);
    if (visibility == 0) {
        mHandler.removeCallbacks(enterImmerseMode);
        mHandler.postDelayed(enterImmerseMode, 1000);
    }
}
private Runnable enterImmerseMode = new Runnable() {
    @Override
    public void run() {
        startImmerse(MainActivity.this);
    }
};

}
在看看PopupWindow和 Dialog的沉浸
在需要弹出PopupWindow的地方调用showPopupWindow();第一个参数是view,第二个是ListView 
 public void showPopupWindow(View anchor,ListView mlistView) {
    if (mlistView!=null){
        mPopupWindow = new PopupWindow(mlistView, anchor.getWidth(), DensityUtil.px2dp(800));
        mPopupWindow.setFocusable(false);
        mPopupWindow.setBackgroundDrawable(new ColorDrawable());
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setFocusable(false);
        mPopupWindow.update();
        PopupWindowCompat.showAsDropDown(mPopupWindow,anchor, 0, -anchor.getHeight() , Gravity.CENTER);

        fullScreenImmersive(mPopupWindow.getContentView());
        mPopupWindow.setFocusable(true);
        mPopupWindow.update();
    }
}

public void fullScreenImmersive(View view) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_FULLSCREEN;
        view.setSystemUiVisibility(uiOptions);
    }
}
Dialog的沉浸
  AlertDialog.Builder builder = new AlertDialog.Builder(ContextUtil.getCurrentActivity());
    builder.setMessage("");
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

            mDialog1.dismiss();
        }
    });
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {


            mDialog1.dismiss();
        }
    });
    mDialog = builder.create();
    //显示
    Utils.showDialog(mDialog);
    工具类里面的一个方法showDialog();
    public static void showDialog(Dialog dialog) {
    Activity activity = ContextUtil.getCurrentActivity();
    if (activity != null) {
        //Set the dialog to not focusable (makes navigation ignore us adding the window)
           dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
        dialog.show();
        //Set the dialog to immersive
        dialog.getWindow().getDecorView().setSystemUiVisibility(activity.getWindow().getDecorView().getSystemUiVisibility());
        //Clear the not focusable flag from the window
        dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值