导航:首页 > 操作系统 > androiddialog黑边

androiddialog黑边

发布时间:2023-09-06 07:18:33

android dialog 遮住输入框的解决思路

在工作中经常会遇到弹出的dialog有输入框的情况,屏幕大了还好,屏幕小了之后就特别容易出现输入框被软键盘遮住的情况,下面就是我在实际想中中遇到的

从上图可以看出输入框已经看不到了,遇到这种情况的第一个思路都是在dialog的style中添加

<item name="android:windowSoftInputMode">adjustPan</item>,我也试了下基本上没用。然后换了个思路,既然软键盘弹出来了,为什么不能让dialog向上移动同样的距离呢。思路有了,下面就是把他实现了。

首先就是要计算软键盘的高度,由于google并没有给出具体的方法来计算软键盘的高度,这时候我们就只能根据布局的高度变化来计算了。首先需要计算出屏幕的bottom坐标,然后监控布局的变动判断变动后的bottom和初始的bottom的差值,一般肉眼观察软键盘的高度差不多是屏幕高度的1/3,所以就假设bottom往上移动了屏幕的1/3的距离就认为软件盘弹出来了,当然也可以根据其他值来判断,下面贴出具体方法:

/**

* activity中判断软键盘是否显示

* @param activity

* */

fun isKeyboardShowing(activity: Activity): Boolean {

val screenHeight = activity.window!!.decorView.height.toDouble()

//获取view的可见区域

    val rect = Rect()

activity.window!!.decorView.getWindowVisibleDisplayFrame(rect)

return (2.0 /3.0) * screenHeight > rect.bottom.toDouble()

}

接下来我们来计算出软件盘的高度,经过我在多个测试机上实验发现初始时bottom就是屏幕的高度,下面是计算键盘高度的具体方法

/**

* activity中计算软键盘的高度

* @param activity

* */

fun getKeyboardHeight(activity: Activity): Int {

val displayMetrics = DisplayMetrics()

activity.windowManager.defaultDisplay.getMetrics(displayMetrics)

val screenHeight = displayMetrics.heightPixels

    val rect = Rect()

activity.window!!.decorView.getWindowVisibleDisplayFrame(rect)

return screenHeight - rect.bottom

}

有了高度之后一切就好办了我们只需要在软键盘弹出来的时候把dialog往上移动就行,在移动方式上我选择了设置LayoutParams的方式,开始时想设置底部margin的,结果发现没作用,dialog一点不移动,最后只好设置上边的margin为负值

if (SoftUtils.isKeyboardShowing(context)) {

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin ==0) {

lp.topMargin = -SoftUtils.getKeyboardHeight(context)

if (mRootView.height

lp.height =mRootOriginHeight

        }

mRootView.layoutParams = lp

}

}else {

if (mRootOriginHeight ==0) {

mRootOriginHeight =mRootView.height

    }

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin <0) {

lp.topMargin =0

        mRootView.layoutParams = lp

}

}

其中mRootView是dialog最外层的布局。在这里面比较重要的一点监测方式,在哪里监测软键盘的弹出动作,在activity中可以监测onWindowFocusChanged方法,但是如果封装了dialog的话,dialog中的onWindowFocusChanged并不会起作用,在这里我选择了使用ViewTreeObserver和监听,通过给mRootView的ViewTreeObserver添加addOnGlobalLayoutListener来实时判断,下面是完整的方法

private fun setSpace() {

val treeObserver =mRootView.viewTreeObserver

    treeObserver.addOnGlobalLayoutListener{

        if (SoftUtils.isKeyboardShowing(context)) {

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin ==0) {

lp.topMargin = -SoftUtils.getKeyboardHeight(context)

if (mRootView.height

lp.height =mRootOriginHeight

                }

mRootView.layoutParams = lp

}

}else {

if (mRootOriginHeight ==0) {

mRootOriginHeight =mRootView.height

            }

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin <0) {

lp.topMargin =0

                mRootView.layoutParams = lp

}

}

}

}

在这里当软键盘弹出的时候重新设置了下dialog的高度,因为有时候软键盘的弹出会使dialog的高度压缩,所以弹出的时候重新设置下就好了。

这就是我的一个解决思路,当然完全按这个写的话当输入框较多时也可能出问题,最上层的输入框跑屏幕之外去了,这种情况下我们只需要根据输入框的位置动态的计算dialog需要往上移动的距离就行,不要一直设置为计算出来的软键盘的高度。

下图是解决之后的UI

Ⅱ android加载自定义dialog,背景总是黑色的.不知道为什么.求解答

  1. AlertDialog.Builder builder = new AlertDialog.Builder(UserInformationActivity.this,AlertDialog.THEME_HOLO_LIGHT);这种形式的,其中“AlertDialog.THEME_HOLO_LIGHT”设置背景,这个是白色的

  2. 把Activity设置成dialog的,修改AndroidManifest.xml中该Activity的theme,如:android:theme="@android:style/Theme.Holo.Light.Dialog.NoActionBar" ,这样这个Activity会以dialog的形式弹出,并且是白色的

  3. 自己写一个自定义dialog继承dialog,你dialog的布局文件的最外层layout背景颜色设置成白色的

Ⅲ android 怎样设置dialog的背景

[html]viewplainprint?
<itemname="android:windowFrame">@null</item>

阅读全文

与androiddialog黑边相关的资料

热点内容
程序员经常用工具 浏览:833
降服主力指标源码主图 浏览:497
python实用库 浏览:691
电脑默认7个文件夹 浏览:9
新唐单片机安装c51后编译错误 浏览:527
红包源码引流神器 浏览:232
学生初中毕业撕书解压 浏览:745
命令方块刷铜点教学 浏览:690
php邮件订阅系统 浏览:994
柱梁底加密箍间距 浏览:29
pythonjavascript对比 浏览:740
什么动漫app是大陆字幕 浏览:286
android查看activity栈 浏览:918
x86固件编译 浏览:165
安卓下什么可以看微博动图 浏览:412
永辉生活app注册有什么优惠吗 浏览:411
行偏移算法 浏览:240
什么app也能让wifi增强 浏览:178
双分录核算法反映什么 浏览:210
ubuntuphpaptget 浏览:256