PopUpWindow 使⽤详解(⼀)——基本使⽤
本来想写⼀篇关于PopUpWindow的⽂章,但在学习过程中发现启舰⼤佬写的特别好。⾃认写不出这么通俗易懂的⽂章,看来⾃⼰和真正的⼤神还是有很⼤差距的。特意转载到此,以激励⾃⼰奋⼒前⾏,不忘初⼼。
相关⽂章:
1、《PopUpWindow使⽤详解(⼀)——基本使⽤》
2、
先看⼀下我们要做的效果:
这个效果很容易理解:当点击btn时,在底部弹出PopupWindow,然后点击各个item弹出对应toast。
⼀、概述
1、PopupWindow 与AlertDialog 的区别
最关键的区别是AlertDialog不能指定显⽰位置,只能默认显⽰在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。⽽PopupWindow是可以指定显⽰位置的,随便哪个位置都可以,更加灵活。
有关Dialog的相关知识,⼤家可以参考⼤佬的系列博客:
2、PopupWindow 的相关函数
(1)、构造函数:
⾸要注意:看这⾥有四个构造函数,但要⽣成⼀个PopupWindow最基本的三个条件是⼀定要设置的:View contentView,int width, int height ;少任意⼀个就不可能弹出来PopupWindow 所以,如果使⽤⽅法⼀来构造PopupWindow,那完整的构造代码应该是这样的:
//⽅法⼀:
public  PopupWindow  (Context context)
//⽅法⼆:
public  PopupWindow (View contentView)
//⽅法三:
public  PopupWindow (View contentView, int  width, int  height)
//⽅法四:
public  PopupWindow (View contentView, int  width, int  height, boolean  focusable)
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popuplayout, null);
PopupWindwo popWnd = PopupWindow (context);
popWnd.setContentView(contentView);
popWnd.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popWnd.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
有关为什么⼀定要设置width和height的原因,我们后⾯会讲,这⾥说⼀下为什么样强制设置contentView;很简单的原因是因为PopupWindow没有默认布局,它不会像AlertDialog那样只setTitle,就能弹出来⼀个框。PopupWindow是没有默认布局的,它的布局只有通过我们⾃⼰设置才⾏。由于⽅法三中,含有了这三个必备条件,不⽤单独设置contentview或者width、height,所以构造⽅法三是⽤的最多的⼀个构造⽅法。
最后,⽅法四中的focusable变量不是必须的,有关它的⽅法和意义,我们会在下⼀篇中细讲。
(2)显⽰函数
显⽰函数主要使⽤下⾯三个:
//相对某个控件的位置(正左下⽅),⽆偏移
showAsDropDown(View anchor):
//相对某个控件的位置,有偏移;xoff表⽰x轴的偏移,正值表⽰向右,负值表⽰向左;yoff表⽰相对y轴的偏移,正值是向下,负值是向上;
showAsDropDown(View anchor, int xoff, int yoff):
//相对于⽗控件的位置(例如正中央Gravity.CENTER,下⽅Gravity.BOTTOM等),可以设置偏移或⽆偏移
showAtLocation(View parent, int gravity, int x, int y):
这⾥有两种显⽰⽅式:
1、显⽰在某个指定控件的下⽅
showAsDropDown(View anchor):
showAsDropDown(View anchor, int xoff, int yoff);
2、指定⽗视图,显⽰在⽗控件的某个位置(Gravity.TOP,Gravity.RIGHT等)
showAtLocation(View parent, int gravity, int x, int y);
(3)、其它函数
public void dismiss()
//另外⼏个函数,这⾥不讲其意义,下篇细讲
public void setFocusable(boolean focusable)
public void setTouchable(boolean touchable)
public void setOutsideTouchable(boolean touchable)
public void setBackgroundDrawable(Drawable background)
这⼏个函数⾥,这篇只会⽤到dismiss(),⽤于不需要的时候,将窗体隐藏掉。
好了,废话不多说了,我们就做⼀个上⾯的例⼦来看⼀下。
⼆、简单⽰例(showAtLocation显⽰窗体)
在这个例⼦中,我们实现两个功能,弹出popupWindow和Item点击响应
1、主布局(l)
从效果图中也可以看到主布局只有⼀个button,什么都没有,所以它的布局代码哪下:
<LinearLayout xmlns:android="schemas.android/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="show popWindow"/>
</LinearLayout>
2、PopupWindow布局(l )
在概述中,我们提到了,必须为PopupWindow设置布局,从效果图中,我也可以看到它的布局有三个i
tem,中间⽤横线分开。所以这⾥布局使⽤Listview应该更合适,但为了减轻代码难度,我们直接使⽤TextView和分隔线来代替,代码如下:
<LinearLayout
xmlns:android="schemas.android/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:orientation="vertical"
android:paddingBottom="2dp">
<View
android:layout_width="match_parent"
android:layout_height="2.25dp"
android:background="#fa7829"
android:layout_alignParentTop="true"/>
<TextView
android:id="@+id/pop_computer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="计算机"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@drawable/list_line"/>
<TextView
android:id="@+id/pop_financial"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="⾦融"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@drawable/list_line"/>
<TextView
android:id="@+id/pop_manage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="管理"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"/>
</LinearLayout>
3、MainActivity代码
先贴出来完整代码,然后再逐步讲解:
public class MainActivity extends Activity implements View.OnClickListener{
private PopupWindow mPopWindow;
alertdialog使用方法
@Override
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPopupWindow();
}
});
}
private void showPopupWindow() {
//设置contentView
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.popuplayout, null);
mPopWindow = new PopupWindow(contentView,
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
mPopWindow.setContentView(contentView);
//设置各个控件的点击响应
TextView tv1 = (TextView)contentView.findViewById(R.id.pop_computer);
TextView tv2 = (TextView)contentView.findViewById(R.id.pop_financial);
TextView tv3 = (TextView)contentView.findViewById(R.id.pop_manage);
tv1.setOnClickListener(this);
tv2.setOnClickListener(this);
tv3.setOnClickListener(this);
//显⽰PopupWindow
View rootview = LayoutInflater.from(MainActivity.this).inflate(R.layout.main, null);
mPopWindow.showAtLocation(rootview, Gravity.BOTTOM, 0, 0);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id){
case R.id.pop_computer:{
Toast.makeText(this,"clicked computer",Toast.LENGTH_SHORT).show();
mPopWindow.dismiss();
}
break;
case R.id.pop_financial:{
Toast.makeText(this,"clicked financial",Toast.LENGTH_SHORT).show();
mPopWindow.dismiss();
}
break;
case R.id.pop_manage:{
Toast.makeText(this,"clicked manage",Toast.LENGTH_SHORT).show();
mPopWindow.dismiss();
}
break;
}
}
}
(1)⾸先看OnCreate()
在OnCreate()中只做了⼀个操作,当点击Button时,显⽰窗体:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。