popwindows类似DIlog,但是比dilog,更容易控制位置,所以很多时候,我们会优先使用popwindows,

Android的对话框有两种:PopupWindow和AlertDialog。它们的不同点在于:
AlertDialog的位置固定,而PopupWindow的位置可以随意
AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下

showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移

然后写了个小demo,记录一下

首先看一下效果图,hello worid作为锚点(也就是父控件)

代码很简单,我直接写在注释里面

这是mainactivity

package com.anlaiye.swt.selectcity;import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.TextView;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button topbutton;private Button bottombutton;private Button controlbutton;private TextView textView;//已这个view作为指定的viewprivate PopupWindow mPopupWindow;private View typeview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);topbutton = (Button) findViewById(R.id.top);bottombutton = (Button) findViewById(R.id.bottom);controlbutton = (Button) findViewById(R.id.control);textView = (TextView) findViewById(R.id.text);topbutton.setOnClickListener(this);bottombutton.setOnClickListener(this);controlbutton.setOnClickListener(this);typeview = LayoutInflater.from(getApplicationContext()).inflate(R.layout.pop, null);//实例化一个view给popwindows用mPopupWindow = new PopupWindow(typeview, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);//设置popwindows的内容view,它的宽度,高度,mPopupWindow.setTouchable(true);//可以触摸mPopupWindow.setOutsideTouchable(true);//设置popwindow如果点击外面区域,便关闭。mPopupWindow.getContentView().setFocusableInTouchMode(true);//允许使用键盘模式mPopupWindow.getContentView().setFocusable(true);//获取popwindow焦点mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));//这句加上之后,点击背景才能去掉popwindows}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.top:mPopupWindow.showAtLocation(textView, Gravity.TOP, 0, 250);    //设置popwindow显示位置break;case R.id.bottom:mPopupWindow.showAsDropDown(textView);break;case R.id.control:mPopupWindow.showAsDropDown(textView, 0, -50);break;}}
}

这是布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.anlaiye.swt.selectcity.MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="right"android:orientation="vertical"><Buttonandroid:id="@+id/top"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="向上打开" /><Buttonandroid:id="@+id/bottom"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="向下打开" /><Buttonandroid:id="@+id/control"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="指定控件" /></LinearLayout><TextViewandroid:id="@+id/text"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="Hello World!" />
</LinearLayout>

这是popwindows的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"tools:background="@color/blue"><ImageViewandroid:layout_width="21dp"android:layout_height="7dp"android:layout_gravity="right"android:layout_marginRight="35dp"android:src="@drawable/pop_up"tools:layout_marginTop="8.9dp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="25dp"android:layout_marginRight="25dp"android:background="@color/white"android:orientation="horizontal"android:paddingBottom="13dp"android:paddingRight="16dp"android:paddingTop="13dp"><ImageViewandroid:layout_width="19dp"android:layout_height="20dp"android:layout_marginLeft="17dp"android:src="@drawable/notice" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="8.9dp"android:text="我是通知,年底抢票,我是通知,年底抢票咯咯~~~~~~~"android:textColor="#FF333333"android:textSize="13sp" /></LinearLayout></LinearLayout>

大致代码就是这样,用起来还是很方便的

popwindows小研究相关推荐

  1. QQ抢车位外挂(起始篇)--小研究成果展示

    经过几天的研究,把QQ抢车位的小外挂攻克下来了,哼哼,以后玩这个游戏再也不用进去,1辆车1辆车的换了. 研究证明,QQ对于安全方面做的还是比较好的,不像开心网(http://www.kaixin001 ...

  2. 安卓app 获取view的id_隐私保护问题不小 研究表示1325个安卓APP未经授权获取用户数据...

    在今年苹果的WWDC大会上,苹果大谈保护用户的隐私,并暗怼了自己的竞争对手安卓系统在用户隐私保护方面不如苹果.那么安卓操作系统在隐私保护方面真的有问题吗? 由于国内的安卓操作系统没有谷歌的监管,因此在 ...

  3. gerrit refs相关的一些小研究

    gerrit 作为 code review使用不算难,然鹅,总有一些内容知其然不知其所以然,这里稍作研究和记录. 1. refs/for 和 refs/heads 向gerrit服务器提交代码命令: ...

  4. Android service 小研究

    最近同学搞起了Android开发,自己也捡起来这个玩意来看看.这里先研究一下service Service是安卓系统提供的四种组件之一,功能与activity类似,只不过没有activity 的使用频 ...

  5. RGB颜色规律小研究

    RGB 分别代表 red green blue 000000 表示什么颜色都没有,黑色 FF0000 红色 00FF00 绿色 0000FF 蓝色 就从单色来看,这个值越大这个颜色越亮(越红),这个值 ...

  6. python解三元一次方程组_关于实现求解三元一次方程组的小程序的一点小研究

    引入 在今年的暑假,作者利用空闲时间阅读了gilbert strange的introduction to linear algebra.作为享誉国际学界多年的MIT教材,该书以高斯消元法求解二三元方程 ...

  7. 关于 MTK 双卡 开启/关闭 移动数据 的一些小研究

    最近在研究MTK双卡手机,4.1的系统.要在程序里控制移动数据的开关,碰到难题了.因为发现,以前用反射的方法调用ConnectivityManager 类的setMobileDataEnabled方法 ...

  8. css3遮盖,关于css3的阴影遮盖问题的小研究

    今日在写一个阴影效果的时候遇到了一个小问题,不多说,上代码 div { width: 100px; height: 100px; background: #e3e3e3; border: 1px so ...

  9. 关于地图轨迹回放的一点小研究

    大家在做交通相关业务时,不可避免的要用到轨迹回放的相关功能,即根据一段时间内的GPS轨迹点来绘制车辆行驶的轨迹,下面结合自己做所项目相关业务以及自己的相关总结,说说轨迹回放相关功能实现. setTim ...

最新文章

  1. 新站长更要努力做好SEO相关的优化
  2. NDC 2010视频下载:看看其他微软平台程序员们都在做什么
  3. 防火墙术语详解(一)
  4. coredump 断点_coredump调试的使用
  5. java web轻量级开发面试教程内容精粹:哪些简历得不到面试机会
  6. 揭秘python的5种最佳调试方法_揭秘 IPython 的 5 种最佳调试方法-阿里云开发者社区...
  7. (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
  8. ArrayList的remove方法(重写equals方法) 与LinkedList的常用操作
  9. 【笔记】LR配置ODBC连接数据库进行参数化(mysql )未完待续
  10. 2021-06-25 WebStorm的设置代码tab宽度等
  11. python 菜鸟-Python 元组
  12. [原创]spring及springmvc精简版--继承数据源,声明式事物
  13. 迅通雾霾处理技术为清晰都市保驾护航
  14. MJKDZ PS2手柄控制OskarBot小车(二):硬件连接与通信时序
  15. css入门1 css简介
  16. html5动态连线,canvas简单连线动画的实现代码
  17. Java POI:如何读取Excel单元格值而不是计算公式
  18. 免费的多功能视频格式转换工具XMedia Recode
  19. 饿了么联盟在哪里申请物料
  20. 计算机主机核心通常包括,2017年计算机一级复习试题及答案解析

热门文章

  1. 创建Google play开发者账号,并验证身份通过
  2. 1.2计算机基础:比特和字节
  3. matlab自带函数缺少,matlab函数库缺失 我的matlab的自带的函数库貌似都没有了
  4. Node.js 学习笔记day005
  5. 14家企业巅峰之战!2021中国移动智慧家庭创客马拉松大赛决赛即将开启
  6. 【转】漫谈北斗:“星间链路”到底是条什么路?
  7. WorkFlow .Net 流程引擎
  8. c语言串口不能发送0d,串口调试 0D 0A 问题
  9. Hystrix (一)降级
  10. 玩我的世界用java还是_我的世界Java版游玩前需要登录 用什么登录?