效果
点击控件,弹出窗口;再次点击控件,窗口消失;
点击按钮一,吐丝,窗口消失;
点击按钮二、三,吐丝,窗口不消失;
点击外部,窗口消失;
设置多一个布局 – – 窗口的布局
相关代码解释,在注释里有写
activity_main.xml
<TextViewandroid:layout_width=\"wrap_content\"android:layout_height=\"wrap_content\"android:textSize=\"25dp\"android:text=\"popWindow\"android:padding=\"10dp\"android:id=\"@+id/tv_popWindow\"/>
activity_popwindow.xml
<Buttonandroid:layout_width=\"match_parent\"android:layout_height=\"wrap_content\"android:padding=\"10dp\"android:text=\"按钮一\"android:id=\"@+id/bt_one\"/><Buttonandroid:layout_width=\"match_parent\"android:layout_height=\"wrap_content\"android:padding=\"10dp\"android:text=\"按钮二\"android:id=\"@+id/bt_two\"/><Buttonandroid:layout_width=\"match_parent\"android:layout_height=\"wrap_content\"android:padding=\"10dp\"android:text=\"按钮三\"android:id=\"@+id/bt_three\"/>
MainActivity.java
//控件,点击弹出窗口tv = findViewById(R.id.tv_popWindow);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//窗口popWindow();}});
private PopupWindow mPopWindow;private void popWindow() {//利用 LayoutInflater获取 R.layout.activity_popwindow 对应的 ViewView contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_popwindow, null);mPopWindow = new PopupWindow(contentView);/** 设置窗体的长和宽* 代码强制设置 PopupWindow的 Height、Width(否则无法显示出来)* popupWindow的宽和高, 以这里代码设置的为准* */mPopWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);mPopWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);//充满// mPopWindow.setWidth(ViewGroup.LayoutParams.FILL_PARENT);// mPopWindow.setHeight(ViewGroup.LayoutParams.FILL_PARENT);//设置动画所对应的style// mPopWindow.setAnimationStyle(R.style.contextMenuAnim);/** 外部点击, 隐藏窗体的功能(三种方法)* *///1. 设置再次点击控件的时候,关闭窗口,不重新打开mPopWindow.setFocusable(true);//2.// mPopWindow.setOutsideTouchable(true);//3.// ColorDrawable dw = new ColorDrawable(0x00000000);// mPopWindow.setBackgroundDrawable(dw);/** 设置窗体在控件的相对位置* */// 显示在某个控件的正左下方,无偏移mPopWindow.showAsDropDown(tv);// 相对某个控件的位置,有偏移,xoff为 X轴的偏移量,yoff为 Y轴的偏移量// mPopWindow.showAsDropDown(tv, 0, 0);//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移// mPopWindow.showAtLocation(tv, Gravity.BOTTOM, 10, 30);Button bt_one = contentView.findViewById(R.id.bt_one);bt_one.setOnClickListener(this);Button bt_two = contentView.findViewById(R.id.bt_two);bt_two.setOnClickListener(this);Button bt_three = contentView.findViewById(R.id.bt_three);bt_three.setOnClickListener(this);}
//点击按钮,吐丝@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.bt_one:Toast.makeText(this, \"你点击了按钮一\", Toast.LENGTH_SHORT).show();//窗体消失mPopWindow.dismiss();break;case R.id.bt_two:Toast.makeText(this, \"你点击了按钮二\", Toast.LENGTH_SHORT).show();break;case R.id.bt_three:Toast.makeText(this, \"你点击了按钮三\", Toast.LENGTH_SHORT).show();break;}}
完整代码(MainActivity.java)
public class MainActivity extends AppCompatActivity implements View.OnClickListener{TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = findViewById(R.id.tv_popWindow);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {popWindow();}});}private PopupWindow mPopWindow;private void popWindow() {//利用 LayoutInflater获取 R.layout.activity_popwindow 对应的 ViewView contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_popwindow, null);mPopWindow = new PopupWindow(contentView);/** 设置窗体的长和宽* 代码强制设置 PopupWindow的 Height、Width(否则无法显示出来)* popupWindow的宽和高, 以这里代码设置的为准* */mPopWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);mPopWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);//充满// mPopWindow.setWidth(ViewGroup.LayoutParams.FILL_PARENT);// mPopWindow.setHeight(ViewGroup.LayoutParams.FILL_PARENT);//设置动画所对应的style// mPopWindow.setAnimationStyle(R.style.contextMenuAnim);/** 外部点击, 隐藏窗体的功能(三种方法)* *///1. 设置再次点击控件的时候,关闭窗口,不重新打开mPopWindow.setFocusable(true);//2.// mPopWindow.setOutsideTouchable(true);//3.// ColorDrawable dw = new ColorDrawable(0x00000000);// mPopWindow.setBackgroundDrawable(dw);/** 设置窗体在控件的相对位置* */// 显示在某个控件的正左下方,无偏移mPopWindow.showAsDropDown(tv);// 相对某个控件的位置,有偏移,xoff为 X轴的偏移量,yoff为 Y轴的偏移量// mPopWindow.showAsDropDown(tv, 0, 0);//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移// mPopWindow.showAtLocation(tv, Gravity.BOTTOM, 10, 30);Button bt_one = contentView.findViewById(R.id.bt_one);bt_one.setOnClickListener(this);Button bt_two = contentView.findViewById(R.id.bt_two);bt_two.setOnClickListener(this);Button bt_three = contentView.findViewById(R.id.bt_three);bt_three.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.bt_one:Toast.makeText(this, \"你点击了按钮一\", Toast.LENGTH_SHORT).show();//窗体消失mPopWindow.dismiss();break;case R.id.bt_two:Toast.makeText(this, \"你点击了按钮二\", Toast.LENGTH_SHORT).show();break;case R.id.bt_three:Toast.makeText(this, \"你点击了按钮三\", Toast.LENGTH_SHORT).show();break;}}}
添加动画
Android – 简单动画