Android详细教程(基础篇):二十三、View组件高级篇: PopupWindow弹出窗口组件详解

版权声明:本文为博主原创文章,转载请注明出处。作者:杨雄进 https://blog.csdn.net/makyan/article/details/89173433

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();              // 关闭弹出窗口

                       }

            }

}

猜你喜欢

转载自blog.csdn.net/makyan/article/details/89173433