下面是“Android自定义PopupWindow简单小例子”的完整攻略:
1. 什么是PopupWindow
PopupWindow是Android提供的一种UI组件,可以以浮层的方式展示一些内容,常见于下拉菜单、筛选框等场景。
2. 如何实现自定义PopupWindow
实现自定义的PopupWindow需要经过以下几个步骤:
2.1 创建自定义布局
首先,我们需要通过XML或者Java代码创建一个自定义布局,这个布局就是PopupWindow中展示的内容。可以使用任何Android支持的布局控件,如LinearLayout、RelativeLayout等。
例如,我们创建一个简单的布局文件popup_window_layout.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white">
<Button
android:id="@+id/btn_pop_close"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Close PopupWindow" />
</LinearLayout>
这里我们使用了一个LinearLayout和一个Button控件,其中LinearLayout是根布局,Button是用于关闭PopupWindow的按钮。
2.2 创建PopupWindow对象
创建PopupWindow对象可以使用PopupWindow类提供的构造方法,常用的构造方法有三个:
PopupWindow(View contentView)
PopupWindow(View contentView, int width, int height)
PopupWindow(int width, int height)
其中,第一个构造方法只需要传入一个View对象,该View对象就是我们上一步中创建的自定义布局,其他两个构造方法还需要传入PopupWindow的宽度和高度。
例如,我们在MainActivity中创建一个PopupWindow对象mPopupWindow
:
private PopupWindow mPopupWindow;
private void initPopupWindow() {
View popupView = LayoutInflater.from(this).inflate(R.layout.popup_window_layout, null);
mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
Button btnClose = popupView.findViewById(R.id.btn_pop_close);
btnClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPopupWindow.dismiss();
}
});
}
这里我们通过LayoutInflater创建了自定义布局,然后使用第二个构造方法创建了PopupWindow对象,并设置了宽度和高度为MATCH_PARENT和WRAP_CONTENT,表示PopupWindow的宽度占据整个屏幕,高度根据自定义布局自适应。最后,我们在自定义布局中找到关闭按钮,并设置点击事件,点击时关闭PopupWindow。
2.3 显示PopupWindow
显示PopupWindow有两种方法:
// 在指定的控件下方显示PopupWindow
popupWindow.showAsDropDown(View anchor)
// 在指定的位置显示PopupWindow
popupWindow.showAtLocation(View parent, int gravity, int x, int y)
其中,showAsDropDown()需要传入一个View对象作为锚点,表示PopupWindow显示在该View的下方,而showAtLocation()需要传入一个父布局View对象和PopupWindow显示的位置、偏移量等参数。
例如,我们在MainActivity的onCreate()方法中调用initPopupWindow()方法初始化PopupWindow,并在点击一个按钮时弹出PopupWindow:
private Button mBtnShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnShow = findViewById(R.id.btn_show_popup);
mBtnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mPopupWindow != null && !mPopupWindow.isShowing()) {
mPopupWindow.showAtLocation(getWindow().getDecorView(), Gravity.CENTER, 0, 0);
}
}
});
initPopupWindow();
}
这里我们在初始化PopupWindow时设置了按钮的点击事件,点击时显示PopupWindow,并在屏幕中央显示。
3. 示例说明
3.1 实现一个下拉菜单
我们可以通过自定义PopupWindow实现下拉菜单的效果。例如,我们创建一个自定义布局dropdown_layout.xml
,其中包括若干个条目:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@android:color/white">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Item 1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Item 2" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Item 3" />
</LinearLayout>
然后,在MainActivity中创建PopupWindow对象mDropDown
,并在按钮点击事件中显示下拉菜单:
private PopupWindow mDropDown;
private void initDropDown() {
View dropDownView = LayoutInflater.from(this).inflate(R.layout.dropdown_layout, null);
mDropDown = new PopupWindow(dropDownView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mDropDown.setBackgroundDrawable(new BitmapDrawable());
mDropDown.setOutsideTouchable(true);
// 处理点击条目事件
dropDownView.findViewById(R.id.tv_item1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDropDown.dismiss();
Toast.makeText(MainActivity.this, "Item 1 clicked", Toast.LENGTH_SHORT).show();
}
});
dropDownView.findViewById(R.id.tv_item2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDropDown.dismiss();
Toast.makeText(MainActivity.this, "Item 2 clicked", Toast.LENGTH_SHORT).show();
}
});
dropDownView.findViewById(R.id.tv_item3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDropDown.dismiss();
Toast.makeText(MainActivity.this, "Item 3 clicked", Toast.LENGTH_SHORT).show();
}
});
}
private void showDropDown() {
if (mDropDown != null && !mDropDown.isShowing()) {
mDropDown.showAsDropDown(mBtnDropDown);
}
}
这里我们通过内部类实现了点击每个条目的回调,点击时关闭PopupWindow并弹出一个Toast提示。
在onCreate()方法中,我们初始化下拉菜单,并将按钮的点击事件绑定到showDropDown()方法上。
3.2 实现一个筛选框
我们可以通过自定义PopupWindow实现一个简单的筛选框。例如,在MainActivity中创建PopupWindow对象mFilter
,并在按钮点击事件中显示指定的自定义布局:
private PopupWindow mFilter;
private void initFilter() {
View filterView = LayoutInflater.from(this).inflate(R.layout.filter_layout, null);
mFilter = new PopupWindow(filterView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mFilter.setBackgroundDrawable(new BitmapDrawable());
mFilter.setOutsideTouchable(true);
// 处理点击事件
filterView.findViewById(R.id.btn_filter_confirm).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFilter.dismiss();
Toast.makeText(MainActivity.this, "Filter confirmed", Toast.LENGTH_SHORT).show();
}
});
filterView.findViewById(R.id.btn_filter_reset).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: 重置筛选条件
Toast.makeText(MainActivity.this, "Filter reset", Toast.LENGTH_SHORT).show();
}
});
}
private void showFilter() {
if (mFilter != null && !mFilter.isShowing()) {
mFilter.showAtLocation(getWindow().getDecorView(), Gravity.BOTTOM, 0, 0);
}
}
这里我们使用了带有确认按钮和重置按钮的自定义布局,点击确认按钮时关闭PopupWindow并弹出一个Toast提示,点击重置按钮时执行重置筛选条件的逻辑(这里仅仅是弹出一个Toast提示)。
在onCreate()方法中,我们初始化筛选框,并将按钮的点击事件绑定到showFilter()方法上。
以上就是“Android自定义PopupWindow简单小例子”中的完整攻略,希望能够对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android自定义PopupWindow简单小例子 - Python技术站