1 PopupWindow & Dialog:
PopupWindow是一个阻塞式的弹出框(在我们退出这个弹出框之前,程序会一直等待),Dialog非阻塞式弹出框(后台还可以做其他事情)
2 PopupWindow使用步骤总结
Ⅰ 自定义PopupWindow布局文件,并获取获取其实例
Ⅱ 创建PopupWindow对象,定义相关属性
Ⅲ PopupWindow界面显示
Ⅳ 响应自定义布局的事件
布局文件(主):popupwindow_demo.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:paddingBottom="25dp" android:paddingTop="15dp" android:text="SkySeraph Android学习专题:PopupWindow" android:textColor="#FFFF00" android:textSize="15dp" android:id="@+id/popupwindow_demo_TV"> </TextView> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center"> <Button android:id="@+id/popupwindow_demo_btn01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="PopupWindow弹出对话框演示(动画)" > </Button> </LinearLayout> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#000000" android:orientation="vertical" > <TextView android:id="@+id/popupwindow_demo01_TVUsername" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:text="用户名" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/popupwindow_demo01_ETUername" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:capitalize="none" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/popupwindow_demo01_TVPassword" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:text="密码" android:textAppearance="?android:attr/textAppearanceMedium" /> <EditText android:id="@+id/popupwindow_demo01_ETPassword" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dip" android:layout_marginRight="20dip" android:capitalize="none" android:password="true" android:textAppearance="?android:attr/textAppearanceMedium" android:inputType="numberSigned"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" > <Button android:id="@+id/popupwindow_demo01_BtnOK" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="60" android:text="确定" > </Button> <Button android:id="@+id/popupwindow_demo01_BtnCancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="60" android:text="取消" > </Button> </LinearLayout> </LinearLayout>
java代码:popupwindow_demo.java
public class popupwindow_demo extends Activity { // ////////////////////////////////////////////////////////////////////////////// @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.popupwindow_demo); findViews(); } // ////////////////////////////////////////////////////////////////////////////// private void findViews() { Button btn1 = (Button) findViewById(R.id.popupwindow_demo_btn01); btn1.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub showPopupWindow1(popupwindow_demo.this, popupwindow_demo.this.findViewById(R.id.popupwindow_demo_btn01)); return; } }); } // ////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////// private void showPopupWindow1(Context context, View parent) { /////////////////////////////////////////////////////// // 【Ⅰ】 获取自定义popupWindow布局文件 //方式一: //LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //final View vPopupWindow = inflater.inflate(R.layout.popupwindow_demo01, null, false); //方式二: final View vPopupWindow = getLayoutInflater().inflate(R.layout.popupwindow_demo01, null,false); // 加载popupWindow的布局文件 vPopupWindow.setBackgroundColor(Color.GREEN); // 设置popupWindow的背景颜色 /////////////////////////////////////////////////////// // 【Ⅱ】 创建PopupWindow实例 final PopupWindow pw = new PopupWindow(vPopupWindow, 300, 300, true);// 声明一个弹出框 ,最后一个参数和setFocusable对应 pw.setContentView(vPopupWindow); // 为弹出框设定自定义的布局 //pw.setBackgroundDrawable(getResources().getDrawable(R.drawable.rounded_corners_pop));//设置整个popupwindow的样式。 pw.setAnimationStyle(R.style.AnimationPreview); // 设置动画效果 pw.setFocusable(true); //默认为false,如果不设置为true,PopupWindow里面是获取不到焦点的,那么如果PopupWindow里面有输入框等的话就无法输入。 // ///////////////////////////////////////////////////// // 【Ⅲ】 显示popupWindow对话框 // 获取屏幕和对话框各自高宽 int screenWidth, screenHeight, dialgoWidth, dialgoheight; screenWidth = popupwindow_demo.this.getWindowManager().getDefaultDisplay().getWidth(); screenHeight = popupwindow_demo.this.getWindowManager().getDefaultDisplay().getHeight(); dialgoWidth = pw.getWidth(); dialgoheight = pw.getHeight(); // pw.showAsDropDown(parent); //以自己为Anchor,不偏移 // pw.showAsDropDown(parent, (screenWidth-dialgoWidth)/2, 0);//以自己为Anchor,偏移(screenWidth-dialgoWidth)/2, 0)--按钮正下方 pw.showAtLocation(parent, Gravity.CENTER, 0, 0);// 以屏幕中心为参照,不偏移 // pw.showAtLocation(parent, Gravity.BOTTOM, 0, 0);//以屏幕左下角为参照 /* 注释: * 【showAsDropDown & showAtLocation】 * showAsDropDown(View anchor)相对某个控件的位置(正左下方),无偏移 * showAsDropDown(View anchor, int xoff, intyoff) 相对某个控件的位置,有偏移(正数表示下方右边,负数表示(上方左边)) * showAtLocation(View parent,int gravity, int x, int y) gravity依靠父布局的位置如Gravity.CENTER x y 坐标值 */ /////////////////////////////////////////////////////// // 【Ⅳ】自定义布局中的事件响应 // OK按钮及其处理事件 Button btnOK = (Button) vPopupWindow.findViewById(R.id.popupwindow_demo01_BtnOK); btnOK.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TextView textView = (TextView)findViewById(R.id.popupwindow_demo_TV); EditText edtUsername = (EditText) vPopupWindow.findViewById(R.id.popupwindow_demo01_ETUername); edtUsername.setHint("请输入您的用户名!"); edtUsername.setInputType(InputType.TYPE_TEXT_FLAG_AUTO_CORRECT); edtUsername.setInputType(InputType.TYPE_NULL); //不显示软键盘 EditText edtPassword = (EditText) vPopupWindow.findViewById(R.id.popupwindow_demo01_ETPassword); edtPassword.setHint("请输入您的密码!"); textView.setText("你输入的用户名是:" + edtUsername.getText().toString() + "\n" +"你输入的密码是:"+edtPassword.getText().toString()); pw.dismiss();// 关闭 } }); // Cancel按钮及其处理事件 Button btnCancel = (Button) vPopupWindow.findViewById(R.id.popupwindow_demo01_BtnCancel); btnCancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { pw.dismiss();// 关闭 } }); } }
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android"> <!-- popupwindow_demo 中动画文件 --> <style name="AnimationPreview"> <item name="android:windowEnterAnimation">@anim/fade_in</item> <item name="android:windowExitAnimation">@anim/fade_out</item> </style> </resources>
<set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="700" android:fillAfter="false" android:fromXScale="0.0" android:fromYScale="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" /> </set>
fade_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" > <scale android:duration="700" android:fillAfter="false" android:fromXScale="1.0" android:fromYScale="1.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50%" android:pivotY="50%" android:toXScale="0.0" android:toYScale="0.0" /> </set>