生成弹窗对话框主要分为4步
第一步:实例化弹窗对象
View v=LayoutInflater.from(this).inflate(R.layout.popup_layout, null); //1.实例化对象 //将整个布局变成View //参数1:用在弹窗中的View //参数2,3:弹窗的宽高 //参数4(focusable): 能否获取焦点 PopupWindow window = new PopupWindow(v, 600, 80, true);
popup_layout.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/choose" android:layout_width="60dp" android:layout_height="30dp" android:text="选择" android:textColor="#ffffff" android:gravity="center" android:background="#000000"/> <TextView android:id="@+id/choose_all" android:layout_width="60dp" android:layout_height="30dp" android:text="全选" android:textColor="#ffffff" android:gravity="center" android:background="#000000"/> <TextView android:id="@+id/copy" android:layout_width="60dp" android:layout_height="30dp" android:text="复制" android:textColor="#ffffff" android:gravity="center" android:background="#000000"/> </LinearLayout>
第二步设置背景(动画)
设置背景
//设置背景 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //设置背景为透明色 //设置能响应外部的点击事件 window.setOutsideTouchable(true); //设置能响应点击事件 window.setTouchable(true);
设置动画
//1.创建动画资源 2.创建一个style应用动画资源 3.对当前弹窗的动画风格设置为第二步的资源索引 window.setAnimationStyle(R.style.translate_anim);
设置动画中需要先设置anim动画的出现方式,这里使用的是移动方式
translate.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="800" android:toYDelta="0" android:duration="10000"> </translate> </set>
style里面设置样式
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="mydialog" parent="android:style/Theme.Dialog"> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> </style> <style name="translate_anim"> <item name="android:windowEnterAnimation">@anim/translate</item> </style> </resources>
3.显示,显示主要是用来设置窗体的位置
//3.显示
//参数1(anchor):锚
//参数2,3:相对于锚在x,y方向上的偏移量
window.showAsDropDown(view, -600, 0);
4.设置出现按钮的点击事件
//为弹窗中的文本添加点击事件 v.findViewById(R.id.choose).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "您点击了选择", Toast.LENGTH_LONG).show(); window.dismiss(); //控制弹窗消失 } }); //为弹窗中的文本添加点击事件 v.findViewById(R.id.choose_all).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "您点击了全选", Toast.LENGTH_LONG).show(); window.dismiss(); } }); //为弹窗中的文本添加点击事件 v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "您点击了复制", Toast.LENGTH_LONG).show(); window.dismiss(); } });
mainActivity.java完整代码
package com.example.dialog; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.DialogInterface; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.PopupWindow; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void showNormalDialog(){ AlertDialog dialog = new AlertDialog.Builder(this).create(); dialog.setTitle("提示"); dialog.setMessage("您确定要退出程序吗?"); dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dialog.show(); } public void myClick(View view) { switch (view.getId()) { case R.id.normal_dialog_btn: //1.实例化一个Buidler //AlertDialog的构造方法时protected AlertDialog.Builder builder = new AlertDialog.Builder(this); //2.设置对话框样式 builder.setTitle("提示"); builder.setMessage("您确定退出程序吗?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); //展示 builder.setNegativeButton("取消", null); builder.show(); // AlertDialog dialog = builder.create(); // dialog.show(); break; case R.id.diy_dialog_btn: Mydialog md = new Mydialog(this, R.style.mydialog); md.show(); break; case R.id.popup_btn: showPopupWindow(view); break; } } public void showPopupWindow(View view) { //准备弹出所需要的视图对象 View v = LayoutInflater.from(this).inflate(R.layout.popup_layout, null); //1.实例化对象 //将整个布局变成View //参数1:用在弹窗中的View //参数2,3:弹窗的宽高 //参数4(focusable): 能否获取焦点 PopupWindow window = new PopupWindow(v, 600, 80, true); //2.设置(背景, 动画) //设置背景 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); //设置背景为透明色 //设置能响应外部的点击事件 window.setOutsideTouchable(true); //设置能响应点击事件 window.setTouchable(true); //1.创建动画资源 2.创建一个style应用动画资源 3.对当前弹窗的动画风格设置为第二步的资源索引 window.setAnimationStyle(R.style.translate_anim); //3.显示 //参数1(anchor):锚 //参数2,3:相对于锚在x,y方向上的偏移量 window.showAsDropDown(view, -600, 0); //为弹窗中的文本添加点击事件 v.findViewById(R.id.choose).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "您点击了选择", Toast.LENGTH_LONG).show(); window.dismiss(); //控制弹窗消失 } }); //为弹窗中的文本添加点击事件 v.findViewById(R.id.choose_all).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "您点击了全选", Toast.LENGTH_LONG).show(); window.dismiss(); } }); //为弹窗中的文本添加点击事件 v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "您点击了复制", Toast.LENGTH_LONG).show(); window.dismiss(); } }); } }