Android 自定义 PopupWindow 实现 iOS 对话框
在 Android 开发中,有时需要创建类似 iOS 风格的对话框,使用PopupWindow
可以实现这种效果,本文将详细介绍如何自定义PopupWindow
来实现 iOS 风格的对话框。
一、准备工作
创建布局文件
创建一个用于对话框的布局文件,例如dialog_layout.xml
:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="20dp" android:background="@drawable/dialog_background"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="标题" android:textSize="18sp" android:textColor="#333" /> <TextView android:id="@+id/tvMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是一个消息" android:textSize="16sp" android:textColor="#666" android:layout_marginTop="10dp" /> <Button android:id="@+id/btnPositive" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="确定" android:textColor="#fff" android:background="@drawable/button_selector" android:layout_marginTop="20dp" /> </LinearLayout>
创建背景和按钮选择器资源
为了实现 iOS 风格,需要准备一些资源文件,如背景和按钮选择器。
dialog_background.xml(位于res/drawable
文件夹)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FFFFFF"/> <corners android:radius="10dp"/> <stroke android:width="1dp" android:color="#CCCCCC"/> </shape>
button_selector.xml(位于res/drawable
文件夹)
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/button_pressed"/> <item android:state_enabled="false" android:drawable="@drawable/button_disabled"/> <item android:drawable="@drawable/button_normal"/> </selector>
button_normal.xml(位于res/drawable
文件夹)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#007AFF"/> <corners android:radius="5dp"/> </shape>
button_pressed.xml(位于res/drawable
文件夹)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#0055CC"/> <corners android:radius="5dp"/> </shape>
button_disabled.xml(位于res/drawable
文件夹)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#CCCCCC"/> <corners android:radius="5dp"/> </shape>
二、创建自定义 PopupWindow 类
1. 定义 CustomPopupWindow 类
创建一个自定义的PopupWindow
类,继承自PopupWindow
:
import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.PopupWindow; import android.widget.TextView; public class CustomPopupWindow extends PopupWindow { private TextView tvTitle, tvMessage; private Button btnPositive; private View contentView; public CustomPopupWindow(Context context) { super(context); init(context); } private void init(Context context) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); contentView = inflater.inflate(R.layout.dialog_layout, null); setContentView(contentView); setWidth(android.view.ViewGroup.LayoutParams.MATCH_PARENT); setHeight(android.view.ViewGroup.LayoutParams.WRAP_CONTENT); setFocusable(true); setBackgroundDrawable(new BitmapDrawable()); setOutsideTouchable(true); setAnimationStyle(android.R.style.Animation_Dialog); tvTitle = contentView.findViewById(R.id.tvTitle); tvMessage = contentView.findViewById(R.id.tvMessage); btnPositive = contentView.findViewById(R.id.btnPositive); } public void setTitle(String title) { tvTitle.setText(title); } public void setMessage(String message) { tvMessage.setText(message); } public void setPositiveButton(String text, View.OnClickListener listener) { btnPositive.setText(text); btnPositive.setOnClickListener(listener); } }
2. 使用 CustomPopupWindow 类
在活动中使用CustomPopupWindow
类来显示对话框:
import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private CustomPopupWindow customPopupWindow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); customPopupWindow = new CustomPopupWindow(this); customPopupWindow.setTitle("提示"); customPopupWindow.setMessage("这是一个自定义的 iOS 风格对话框"); customPopupWindow.setPositiveButton("确定", new View.OnClickListener() { @Override public void onClick(View v) { customPopupWindow.dismiss(); } }); } public void showDialog(View view) { customPopupWindow.showAsDropDown(view); } }
三、相关问题与解答
问题 1:如何更改对话框的背景颜色?
解答:可以通过修改dialog_background.xml
文件中的<solid>
标签的颜色值来更改对话框的背景颜色,将#FFFFFF
改为其他颜色值即可。
问题 2:如何添加更多按钮到对话框?
解答:可以在dialog_layout.xml
文件中添加更多的按钮,并在CustomPopupWindow
类中初始化这些按钮,添加一个取消按钮,并在init
方法中进行相应的初始化和设置点击事件。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1611889.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复