Android开发PopupWindow showAtLocation用法

本文详细解析了Java中使用`showAsDropDown`、`showAtLocation`方法调整弹出窗口位置的原理与用法,包括参数含义、偏移量应用及实例演示。
Java code ?
1
showAsDropDown(anchor);
 以触发弹出窗的view为基准,出现在view的正下方,弹出的pop_view左上角正对view的左下角  偏移量默认为0,0

Java code ?
1
showAsDropDown(anchor, xoff, yoff);
 有参数的话,就是一view的左下角进行偏移,xoff正的向左,负的向右. yoff没测,也应该是正的向下,负的向上

Java code ?
1
showAtLocation(parent, gravity, x, y);
 
parent:传你当前Layout的id;  
gravity:Gravity.BOTTOM(以屏幕左下角为参照)... 偏移量会以它为基准点 当x y为0,0是出现在底部居中 
Android 中,PopupWindow 的 `showAtLocation()` 方法抛出 “Unable to add window -- token android.view.ViewRootImpl$W@84bb749 is not valid; is your activity running?” 错误,通常是因为 PopupWindow 需要依附在一个有效的 Activity 或视图上,而此时提供的 token 无效,可能是 Activity 还未完全创建好或者视图还未附加到窗口上。以下是几种可能的解决办法: ### 确保在 Activity 完全创建后调用 避免在 `onCreate()` 或 `onStart()` 中过早调用 `showAtLocation()` 方法,因为此时 Activity 可能还未完全创建好。可以将调用移到 `onResume()` 方法中,确保 Activity 已经处于可见且可交互状态。 ```java @Override protected void onResume() { super.onResume(); // 在这里调用 showAtLocation() 方法 popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.CENTER, 0, 0); } ``` ### 使用有效的视图 token 确保传递给 `showAtLocation()` 方法的 token 是有效的。可以使用当前 Activity 的根视图的 token,而不是其他可能无效的 token。 ```java View rootView = getWindow().getDecorView().getRootView(); popupWindow.showAtLocation(rootView, Gravity.CENTER, 0, 0); ``` ### 延迟显示 PopupWindow 如果在某些情况下,即使在 `onResume()` 中调用仍然出现问题,可以尝试延迟一段时间后再显示 PopupWindow,确保视图和 Activity 已经完全准备好。 ```java new Handler().postDelayed(new Runnable() { @Override public void run() { popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.CENTER, 0, 0); } }, 200); // 延迟 200 毫秒 ``` ### 检查 Activity 状态 在显示 PopupWindow 之前,检查 Activity 是否正在运行,避免在 Activity 已经销毁或正在销毁时显示 PopupWindow。 ```java if (!isFinishing() &&!isDestroyed()) { popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.CENTER, 0, 0); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值