我懂了,但是只能通过d窗的按钮让d窗消失吧,我是这样理解的,那个dialogd出来就想当进入另一个界面。,所以原来的界面自然是失效的,只有在dialog这个界面结束才能返回原界面,所以你的想法我还真是没有试过,所以抱歉我帮不到了。
popUpWindowsetBackgroundDrawable(getResources()getDrawable(Rdrawablepage2));
设置的是popupwindow(window容器)的背景。
popUpWindow = new PopupWindow(show_popvieView,LayoutParamsWRAP_CONTENT,LayoutParamsWRAP_CONTENT); //是将show_popvieView放入容器中,以自适应作为大小,且容器也采用自适应。
综上,如果你设置大小,导致show_popvieView沾满整个屏幕,那么window容器最为底层,设置的背景坑定是看不见的。
建议:背景设置采用设置show_popvieView的背景。如果有多层,可以在内容里面镶嵌,最好别直接设置外层popupwindow容器
我今天也遇到这个问题了
开始以为当spinner在scrollview时 存在android版本兼容问题
于是改成了popupwindow 比spinner麻烦好多 页面有多个EditText用于d出popupwindow展示不同的下拉数据 点击TextView要记录当前的EditText当点击popupwindow的列表项关闭popupwindow时要取到数据手动调用之前记录的EditText的setttext方法
而用spinner 这一切都是自动的
前面都是废话 结果用popupwindow实现完后还是一样 会自动滚动到顶部 这时才仔细分析问题原因
原来是在点击EditText(设置了clickable=true;focusable=false)d出spinner/popupwindow时焦点在页面外的EditText上 ,于是关闭spinner/popupwindow时页面自动滚动到获取焦点的EditText
解决方法很简单 在focusable=false的EditText的点击事件里去掉焦点
if (getCurrentFocus()!=null) {
getCurrentFocus()clearFocus();
}
使用PopupWindow可实现d出窗口效果,,其实和AlertDialog一样,也是一种对话框,两者也经常混用,但是也各有特点。下面就看看使用方法。
首先初始化一个PopupWindow,指定窗口大小参数。
PopupWindow mPop = new PopupWindow(getLayoutInflater()inflate(Rlayoutwindow, null),
LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);
也可以分开写:
LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
//自定义布局
ViewGroup menuView = (ViewGroup) mLayoutInflaterinflate(
Rlayoutwindow, null, true);
PopupWindow mPop = new PopupWindow(menuView, LayoutParamsWRAP_CONTENT,
LayoutParamsWRAP_CONTENT, true);
当然也可以手动设置PopupWindow大小。
mPopsetContentView(menuView );//设置包含视图
mPopsetWidth(int )
mPopsetHeight(int )//设置d出框大小
设置进场动画:
mPopsetAnimationStyle(RstyleAnimationPreview);//设置动画样式
mPopsetOutsideTouchable(true);//这里设置显示PopuWindow之后在外面点击是否有效。如果为false的话,那么点击PopuWindow外面并不会关闭PopuWindow。当然这里很明显只能在Touchable下才能使用。
当有mPopsetFocusable(false);的时候,说明PopuWindow不能获得焦点,即使设置设置了背景不为空也不能点击外面消失,只能由dismiss()消失,但是外面的View的事件还是可以触发,back键也可以顺利dismiss掉。当设置为popuWindowsetFocusable(true);的时候,加上下面两行设置背景代码,点击外面和Back键才会消失。
mPopsetFocusable(true);
需要顺利让PopUpWindow dimiss(即点击PopuWindow之外的地方此或者back键PopuWindow会消失);PopUpWindow的背景不能为空。必须在popuWindowshowAsDropDown(v);或者其它的显示PopuWindow方法之前设置它的背景不为空:
mPopsetBackgroundDrawable(new ColorDrawable(0));
mPopshowAsDropDown(anchor, 0, 0);//设置显示PopupWindow的位置位于View的左下方,x,y表示坐标偏移量
mPopshowAtLocation(findViewById(Ridparent), GravityLEFT, 0, -90);(以某个View为参考),表示d出窗口以parent组件为参考,位于左侧,偏移-90。
mPopsetOnDismissListenerd(new PopupWindowOnDismissListener(){})//设置窗口消失事件
注:windowxml为布局文件
总结:
1、为PopupWindow的view布局,通过LayoutInflator获取布局的view如:
LayoutInflater inflater =(LayoutInflater)
thisanchorgetContext()getSystemService(ContextLAYOUT_INFLATER_SERVICE);
View textEntryView = inflaterinflate(Rlayoutpaopao_alert_dialog, null);
2、显示位置,可以有很多方式设置显示方式
popshowAtLocation(findViewById(Ridll2), GravityLEFT, 0, -90);
或者
popshowAsDropDown(View anchor, int xoff, int yoff)
3、进出场动画
popsetAnimationStyle(RstylePopupAnimation);
4、点击PopupWindow区域外部,PopupWindow消失
thiswindow = new PopupWindow(anchorgetContext());
thiswindowsetTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(eventgetAction() ==MotionEventACTION_OUTSIDE) {
BetterPopupWindowthiswindowdismiss();
return true;
}
return false;
}
});
PopupWindow 自适应宽度实例
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int maxWidth = meathureWidthByChilds() + getPaddingLeft() + getPaddingRight(); superonMeasure(MeasureSpecmakeMeasureSpec(maxWidth,MeasureSpecEXACTLY),heightMeasureSpec);
}
public int meathureWidthByChilds() {
int maxWidth = 0;
View view = null;
for (int i = 0; i < getAdapter()getCount(); i++) {
view = getAdapter()getView(i, view, this);
viewmeasure(MeasureSpecUNSPECIFIED, MeasureSpecUNSPECIFIED);
if (viewgetMeasuredWidth() > maxWidth){
maxWidth = viewgetMeasuredWidth();
}
}
return maxWidth;
}
PopupWindow自适应布局
Android自带的Menu菜单,常常无法满足我们的需求,所以就只有自己写menu菜单,通常的选择是用PopupWindow来实现自定义的menu菜单,先看代码,再来说明要注意的几点:
View menuView = inflaterinflate(Rlayoutmenu_popwindow, null);
final PopupWindow p = new PopupWindow(mContext);
psetContentView(menuView);
psetWidth(ViewGroupLayoutParamsFILL_PARENT);
psetHeight(ViewGroupLayoutParamsWRAP_CONTENT);
psetAnimationStyle(RstyleMenuWindow);
psetOnDismissListener(this);
psetOutsideTouchable(false);
psetBackgroundDrawable(new ColorDrawable(androidRcolortransparent));
psetFocusable(true); // 如果把焦点设置为false,则其他部份是可以点击的,也就是说传递事件时,不会先走PopupWindow
mPopwindow = p;
以上就是关于如何获得dialog下的activity焦点全部的内容,包括:如何获得dialog下的activity焦点、android的popupwindow控件的大小的问题、android Spinner控件 选择后为什么会自动d到界面顶部等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)