点击的按钮:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:layout_centerInParent="true" android:id="@+id/btn_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示PopupWindow" /> </RelativeLayout>
item_popup.xml 要弹出的view
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/ic_launcher_background" android:orientation="vertical"> <Button android:id="@+id/btn_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:text="one" android:textSize="18sp" /> <Button android:id="@+id/btn_two" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:text="two" android:textSize="18sp" /> </LinearLayout>
在res下的anim文件夹创建动画anim_pop.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="2000"> </alpha> </set>
public class FragmentThree extends Fragment {
private Button btn_show;
private Context mContext;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragmentthree,container,false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mContext = getContext();
btn_show = (Button)getActivity().findViewById(R.id.btn_show);
btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initPopWindow(v);
}
});
}
private void initPopWindow(View v) {
//获取要弹出的view
View view = LayoutInflater.from(mContext).inflate(R.layout.item_popup, null, true);
Button btn_one = (Button) view.findViewById(R.id.btn_one);
Button btn_two = (Button) view.findViewById(R.id.btn_two);
//1.构造一个PopupWindow,四个参数依次是:加载的View,宽,高,点击选项外区域是否会消失选项(true消失,false不消失)
final PopupWindow popWindow = new PopupWindow(view,
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
popWindow.setAnimationStyle(R.anim.anim_pop); //设置加载动画
//这些为了点击非PopupWindow区域,PopupWindow会消失的,如果没有下面的
//代码的话,你会发现,当你把PopupWindow显示出来了,无论你按多少次后退键
//PopupWindow并不会关闭,而且退不出程序,加上下述代码可以解决这个问题
popWindow.setTouchable(true);
popWindow.setTouchInterceptor(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
// 这里如果返回true的话,touch事件将被拦截
// 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
}
});
popWindow.setBackgroundDrawable(new ColorDrawable(0x00000000)); //要为popWindow设置一个背景才有效
//设置popupWindow显示的位置,参数依次是参照View,x轴的偏移量,y轴的偏移量
popWindow.showAsDropDown(v, 50, 0);
//设置popupWindow里的按钮的事件
btn_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "你点击了one~", Toast.LENGTH_SHORT).show();
}
});
btn_two.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "你点击了two~", Toast.LENGTH_SHORT).show();
popWindow.dismiss();
}
});
}
}
在activity销毁时清除气泡:(因为气泡是显示在activity上的)
注意事项:popwindow 上加动画时,必须给popwindow加上background,否则动画不生效;