悬浮框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创建对话框风格的窗口只要两步
先看效果:
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>
- 上图布局效果
- (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);