2 可以通过计算popwindow的位置和屏幕边缘的距离,然后根据需要调整popwindow的偏移值,以确保不会超出屏幕。
3 可以通过设置popwindow的Gravity属性和偏移量,以及给popwindow的父布局设置clipChildren属性为false,来避免popwindow的偏移部分超出屏幕。
另外,还可以考虑使用PopupWindow的d出框箭头指向屏幕中心的方式,来确保popwindow可以在屏幕内完全显示。
1.基本属性方法
2.在d窗出现后让背景变暗,并在d窗消失后让背景还原
3.添加动画
自定义一个动画
添加动画
只有同时设置PopupWindow的背景和可以响应外部点击事件,它才能“真正”响应外部点击事件。也就是说,当你点击PopupWindow的外部或者按下“Back”键时,PopupWindow才会消失。
1.在popwindow中嵌套viewpager时候,关于定位问题:首先保证viewpager类是同一个,就是没有新new一个类。然后在show的时候记得setCurrentItem()一下就好了。
Android PopupWindow使用方法小结
Android中文API——PopupWindow
喵印~~
最近项目中接触到接口回调,以及Androidd窗PopWindow组件的使用,现在利用学到的知识自己写了一个简单的Demo,练习下在Android下如何运用接口回调,来实现d窗PopWindow的功能。
1. 定义一个接口:OnSelectItemListener。定义一个方法 void selectItem(String name, int type),作为点击d窗的每个Item的回调接口。
2. 自定义d窗类:MyPopupWindow,其布局文件为popup_window.xml。当在MainActivity调用其构造函数创建对象时,同时执行initPopupWindow()函数,给每个Item设置监听器,监听点击Item时,回调接口函数selectItem("Pop Window A", POP_WINDOW_ITEM_1),该函数在MainActivity中实现。
3. 主Activity: MainActivity。其布局文件为一个Button和一个TextView。监听Button,每当点击则d出PopWindow,呈现三个Item。调用MyPopupWindow类中的方法setOnSelectItemListener(OnSelectItemListener listener),传入OnSelectItemListener 对象作为参数,同时实现回调接口OnSelectItemListener的方法void selectItem(String name, int type)。
主Activity: MainActivity. Java
[java] view plain copy
packagecom.lambdroid.callbacktest2
importandroid.app.Activity
importandroid.content.Context
importandroid.os.Bundle
importandroid.view.View
importandroid.widget.Button
importandroid.widget.TextView
importandroid.widget.Toast
//联系接口的回调以及PopWindowd窗的简单使用
publicclassMainActivityextendsActivity {
privateMyPopupWindow myPopupWindow
privateButton btn_pop_window
privateTextView tv_display
protectedContext context
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
context =this
btn_pop_window = (Button) findViewById(R.id.btn_pop_window)
tv_display = (TextView) findViewById(R.id.tv_display)
//给Button设置事件监听:d出d窗
btn_pop_window.setOnClickListener(newView.OnClickListener() {
@Override
publicvoidonClick(View v) {
myPopupWindow.show(btn_pop_window)
}
})
myPopupWindow =newMyPopupWindow(context)
//实现OnSelectItemListener接口的selectItem方法:对于d窗三个Item的事件监听
myPopupWindow.setOnSelectItemListener(newOnSelectItemListener() {
@Override
publicvoidselectItem(String name,inttype) {
//点击电站列表,d出d框
if(myPopupWindow !=null&& myPopupWindow.isShowing()) {
myPopupWindow.dismiss()
}
tv_display.setText(name)
switch(type){
caseMyPopupWindow.POP_WINDOW_ITEM_1:
Toast.makeText(context,"我是d窗A, 我的英文名是"+ name, Toast.LENGTH_SHORT).show()
break
caseMyPopupWindow.POP_WINDOW_ITEM_2:
Toast.makeText(context,"我是d窗B, 我的英文名是"+ name, Toast.LENGTH_SHORT).show()
break
caseMyPopupWindow.POP_WINDOW_ITEM_3:
Toast.makeText(context,"我是d窗C, 我的英文名是"+ name, Toast.LENGTH_SHORT).show()
break
default:
break
}
}
})
}
}
activity_main.xml
[html] view plain copy
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/btn_pop_window"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="20dp"
android:padding="20dp"
android:text="Pop Window"
android:textSize="20sp"/>
android:id="@+id/tv_display"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="Hello World!"
android:textSize="30sp"/>
自定义d窗类:MyPopupWindow.java
[java] view plain copy
packagecom.lambdroid.callbacktest2
importandroid.app.ActionBar
importandroid.content.Context
importandroid.graphics.drawable.ColorDrawable
importandroid.view.LayoutInflater
importandroid.view.View
importandroid.widget.LinearLayout
importandroid.widget.PopupWindow
publicclassMyPopupWindowimplementsView.OnClickListener{
privatePopupWindow mPopWindow
privateContext mContext
privateLinearLayout llPop1
privateLinearLayout llPop2
privateLinearLayout llPop3
privateintpw_height
publicstaticfinalintPOP_WINDOW_ITEM_1 =1
publicstaticfinalintPOP_WINDOW_ITEM_2 =2
publicstaticfinalintPOP_WINDOW_ITEM_3 =3
privateOnSelectItemListener listener
publicvoidsetOnSelectItemListener(OnSelectItemListener listener){
this.listener = listener
}
publicMyPopupWindow(Context context){
mContext = context
initPopupWindow()//初始化d窗
}
publicvoidinitPopupWindow(){
View view = LayoutInflater.from(mContext).inflate(R.layout.popup_window,null)
mPopWindow =newPopupWindow(view, ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,true)
mPopWindow.setOutsideTouchable(true)
/** 为其设置背景,使得其内外焦点都可以获得 */
mPopWindow.setBackgroundDrawable(newColorDrawable())
mPopWindow.setFocusable(true)
pw_height = view.getHeight()
llPop1 = (LinearLayout) view.findViewById(R.id.ll_pop_1)
llPop1.setOnClickListener(this)
llPop2 = (LinearLayout) view.findViewById(R.id.ll_pop_2)
llPop2.setOnClickListener(this)
llPop3 = (LinearLayout) view.findViewById(R.id.ll_pop_3)
llPop3.setOnClickListener(this)
}
//监听三个d窗的点击事件
@Override
publicvoidonClick(View v) {
switch(v.getId()){
caseR.id.ll_pop_1:
if(listener !=null) {
listener.selectItem("Pop Window A", POP_WINDOW_ITEM_1)//回调接口
}
break
caseR.id.ll_pop_2:
if(listener !=null) {
listener.selectItem("Pop Window B", POP_WINDOW_ITEM_2)
}
break
caseR.id.ll_pop_3:
if(listener !=null) {
listener.selectItem("Pop Window C", POP_WINDOW_ITEM_1)
}
break
default:
break
}
}
//显示d窗,并设置d窗基于标题栏的显示位置
publicvoidshow(View view) {
//popupwindow相对view位置x轴偏移量
View viewTemp = mPopWindow.getContentView()
viewTemp.measure(0,0)
intwidth = viewTemp.getMeasuredWidth()
intxOffset = (view.getWidth() - width) /2
mPopWindow.showAsDropDown(view, xOffset,0)
}
/**
* 退出popupwindow
*/
publicvoiddismiss() {
if(mPopWindow !=null&& mPopWindow.isShowing()) {
mPopWindow.dismiss()
}
}
/**
* popupwindow是否正在显示
*/
publicbooleanisShowing() {
if(mPopWindow !=null) {
returnmPopWindow.isShowing()
}
returnfalse
}
}
popup_window.xml
[html] view plain copy
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
android:id="@+id/ll_alarm_type"
android:layout_width="120dp"
android:layout_height="130dp"
android:orientation="vertical"
android:background="@drawable/popupwindow"
android:paddingBottom="16dp"
android:paddingTop="16dp">
android:id="@+id/ll_pop_1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="5dp"
android:layout_gravity="center_horizontal"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="窗口 A"
android:textSize="15sp"
android:textColor="#ffffff"/>
android:id="@+id/ll_pop_2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="窗口 B"
android:textSize="15sp"
android:textColor="#ffffff"/>
android:id="@+id/ll_pop_3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="窗口 C"
android:textSize="15sp"
android:textColor="#FFFFFF"/>
回调接口:OnSelectItemListener
[java] view plain copy
packagecom.lambdroid.callbacktest2
publicinterfaceOnSelectItemListener {
voidselectItem(String name,inttype)
}
点击Button,d出d窗,显示三个Item
点击第二个Item,通过回调函数,来实现TextView内容的修改,以及d出Toast
总结
Java回调情形涉及很多,本文属于接口的异步回调:当不知道何时会执行接口的回调函数,(通过接口回调来对获取到的资源的 *** 作)。除此还有线程间的异步回调(子线程进行耗时 *** 作, *** 作完毕通知主线程或将数据传给主线程处理),以及利用接口回调来实现线程间的数据通信等等(Android可以利用Handler来实现)。等下次再举例说明Java回调函数的其它情形。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)