popwindows類似DIlog,但是比dilog,更容易控制位置,所以很多時候,我們會優先使用popwindows,
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等),可以設置偏移或無偏移
然後寫了個小demo,記錄一下
首先看一下效果圖,hello worid作爲錨點(也就是父控件)
代碼很簡單,我直接寫在註釋裏面
這是mainactivity
package com.anlaiye.swt.selectcity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button topbutton;
private Button bottombutton;
private Button controlbutton;
private TextView textView;//已這個view作爲指定的view
private PopupWindow mPopupWindow;
private View typeview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
topbutton = (Button) findViewById(R.id.top);
bottombutton = (Button) findViewById(R.id.bottom);
controlbutton = (Button) findViewById(R.id.control);
textView = (TextView) findViewById(R.id.text);
topbutton.setOnClickListener(this);
bottombutton.setOnClickListener(this);
controlbutton.setOnClickListener(this);
typeview = LayoutInflater.from(getApplicationContext()).inflate(R.layout.pop, null);//實例化一個view給popwindows用
mPopupWindow = new PopupWindow(typeview, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);//設置popwindows的內容view,它的寬度,高度,
mPopupWindow.setTouchable(true);//可以觸摸
mPopupWindow.setOutsideTouchable(true);//設置popwindow如果點擊外面區域,便關閉。
mPopupWindow.getContentView().setFocusableInTouchMode(true);//允許使用鍵盤模式
mPopupWindow.getContentView().setFocusable(true);//獲取popwindow焦點
mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));//這句加上之後,點擊背景才能去掉popwindows
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.top:
mPopupWindow.showAtLocation(textView, Gravity.TOP, 0, 250); //設置popwindow顯示位置
break;
case R.id.bottom:
mPopupWindow.showAsDropDown(textView);
break;
case R.id.control:
mPopupWindow.showAsDropDown(textView, 0, -50);
break;
}
}
}
這是佈局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.anlaiye.swt.selectcity.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:orientation="vertical">
<Button
android:id="@+id/top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="向上打開" />
<Button
android:id="@+id/bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="向下打開" />
<Button
android:id="@+id/control"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="指定控件" />
</LinearLayout>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Hello World!" />
</LinearLayout>
這是popwindows的佈局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:background="@color/blue">
<ImageView
android:layout_width="21dp"
android:layout_height="7dp"
android:layout_gravity="right"
android:layout_marginRight="35dp"
android:src="@drawable/pop_up"
tools:layout_marginTop="8.9dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:layout_marginRight="25dp"
android:background="@color/white"
android:orientation="horizontal"
android:paddingBottom="13dp"
android:paddingRight="16dp"
android:paddingTop="13dp">
<ImageView
android:layout_width="19dp"
android:layout_height="20dp"
android:layout_marginLeft="17dp"
android:src="@drawable/notice" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8.9dp"
android:text="我是通知,年底搶票,我是通知,年底搶票咯咯~~~~~~~"
android:textColor="#FF333333"
android:textSize="13sp" />
</LinearLayout>
</LinearLayout>
大致代碼就是這樣,用起來還是很方便的