7.19. PopupWindow(弹出窗口组件)
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等),可以设置偏移或无偏移
示例:
配置:activity_popup_window.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout
扫描二维码关注公众号,回复:
5832880 查看本文章
xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/statusinfo" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="当前用户状态:在线" /> <Button android:id="@+id/popbut" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="状态" /> </LinearLayout> |
定制的布局文件popupwindow.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/popinfo" android:text="请选择您的当前状态:" android:layout_width="wrap_content" android:textSize="20px" android:layout_height="wrap_content"/> <RadioGroup android:id="@+id/changestatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:checkedButton="@+id/online"> <RadioButton android:id="@+id/online" android:text="在线"/> <RadioButton android:id="@+id/offline" android:text="离线"/> <RadioButton android:id="@+id/stealth" android:text="隐身"/> </RadioGroup> <Button android:id="@+id/cancel" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="取消" /> </LinearLayout> |
Activity:
package com.makyan.demo; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.PopupWindow; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.TextView; public class PopupWindowActivity extends Activity { private Button popbut = null; // 按钮组件 private RadioGroup changestatus = null; // 单选钮组件 private TextView statusinfo = null; // 文本显示组件 private Button cancel = null; // 按钮组件 private PopupWindow popWin = null; // 弹出窗口 private View popView = null; // 保存弹出窗口布局 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_popup_window); // 设置布局管理器 popbut = (Button) super.findViewById(R.id.popbut); // 取得组件 statusinfo = (TextView) super.findViewById(R.id.statusinfo); // 取得组件 popbut.setOnClickListener(new OnClickListenerImpl()); // 设置单击事件 } private class OnClickListenerImpl implements OnClickListener { // 设置监听 @Override public void onClick(View view) { LayoutInflater inflater = LayoutInflater.from(PopupWindowActivity.this);// 取得LayoutInflater对象 popView = inflater.inflate(R.layout.popwindow, null);// 读取布局管理器 popWin = new PopupWindow(popView, 300, 220,true);// 实例化PopupWindow changestatus = (RadioGroup) popView.findViewById(R.id.changestatus); // 取得组件 cancel = (Button) popView.findViewById(R.id.cancel); // 取得组件 changestatus.setOnCheckedChangeListener(new OnCheckedChangeListenerImpl()); // 设置监听 cancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { popWin.dismiss(); // 关闭弹出窗口 } }); popWin.showAtLocation(popbut,Gravity.CENTER, 0, 0); // 显示弹出窗口 } } private class OnCheckedChangeListenerImpl implements OnCheckedChangeListener { // 选项选中时触发 @Override public void onCheckedChanged(RadioGroup group, int checkedId) { RadioButton but = (RadioButton)popView.findViewById(group.getCheckedRadioButtonId()); // 取得选中组件 statusinfo.setText("当前用户状态:"+ but.getText().toString()); // 设置文本 popWin.dismiss(); // 关闭弹出窗口 } } } |