天天看点

Android组件09—悬浮框PopupWindow

悬浮框PopupWindow的功能和使用

  • Android的对话框有两种:PopupWindow和AlertDialog。
  • 不同之处

    1、AlertDialog的位置固定,而PopupWindow的位置可以随意

    2、AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的

PopupWindow的相关函数,及显示方法

1、 相关函数

//方法一:

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)

2、 悬浮框PopupWindow显示出来的方法

1、//相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor):
2、相对某个控件的位置,有偏移;xoff表示x轴的偏移,正值表示向左,负值表示向右;yoff表示相对y轴的偏移,正值是向下,负值是向上;
showAsDropDown(View anchor, int xoff, int yoff):
3、相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
showAtLocation(View parent, int gravity, int x, int y):

2、 悬浮框PopupWindow的显示方式还可以这么理解!

这里有两种显示方式:

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);

下面看看Pop是怎么使用的,使用PopupWindow创建对话框风格的窗口只要两步

先看效果:

Android组件09—悬浮框PopupWindow

1、调用PopupWindow的构造器创建PopupWindow对象。

2、调用PopupWindow的“显示方法”将PopupWindow作为V组件的下拉组件显示出来;或调用PopupWindow的showAsLocation方法将PopupWindow在指定位置显示出来。

  • (1)首先你必须布置一个Popup的相关xml布局,在你需要的界面引用此布局,
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#25000000">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="20dp"
        android:orientation="vertical">
    <Button
        android:id="@+id/close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="关闭"
    />

    <TextView
        android:id="@+id/tv_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="一个"
        android:gravity="center"
        android:textColor="#ffffff"
        android:background="#367451"
    />
    <TextView
        android:id="@+id/tv_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="二个"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:textColor="#ffffff"
        android:background="#367451"
        />
    </LinearLayout>
</RelativeLayout>
           
  • 上图布局效果
    Android组件09—悬浮框PopupWindow
  • (2) 代码中实现
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
    private View root;
    private PopupWindow popup;
    private Button button,close;
    private TextView tv_1,tv_2;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setView();
        setOnListener();

    }

     //点击其他部分也会关闭悬浮框的方法,大家认真看下就明白了
    private void setOnListener() {
        root.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
            //如果悬浮框不是空的,或者它是显出的状态,那就可以实现此监听
                if(popup!=null||popup.isShowing()){
                    popup.dismiss();
                }
                return false;
            }
        });
    }

    private void setView() {

        // 装载R.layout.popup对应的界面布局
        root = this.getLayoutInflater().inflate(R.layout.popup, null);
        // 创建PopupWindow对象
        popup = new PopupWindow(root, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true);
        button = (Button) findViewById(R.id.bn);

        //创建一个监听,并绑定popup显示的方式,
        button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                // 以下拉方式显示
                // popup.showAsDropDown(v);
                //将PopupWindow显示在指定位置
                popup.showAtLocation(findViewById(R.id.bn), Gravity.BOTTOM, , );
            }
        });


        //弹出框里面的控件监听,
        close =  (Button)root.findViewById(R.id.close);
        close.setOnClickListener(new OnClickListener(){
                    public void onClick(View v){
                        // 关闭PopupWindow
                        popup.dismiss(); // ①
                    }
                });

        tv_1 =  (TextView)root.findViewById(R.id.tv_1);
        tv_1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"你点击的是第一个",Toast.LENGTH_SHORT).show();
            }
        });
        tv_2 =  (TextView)root.findViewById(R.id.tv_2);
        tv_2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"你点击的是第二个",Toast.LENGTH_SHORT).show();
            }
        });
    }
}
           
  • (3)需要注意的
  • 引用Popup引用它里面的布局的时候一定要绑定他的布局文件,例如下面
// 装载R.layout.popup对应的界面布局
root = this.getLayoutInflater().inflate(R.layout.popup, null);

//他的含义就是,引用root布局中的tv_1空间
tv_1 =  (TextView)root.findViewById(R.id.tv_1);
           
  • 此代码添加了,空间之外区域也可关闭Popup布局
private void setOnListener() {
        root.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(popup!=null||popup.isShowing()){
                    popup.dismiss();
                }
                return false;
            }
        });
    }
           

好了,代码中有很详细的描述,就不废话了。大家需要注意的就是这三个显示方法,把我上面代码修改下面另外两种显示方式,看看效果!仔细研究就很容易理解了

、显示在某个指定控件的下方
showAsDropDown(View anchor):
showAsDropDown(View anchor, int xoff, int yoff);
>
、指定父视图,显示在父控件的某个位置(Gravity.TOP,Gravity.RIGHT等)
showAtLocation(View parent, int gravity, int x, int y); 
           

dome下载地址:http://download.csdn.net/detail/bobo8945510/9637801