-
Notifications
You must be signed in to change notification settings - Fork 224
常见问题
🌐 View English Document | 繁體中文文檔
A:请检查是否已经配置 renderscript 支持,具体请查阅 Wiki 首页 文档页面中的《配置 DialogX》部分。
若已经配置,但依然无效果,建议将 Activity 的布局文件背景修改为纯色,不要使用透明色或不设置,例如设置为白色后再试。
若还是无效,请尝试下载运行 Demo,若也没有模糊效果说明设备不支持 renderscript,请选用别的主题。
A:有两个方案可供选择
方案一:优化软件布局设计
针对纵向布局,在布局外层添加 ScrollView 组件即可。
其原因为,当输入法弹出时,如果 Activity 的界面内存在 ScrollView,系统会自动压缩 ScrollView 的高度以实现让界面合理的显示,此时可以触发“底部非安全区”高度的变化,DialogX 可以获取到合适的高度以正常抬起对话框的显示。
方案二:直接使用输入法处理模式:重定界面大小即可。
进入您的项目 AndroidManifest.xml,对 Activity 添加配置:
<activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize" ...> ... </activity>
A:请查阅 Wiki 首页 文档页面中的《配置 DialogX》部分并检查 Activity 的 theme 设置,因为实现原理,DialogX 的对话框无法覆盖原生 ActionBar 区域,建议使用 NoActionBar 的 theme。
另外,如果无法覆盖导航栏或显示不全,请将 Activity 实现沉浸式后再试,推荐使用 BaseFramework 框架 可以自动实现顶部状态栏和底部导航栏的沉浸式效果(Demo 同款)。
A:因为这些组件可能都涉及沉浸式相关逻辑,DialogX 会在显示时额外的自动空出屏幕四边的“非安全区域”来保证组件内容的正常显示,但也这可能会在未实现沉浸式的应用中出现额外的边距,此时您可以将应用的Activity 沉浸式,包含顶部状态栏透明及底部导航栏背景透明,即可完美解决。
我更建议您使用 BaseFramework 框架的沉浸式方案(https://xiaozhuanlan.com/topic/4276819530)
A:请指定设置 Activity 布局文件背景颜色。
A:检查主线程逻辑是否出现卡线程的问题,DialogX 之所以可以做到在异步线程启动的原理是 Post 了启动消息到主线程去运行,但主线程循环消息的过程一旦出现阻塞现象就会导致 DialogX 的启动过程无法流畅的执行,建议将耗时的操作放到异步线程运行,尽量减少主线程的工作流程,此问题就不会出现了。
A:默认情况下 DialogX 的对话框不需要传入 context(activity) 参数是为了方便开发提升开发效率,但依赖 UI 呈现的对话框不可能不需要 context 参数,因此 DialogX 是通过初始化完成后监听 activity 的启动自动获取当前 activity 作为容器呈现并启动对话框的,这能应对 99% 的开发场景。
如果你遇到执行了
.show()
命令但对话框并没有如期显示的情况,可能是频繁切换 activity,或者在跳转到一个刚启动的 activity 界面时,DialogX 还未能接收到正确该显示的 ativity 监听回调,此时对话框可能被错误的在上一个界面显示,应对这种情况请指定 activity 参数即可解决,例如.show(activity)
。针对 WaitDialog,请尝试
WaitDialog.show(activity, "messageString")
,并在关闭时指定:WaitDialog.dismiss(activity)
。
A:执行的对话框的 show 指令后,切换了别的 Activity,发现对话框在另一个 Activity 显示。
这个问题的原因和上边一个问题类似,出现了主线程卡线程的问题,而 DialogX 启动是必须等待主线程循环消息执行启动过程的,如果说在处理事务的时候频繁执行 dismiss 关闭指令或 show 指令,以及切换 Activity 的显示可能造成对话框启动依赖的 Activity 判断错误,而 DialogX 默认的启动方法也没有指定依赖的 Activity,这时可以尝试指定启动的 Activity。
方法是使用对话框组件的
build()
方法构建对话框,请注意build()
方法是没有参数的,你需要通过方法设定对话框的其他参数,例如标题、内容、按钮等,最后执行show(activity)
方法启动对话框,举例如下:MessageDialog.build() .setTitle("Title") .setMessage("This is message content.") .setOkButton("OK", new OnDialogButtonClickListener<MessageDialog>() { @Override public boolean onClick(MessageDialog baseDialog, View v) { //... return false; } }) .show(MainActivity.this); //重点
A:您可以使用 InputDialog 的 InputInfo 设置来修改它:
new InputDialog("标题", "正文内容", "确定", "取消", "正在输入的文字") .setInputInfo(new InputInfo() .setCursorColor(Color.parseColor("#185ABD")) //设置光标颜色 .setBottomLineColor(Color.parseColor("#185ABD")) //设置底部横线颜色 );也可以使用
.setThemeColor(...)
来一并设置,但请注意,部分主题样式下 bottomLineColor 可能影响输入框的背景色。请在您的 style 中添加以下代码复写:
定义亮色模式时,DialogX 中的 AppCompat 组件主题色:
<style name="DialogXCompatThemeLight" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorAccent">@color/colorAccent</item> </style>定义暗色模式时,DialogX 中的 AppCompat 组件主题色:
<style name="DialogXCompatThemeDark" parent="Theme.AppCompat.NoActionBar"> <item name="colorAccent">@color/colorAccent</item> </style>DialogX 中的输入框使用的是系统原生组件,并非自定义组件,所以修改方式需要按照原生主题色修改方案来。
A:请关闭这个设置:
//使用沉浸式适配 //请注意,若你没有使用沉浸式适配,请关闭此选项,此选项将影响对话框布局是否允许延伸至导航栏背后显示 DialogX.useActivityLayoutTranslationNavigationBar = false;详细原因:
因为 fitSystemWindow 标记只能对一个 Window 下的一个 View 生效,DialogX 要是自己用了用户那边就没法用,所以 DialogX 不能 Hook 这个标记,DialogX是在DialogXBaseRelativeLayout 这个布局组件中处理沉浸式相关事务的,包括键盘弹起,这都算底部非安全区高度变化相关逻辑,但 Google 在针对未设置此 Flag 的情况下,会出现弹出新对话框时,旧对话框(已弹出的其他对话框)接收到一次异常的底部高度变化值,其特征是会出现先归0然后回调几次后再恢复正常的值,表现形式是涉及底部显示的对话框出现“弹跳”的问题。
为解决这个问题,DialogX 的最新版本默认启用了对 Window 设置 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 标记的操作,若需要关掉它请使用:
DialogX.useActivityLayoutTranslationNavigationBar = false;
A:DialogX 默认使用 View 实现方式,你可以理解为实际上只是在当前 Activity 上叠加了一层 DialogView,因为并不是独立的 Window,所以无法覆盖在 DialogFragment、AlertDialog 之上。
我们更推荐您将使用 DialogFragment、AlertDialog 方案实现的对话框,改为 DialogX 替代,DialogX 也提供了诸如 CustomDialog 这样的组件以满足个性化对话框的需要。
若实在无法替代,您可以尝试 DialogX 的其他实现模式,但请谨慎使用,其他方案依然存在特定情况下的 bug,若你有遇到,请反馈给我们。
A:直接滑动 BottomDialog 和 FullScreenDialog 对话框中的 ScrollView、ListView、RecycleView 等布局可能无法实现和对话框下滑关闭的联动,要实现此功能,请自定义对应的组件,继承 ScrollController,并完成以下接口的实现:
@Override //请按照固定写法 public boolean isLockScroll() { return lockScroll; } boolean lockScroll; @Override //请按照固定写法 public void lockScroll(boolean lockScroll) { this.lockScroll=lockScroll; } @Override public boolean onTouchEvent(MotionEvent event) { if (lockScroll) return false; return super.onTouchEvent(event); } @Override //获取已滚动距离,请注意不同组件的获取方式不同,请按照根据实际情况调整 public int getScrollDistance() { return getScrollY(); } @Override //固定写法 public boolean isCanScroll() { return true; }然后在对需要继承滑动的布局设置 Tag,固定文本“ScrollController”,BottomDialog 和 FullScreenDialog 对话框会在运行后识别子布局中的 ScrollController 实现,并在其处于滑动到顶部且继续下滑时接管触摸事件。
A:因为 Activity 的 onKeyDown 属于事件链的上游,此时对话框未启动或 KeyBack 事件还未传递到对话框,对话框无法进行处理,请使用 onBackPressed 处理,例如:
@Override public void onBackPressed() { MessageDialog.show("提示", "确认退出?", "是", "否") .setOkButton(new OnDialogButtonClickListener<MessageDialog>() { @Override public boolean onClick(MessageDialog baseDialog, View v) { MainActivity.super.onBackPressed(); return false; } }); }
A:可使用
.setBackgroundRadius(float px)
来设置圆角大小,使用此设置后,圆角部分将对对话框内容进行裁切显示,另外,对于 BottomDialog、BottomMenu、FullScreenDialog,圆角设置仅对左上、右上圆角有效。另请参考 issues:228
A:请参考 利用DialogX实现传统进度条对话框效果
A:DialogX 建议对话框的使用是单次的,这意味着当你对一个已经显示的对话框执行
.dismiss()
方法时将完全销毁它,这是为了避免内存占用和内存泄漏,要重复使用一个对话框保留其状态(例如其中有用户交互输入的内容或自定义布局进行了操作)。//保留 customView private View customView; //完成界面初始化,例如在 activity 的 onCreate 方法中 customView = LayoutInflater.from(this).inflate(R.layout.layout_your_custom_view, null);然后在启动对话框时使用 view 作为参数:
CustomDialog.show(new OnBindView<CustomDialog>(customView) { @Override public void onBind(CustomDialog dialog, View v) { //... } });只要不重新创建 customView,那么其内容是会一直保留的。
首先请在对话框启动时拿到其对象实例:
//在全局设置一个对话框实例 private InputDialog inputDialog; //显示对话框并获取其实例 inputDialog = InputDialog.show("这是一个输入框","输入提示文本","OK","CANCEL")接着编写其相关事件处理:
inputDialog = InputDialog.show("这是一个输入框","输入提示文本","OK","CANCEL") .setOkButton(new OnInputDialogButtonClickListener<InputDialog>() { @Override public boolean onClick(InputDialog dialog, View v, String inputStr) { //使用退出动画隐藏对话框 dialog.hideWithExitAnim(); //return true 拦截 OK 按钮点击不要自动 dismiss return true; } }) .setCancelButton(new OnInputDialogButtonClickListener<InputDialog>() { @Override public boolean onClick(InputDialog dialog, View v, String inputStr) { dialog.hideWithExitAnim(); //return true 拦截 Cancel 按钮点击不要自动 dismiss return true; } }) .setOnBackgroundMaskClickListener(new OnBackgroundMaskClickListener<MessageDialog>() { @Override public boolean onClick(MessageDialog dialog, View v) { dialog.hideWithExitAnim(); //return true 拦截背景遮罩点击不要自动 dismiss return true; } }) .setOnBackPressedListener(new OnBackPressedListener<MessageDialog>() { @Override public boolean onBackPressed(MessageDialog dialog) { dialog.hideWithExitAnim(); //return true 拦截返回键点击不要自动 dismiss return true; } });要重新显示这个对话框,可以直接使用
.show()
命令:inputDialog.show();理论上在 activity 销毁时 DialogX 也会自行销毁对应该 activity 的对话框,若你担心,可以在
activity#onDestroy()
中加入手动销毁的方法:inputDialog.dismiss();
请检查设置的 fontColor 或 backgroundColor 的值类型是否正确,一般需要的值为 ColorInt 值,您可以使用
Color.parseColor("#4D000000")
设置一个 HEX 色值,或使用资源getResources().getColor(R.color.black30)
设置一个颜色的资源值,请勿直接传入资源 ID,它可能会无效。
【功能建议】可以让BottomMenu 支持显示多行吗? 而不是超过1行 后面就点点点(issues:247)
popmenu如果挂点的view在边缘的话,弹出来的popmenu会变形(issues:231)