2015/8/31-2

PopupWindow

PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的。

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等),可以设置偏移或无偏移

PopupWindow的使用

PopupWindow的构造函数为

public PopupWindow(View contentView, int width, int height, boolean focusable)

contentView为要显示的view,width和height为宽和高,值为像素值,也可以是MATCHT_PARENT和WRAP_CONTENT。

focusable为是否可以获得焦点,这是一个很重要的参数,也可以通过

public void setFocusable(boolean focusable)

来设置,如果focusable为false,在一个Activity弹出一个PopupWindow,按返回键,由于PopupWindow没有焦点,会直接退出Activity。如果focusable为true,PopupWindow弹出后,所有的触屏和物理按键都有PopupWindows处理。

mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

设置了上面的就可以点击外面返回了。

简单使用

mianLayout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<Button
    android:id="@+id/btn_test_popupwindow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="@string/app_name" />

</RelativeLayout>

popudWindow 的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#000000" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="80dp"
    android:text="wusisan"
    android:textColor="#ffffffff"
    android:layout_centerInParent="true"
    android:gravity="center"/>

</RelativeLayout>

mainActivity

package com.zsz.develop.popupwindowdemo;

import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

private Button mButton;
private PopupWindow mPopupWindow;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    View popupView = getLayoutInflater().inflate(R.layout.popup_window, null);

    mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT, true);
    mPopupWindow.setTouchable(true);
    mPopupWindow.setOutsideTouchable(true);
    mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

    mButton = (Button) findViewById(R.id.btn_test_popupwindow);
    mButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            mPopupWindow.showAsDropDown(v);
        }
    });
}


}

PopupWIndow的使用

View popupView= LayoutInflater.from(this).inflate(R.layout.popup_window_layout,null);
  mPopupWindow=new PopupWindow(popupView,200, RelativeLayout.LayoutParams.WRAP_CONTENT);
  mPopupWindow.setOutsideTouchable(true);
  mPopupWindow.setFocusable(true);
  mPopupWindow.setTouchable(true);
  mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

  lvPopupWindow= (ListView) popupView.findViewById(R.id.lvPopupWindow);
  for (int i=0;i<5;i++){
      titleItemData=new TitleItemData("快递箱"+i);
      titleItemDataList.add(titleItemData);
  }
  titleItemAdapter=new TitleItemAdapter(MyExpressActivity.this,titleItemDataList);
  lvPopupWindow.setAdapter(titleItemAdapter);