效果
点击控件,弹出窗口;再次点击控件,窗口消失;
点击按钮一,吐丝,窗口消失;
点击按钮二、三,吐丝,窗口不消失;
点击外部,窗口消失;
设置多一个布局 - - 窗口的布局
相关代码解释,在注释里有写
activity_main.xml
<TextView
android: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
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="按钮一"
android:id="@+id/bt_one"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="按钮二"
android:id="@+id/bt_two"/>
<Button
android: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() {
@Override
public void onClick(View v) {
//窗口
popWindow();
}
});
private PopupWindow mPopWindow;
private void popWindow() {
//利用 LayoutInflater获取 R.layout.activity_popwindow 对应的 View
View 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);
}
//点击按钮,吐丝
@Override
public 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv_popWindow);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popWindow();
}
});
}
private PopupWindow mPopWindow;
private void popWindow() {
//利用 LayoutInflater获取 R.layout.activity_popwindow 对应的 View
View 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);
}
@Override
public 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;
}
}
}