news 2026/4/23 19:00:17

android 自定义Dialog,baseDialog,居中、底部对其,弹框设置背景透明、显示时隐藏系统导航栏,view的显示和添加,任意布局view;ProgressBar样式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
android 自定义Dialog,baseDialog,居中、底部对其,弹框设置背景透明、显示时隐藏系统导航栏,view的显示和添加,任意布局view;ProgressBar样式

1、自定义

  • 若使用百分比宽高:percentHight、percenWidth,dialog的xml的最高层布局的宽高,必须是match_parent,要不然,会不生效
package com.jd.oa.joy.note.util; import android.app.Dialog; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.view.Display; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; import com.jd.oa.joy.note.R; public abstract class BaseDialog extends Dialog { private int gravity=-1; /** * * 若使用百分比宽高:percentHight、percenWidth,dialog 的xml的最高层布局的宽高,必须是match_parent,要不然,会不生效 * */ private double percentHight=-1; private double percenWidth=1; public BaseDialog(Context mContext) { super(mContext, R.style.MyDialog);//这里设置dialog的统一主题,全屏、背景透明等 } public BaseDialog(Context mContext, int gravity,double percenWidth,double percentHight) { super(mContext, R.style.MyDialog);//这里设置dialog的统一主题,全屏、背景透明等 this.gravity=gravity; this.percenWidth=percenWidth; this.percentHight = percentHight; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getLayoutId());//这行一定要写在前面 Window window = this.getWindow(); if (gravity==-1){ window.setGravity(Gravity.CENTER);//设置弹框对其方式 }else { window.setGravity(gravity);//设置弹框对其方式 } WindowManager.LayoutParams params = window.getAttributes(); WindowManager windowManager = window.getWindowManager(); Display display = windowManager.getDefaultDisplay(); if (percentHight!=-1){ //设置弹框的高为屏幕的一半宽是屏幕的宽 params.height = (int)(display.getHeight()*percentHight); //设置宽度 }else { params.height = WindowManager.LayoutParams.WRAP_CONTENT;//设置宽高模式, } if (percenWidth != -1) { params.width = (int)(display.getWidth() * percenWidth); } else { params.width = WindowManager.LayoutParams.WRAP_CONTENT; } window.setAttributes(params); initView(); initData(); } protected abstract void initView(); protected abstract void initData(); protected abstract int getLayoutId(); public void setWidthPercent(double percent) { Window window = this.getWindow(); WindowManager.LayoutParams params = window.getAttributes(); WindowManager windowManager = window.getWindowManager(); Display display = windowManager.getDefaultDisplay(); params.width = (int)(display.getWidth() * percent); window.setAttributes(params); } private 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); } } //-------------------------隐藏系统导航栏----------------------------------- @Override public void show() { this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); super.show(); fullScreenImmersive(getWindow().getDecorView()); this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); } }

2、R.style.MyDialog,在value文件夹下找到style或者themes,将下述代码加进去

<style name="MyDialog" parent="@android:style/Theme.NoTitleBar.Fullscreen"> <!-- 是否有边框 --> <item name="android:windowFrame">@null</item> <!--是否在悬浮Activity之上 --> <item name="android:windowIsFloating">true</item> <!--标题 --> <item name="android:windowNoTitle">true</item> <!--阴影 --> <item name="android:windowIsTranslucent">false</item><!--半透明--> <!-- 点外边可以消失 --> <item name="android:windowCloseOnTouchOutside">false</item> <item name="android:windowBackground">@color/black_00_color</item><!--背景透明-->//这里的透明色值为:#00000000 · </style>

3、重写

package com.superx.boost.clean.dialog; import android.content.Context; import android.view.View; import android.widget.LinearLayout; import com.superx.boost.clean.R; /** * author : jian11058 * time : 2021/12/31 * desc : */ public class CancelUploadHintDialog extends BaseDialog { private OnConfirmListener onConfirmListener; public CancelUploadHintDialog(Context mContext) { super(mContext, Gravity.CENTER, 0.85, -1); } @Override protected void initView() { TextView btnCancel = findViewById(R.id.btn_cancel); TextView btnConfirm = findViewById(R.id.btn_confirm); btnCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); btnConfirm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onConfirmListener != null) { onConfirmListener.onConfirm(); } dismiss(); } }); } @Override protected void initData() { // 初始化数据 } @Override protected int getLayoutId() { return R.layout.dialog_cancel_upload_hint; } public void setOnConfirmListener(OnConfirmListener listener) { this.onConfirmListener = listener; } public interface OnConfirmListener { void onConfirm(); } }

view的添加与显示;

1、利用layout.addview(View); 2、利用activity中的:addContentView() videoView = LayoutInflater.from(context).inflate(R.layout.view_video_play, null); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); //设置顶部,左边布局 params.gravity = Gravity.TOP | Gravity.LEFT; if (context instanceof Activity) { ((Activity) context).addContentView(videoView, params); } 可自定义任意view的布局,然后进行管理隐藏或显示 ;

progress样式:

<ProgressBar android:id="@+id/progress_bar" android:layout_width="40dp" android:layout_height="40dp" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:indeterminate="false" android:indeterminateDrawable="@drawable/progress_bar_drawable_login_white" /> progress_bar_drawable_login_white(在drawable文件夹下): <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <rotate android:drawable="@mipmap/login_loading_white" android:fromDegrees="0.0" android:toDegrees="360.0" android:pivotX="50.0%" android:pivotY="50.0%" /> </item> </layer-list>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 5:27:21

线性回归实战:用NumPy手搓梯度下降,对比Sklearn看看我们差在哪里

线性回归实战&#xff1a;从零实现梯度下降与工业级库的深度对比 在数据科学面试中&#xff0c;面试官常常会要求候选人抛开高级库&#xff0c;从零实现核心算法。这不仅是考察基本功的方式&#xff0c;更是理解算法本质的绝佳机会。今天我们就来挑战一个经典任务&#xff1a;用…

作者头像 李华
网站建设 2026/4/17 5:25:16

从零封装一个ChatGPT UI:Vue3+TS实现会话历史本地存储的完整方案

从零构建ChatGPT风格UI&#xff1a;Vue3TypeScript实现会话持久化与PDF预览的工程实践 1. 项目架构设计与技术选型 在构建类ChatGPT的Web应用时&#xff0c;Vue3与TypeScript的组合已成为现代前端开发的首选方案。这套技术栈提供了以下核心优势&#xff1a; 响应式系统升级&…

作者头像 李华
网站建设 2026/4/17 5:22:12

从零开始:IntelliJ IDEA搭建SSM框架的JavaWeb项目(超详细步骤+避坑指南)

1. 环境准备与项目创建 第一次用IntelliJ IDEA搭建SSM项目时&#xff0c;我对着空白的界面发呆了半小时——明明跟着教程操作&#xff0c;却总是卡在奇怪的报错上。后来才发现&#xff0c;很多问题都出在环境配置这个最初环节。下面这些细节建议拿小本本记好&#xff1a; 安装J…

作者头像 李华