详解Android中PopupWindow在7.0后适配的解决
作者:smart_dev 发布时间:2022-12-07 11:16:59
标签:Android7.0,PopupWindow,适配
本文介绍了详解Android中PopupWindow在7.0后适配的解决,分享给大家,具体如下:
这里主要记录一次踩坑的经历。
需求:如上图左侧效果,想在按钮的下方弹一个PopupWindow。嗯,很简单一个效果,然当适配7.0后发现这个PopupWindow显示异常,然后网上找到了下面这种方案。
7.0适配方案(但7.1又复现了)
// 将popupWindow显示在anchor下方
public void showAsDropDown(PopupWindow popupWindow, View anchor) {
if (Build.VERSION.SDK_INT < 24) {
popupWindow.showAsDropDown(anchor);
} else {
// 适配 android 7.0
int[] location = new int[2];
// 获取控件在屏幕的位置
anchor.getLocationOnScreen(location);
popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, location[1] + anchor.getHeight());
}
}
然后我那个开心啊,然后我就告诉其他人popwindow 在7.0 (SDK=24)适配的问题,然后所有popwindow都这么更改了。
尴尬的是7.1 (SDK=25)上又复现了这个问题,显示异常。
最终解决方案
if (Build.VERSION.SDK_INT < 24) {
mPopupWindow = new FixedPopupWindow(popView, ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
} else {
int[] location = new int[2];
// 获取控件在屏幕的位置
anchor.getLocationOnScreen(location);
int screenHeight = getScreenHeightPixels(context);
mPopupWindow = new PopupWindow(popView, ViewGroup.LayoutParams.MATCH_PARENT,
screenHeight - (location[1] + anchor.getHeight()));
}
在初始化的时候通过动态设置高度来完成显示效果。此时我们直接调用显示就行了。
mPopupWindow.showAsDropDown(anchor);
小思考
当项目中公用PopupWindow的时候,你一定想着封装一次,毕竟PopupWindow的初始化也是一个体力活。于是,可以将这种适配方案直接在showAsDropDown()方法中实现。
import android.graphics.Rect;
import android.os.Build;
import android.view.View;
import android.widget.PopupWindow;
/**
* Created by smart on 2018/5/15.
*/
public class FixedPopupWindow extends PopupWindow {
public FixedPopupWindow(View contentView, int width, int height){
super(contentView, width, height);
}
.....
@Override
public void showAsDropDown(View anchor) {
if (Build.VERSION.SDK_INT >= 24) {
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);// 以屏幕 左上角 为参考系的
int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom; //屏幕高度减去 anchor 的 bottom
setHeight(h);// 重新设置PopupWindow高度
}
super.showAsDropDown(anchor);
}
...
}
与上面那种方案比较
两种不同的计算高度的方法
都是通过设置PopupWindow的高度实现
这种封装可以简化重用代码
来源:https://www.jianshu.com/p/df010d92f646


猜你喜欢
- Java基础编写猜数游戏,供大家参考,具体内容如下设计内容及要求产生一个100以内的随机数,游戏者进行猜数,猜中即胜,猜不中,提示是大了还是
- Bean:在Spring技术中是基于组件的最基本了是最常用的单元其实实例保存在Spring的容器当中Bean通常被定义在配置文件当中,Bea
- spring mvc @PathVariable / 带斜杠方式获取遇上这个问题,百度google了一下,抄袭里面的内容,可以实现,在此备忘
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.算法的衡量标准当我们需要衡量一个算法的的优越性, 通常会
- 什么原因使我们不得不使用线程池?个人认为主要原因是:短时间内需要处理的任务数量很多使用线程池的好处:1.减少在创建和销毁线程上所花的时间以及
- 目录1 创建 xml 动画文件2 加载使用3 聊一聊 AnimationDrawable3.1 使用 ViewTreeObserver3.2
- NO.1–注释在程序中,尤其是复杂的程序中,适当地加入注释可以增加程序的可读性,有利于程序的修改、调试和交流。注释的内容
- 今天一起学习下如何在Spring中进行异步编程。我们都知道,web服务器处理请求 request 的线程是从线程池中获取的,这也不难解释,因
- 搭建测试的数据库和表数据的SQL/* Navicat Premium Data TransferSource Server &
- 在网上看了比较多的关于Tab的教程,发现都很杂乱。比较多的用法是用TitlePagerTabStrip和ViewPaper。不过TitleP
- mybatis #{}无法自动添加引号传入string类型时,无法自动添加引号,导致SQL将值识别为列名,导致SQL失败解决使用map类型代
- 本文实例为大家分享了android通过usb读取U盘的具体代码,供大家参考,具体内容如下1.关联 compile ‘com.github.m
- 一.服务层package com.demo.websocket;import java.io.IOException;import java
- 前言:在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件
- 1、作用域1.1 作用域的作用作用域——scope通常来说,一段程序代码中所用到的名字并不总是有效/
- 摘要:其实两种方法归结起来看还是一种,都是利用Thread的构造器进行创建,区别就是一种是无参的,一种是有参的。一、继承Thread线程类:
- 1. 阐述对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法
- 这篇文章主要介绍了springboot redis分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 问题由来一个简单的需求,要求把和当前用户相关的数据置顶展示。这里,我用了一个简单的用户表来复现这个需求。很简单,查询语句后面加上:order
- 配置文件形式pom.xml<?xml version="1.0" encoding="UTF-8&quo