android 怎么自定popupwindow设置高度无反应

android 怎么自定popupwindow设置高度无反应,第1张

使用PopupWindow可实现d出窗口效果,,其实和AlertDialog一样,也是一种对话框,两者也经常混用,但是也各有特点。下面就看看使用方法。

首先初始化一个PopupWindow,指定窗口大小参数。

PopupWindow mPop = new PopupWindow(getLayoutInflater().inflate(R.layout.window, null),

LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)

也可以分开写:

LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)

//自定义布局

ViewGroup menuView = (ViewGroup) mLayoutInflater.inflate(

R.layout.window, null, true)

PopupWindow mPop = new PopupWindow(menuView, LayoutParams.WRAP_CONTENT,

LayoutParams.WRAP_CONTENT, true)

当然也可以手动设置PopupWindow大小。

mPop.setContentView(menuView )//设置包含视图

mPop.setWidth(int )

mPop.setHeight(int )//设置d出框大小

设置进场动画:

mPop.setAnimationStyle(R.style.AnimationPreview)//设置动画样式

mPop.setOutsideTouchable(true)//这里设置显示PopuWindow之后在外面点击是否有效。如果为false的话,那么点击PopuWindow外面并不会关闭PopuWindow。当然这里很明显只能在Touchable下才能使用。

当有mPop.setFocusable(false)的时候,说明PopuWindow不能获得焦点,即使设置设置了背景不为空也不能点击外面消失,只能由dismiss()消失,但是外面的View的事件还是可以触发,back键也可以顺利dismiss掉。当设置为popuWindow.setFocusable(true)的时候,加上下面两行设置背景代码,点击外面和Back键才会消失。

mPop.setFocusable(true)

需要顺利让PopUpWindow dimiss(即点击PopuWindow之外的地方此或者back键PopuWindow会消失);PopUpWindow的背景不能为空。必须在popuWindow.showAsDropDown(v)或者其它的显示PopuWindow方法之前设置它的背景不为空:

mPop.setBackgroundDrawable(new ColorDrawable(0))

mPop.showAsDropDown(anchor, 0, 0)//设置显示PopupWindow的位置位于View的左下方,x,y表示坐标偏移量

mPop.showAtLocation(findViewById(R.id.parent), Gravity.LEFT, 0, -90)(以某个View为参考),表示d出窗口以parent组件为参考,位于左侧,偏移-90。

mPop.setOnDismissListenerd(new PopupWindow.OnDismissListener(){})//设置窗口消失事件

注:window.xml为布局文件

总结:

1、为PopupWindow的view布局,通过LayoutInflator获取布局的view.如:

LayoutInflater inflater =(LayoutInflater)

this.anchor.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)

View textEntryView = inflater.inflate(R.layout.paopao_alert_dialog, null)

2、显示位置,可以有很多方式设置显示方式

pop.showAtLocation(findViewById(R.id.ll2), Gravity.LEFT, 0, -90)

或者

pop.showAsDropDown(View anchor, int xoff, int yoff)

3、进出场动画

pop.setAnimationStyle(R.style.PopupAnimation)

4、点击PopupWindow区域外部,PopupWindow消失

this.window = new PopupWindow(anchor.getContext())

this.window.setTouchInterceptor(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

if(event.getAction() ==MotionEvent.ACTION_OUTSIDE) {

BetterPopupWindow.this.window.dismiss()

return true

}

return false

}

})

PopupWindow 自适应宽度实例

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int maxWidth = meathureWidthByChilds() + getPaddingLeft() + getPaddingRight()super.onMeasure(MeasureSpec.makeMeasureSpec(maxWidth,MeasureSpec.EXACTLY),heightMeasureSpec)

}

public int meathureWidthByChilds() {

int maxWidth = 0

View view = null

for (int i = 0i <getAdapter().getCount()i++) {

view = getAdapter().getView(i, view, this)

view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)

if (view.getMeasuredWidth() >maxWidth){

maxWidth = view.getMeasuredWidth()

}

}

return maxWidth

}

PopupWindow自适应布局

Android自带的Menu菜单,常常无法满足我们的需求,所以就只有自己写menu菜单,通常的选择是用PopupWindow来实现自定义的menu菜单,先看代码,再来说明要注意的几点:

View menuView = inflater.inflate(R.layout.menu_popwindow, null)

final PopupWindow p = new PopupWindow(mContext)

p.setContentView(menuView)

p.setWidth(ViewGroup.LayoutParams.FILL_PARENT)

p.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT)

p.setAnimationStyle(R.style.MenuWindow)

p.setOnDismissListener(this)

p.setOutsideTouchable(false)

p.setBackgroundDrawable(new ColorDrawable(android.R.color.transparent))

p.setFocusable(true)// 如果把焦点设置为false,则其他部份是可以点击的,也就是说传递事件时,不会先走PopupWindow

mPopwindow = p

1 应该限制popwindow的偏移量,确保不超出屏幕

2 可以通过计算popwindow的位置和屏幕边缘的距离,然后根据需要调整popwindow的偏移值,以确保不会超出屏幕。

3 可以通过设置popwindow的Gravity属性和偏移量,以及给popwindow的父布局设置clipChildren属性为false,来避免popwindow的偏移部分超出屏幕。

另外,还可以考虑使用PopupWindow的d出框箭头指向屏幕中心的方式,来确保popwindow可以在屏幕内完全显示。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7882037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存