今天我们来了解一下Android中的弹窗之PopupWindow的使用:
如下图:当我们要点击右上角的菜单时弹出的弹窗:实现这个效果我们分三步:
1:首先新建一个弹窗的XML文件X.xml代码如下(R.layout.pop_diary_detail):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99444444"
android:fitsSystemWindows="true"
android:gravity="center|bottom"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="13dp"
app:cardElevation="0dp">
<LinearLayout
android:layout_width="340dp"
android:layout_height="wrap_content"
android:background="@color/white"
android:gravity="center"
android:orientation="vertical">
<!--如果不加这层布局那么就会报错-->
<LinearLayout
android:id="@+id/public_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/diary_change"
android:layout_width="match_parent"
android:layout_height="57dp"
android:gravity="center"
android:text="修改"
android:textColor="@color/takePhoto"
android:textSize="20sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/viewGrays" />
</LinearLayout>
<LinearLayout
android:id="@+id/secret_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/diary_delete"
android:layout_width="match_parent"
android:layout_height="57dp"
android:gravity="center"
android:text="删除"
android:textColor="@color/takePhoto"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
app:cardCornerRadius="13dp"
app:cardElevation="0dp">
<LinearLayout
android:id="@+id/diary_detail_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/diary_cancel"
android:layout_width="340dp"
android:layout_height="57dp"
android:gravity="center"
android:text="取消"
android:textColor="@color/takePhoto"
android:textSize="20sp" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>:
2:在我们需要的界面(或者Fragment中)添加如下代码:
(1)首先定义:
//弹窗设置
View popUp;
private PopupWindow popupWindow;
(2)然后定义我们的弹窗的点击事件(假设有个控件供我们点击):
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.diary_detail_more:
initPopUp();
break;
default:
break;
}
}
3:在我们的主类中或者(Fragment中)写如下代码:
/**
* 从这里开始加载弹框的
*/
private void initPopUp() {
//初始化弹窗
initAd();
//显示弹窗
showPopUp();
}
/**
* --------------弹窗显示-----------------
*/
private void showPopUp() {
if (popupWindow.isShowing()) {
popupWindow.dismiss();
}
//弹窗显示的位置
popupWindow.showAtLocation(popUp, Gravity.BOTTOM, 0, 0);
}
//初始化弹框
private void initAd() {
//加载我们写好的布局
popUp = getLayoutInflater().inflate(R.layout.pop_diary_detail, null);
popupWindow = new PopupWindow(popUp, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true);
popupWindow.setTouchInterceptor(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
//初始化我们的事件
initEvents();
}
private void initEvents() {
//点击取消按钮则者弹窗消失
popUp.findViewById(R.id.diary_detail_layout).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
}
});
//显示一个吐司
popUp.findViewById(R.id.diary_change).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(DiaryDetailActivity.this, "修改", Toast.LENGTH_SHORT).show();
popupWindow.dismiss();
}
});
//显示一个吐司
popUp.findViewById(R.id.diary_delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(DiaryDetailActivity.this, "删除", Toast.LENGTH_SHORT).show();
popupWindow.dismiss();
}
});
}
4:好了,大功告成!以后想用的时候就可以直接拿来用了!