博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android实现弹出式对话框方法分析
阅读量:6335 次
发布时间:2019-06-22

本文共 4515 字,大约阅读时间需要 15 分钟。

利用Dialog,PopupWindow都可以实现对话框的功能。

Dialog实现比较方便,可以用系统自带的样式,也可以自定义一下,但是它显示位置比较固定,有时不能满足我们的需求。

而PopupWindow可以通过showAtLocation设置显示位置,也可以通过ShowAsDropDown以下拉方式显示在某个View的相对位置上,基本能满足我们的需求。

举个例子简单说明一下

为要使用自定义样式的dialog,需要写个style,在values/styles.xml里编写
<style name="MyDialog" parent="@android:Theme.Dialog">
        <!-- 设置dialog有无标题栏 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 设置dialog出现时是否屏幕变黑 -->
        <item name="android:backgroundDimEnabled">false</item>
        <!-- 设置window的背景 -->
        <item name="android:windowBackground">@null</item>
        <!-- Dialog的windowFrame框为无 -->
        <item name="android:windowFrame">@null</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsFloating">false</item>
        <!-- 是否半透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 设置dialog的背景 -->
        <item name="android:background">@android:color/background_dark</item>
    </style>
调用的时候这样调用
AlertDialog.Builder aBuilder = new AlertDialog.Builder(this,
                    R.style.MyDialog);
            RelativeLayout layout = (RelativeLayout) getLayoutInflater()
                    .inflate(R.layout.activity_main_custom, null);
            aBuilder.setView(layout);
            AlertDialog dialog = aBuilder.create();
            dialog.show();
再说下使用Activity作为对话框的用法:
定义一个style
     <style name="PopupActivity">
           <!-- 设置window的背景 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 是否半透明 -->
        <item name="android:windowIsTranslucent">true</item>
         <!-- 设置dialog有无标题栏 -->
        <item name="android:windowNoTitle">true</item>
        <!--设置切换动画  -->
        <item name="android:windowAnimationStyle">@style/Anim_scale</item>
    </style>
    动画效果
<style name="Anim_scale" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/scale_in</item>
        <item name="android:activityOpenExitAnimation">@anim/scale_out</item>
        <item name="android:activityCloseEnterAnimation">@anim/scale_in</item>
        <item name="android:activityCloseExitAnimation">@anim/scale_out</item>
    </style>
最后看下MainAcivity.java类
public class MainActivity extends Activity implements OnClickListener {
    private Button mButtonDefaultDialog;
    private Button mButtonCustomDialog;
    private Button mButtonPopupWindow;
    private Button mButtonPopupActivity;
    PopupWindow popupWindow;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        mButtonDefaultDialog = (Button) findViewById(R.id.btn_main_default_dialog);
        mButtonCustomDialog = (Button) findViewById(R.id.btn_main_custom_dialog);
        mButtonPopupWindow = (Button) findViewById(R.id.btn_main_popup_window);
        mButtonPopupActivity = (Button) findViewById(R.id.btn_main_popup_activity);
        mButtonDefaultDialog.setOnClickListener(this);
        mButtonCustomDialog.setOnClickListener(this);
        mButtonPopupWindow.setOnClickListener(this);
        mButtonPopupActivity.setOnClickListener(this);
        // 装载R.layout.popupwindow对应的布局
        View root = getLayoutInflater().inflate(R.layout.popupwindow, null);
        // 创建PopupWindow对象
        popupWindow = new PopupWindow(root, LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
        // 实例化popupwindow.xml布局中的组件
        Button button = (Button) root.findViewById(R.id.close_popup_window);
        button.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_main_default_dialog:
            // 使用系统自带theme
            AlertDialog.Builder builder = new AlertDialog.Builder(this,
                    R.style.AppTheme);
            RelativeLayout view = (RelativeLayout) getLayoutInflater().inflate(
                    R.layout.activity_main_default, null);
            builder.setView(view);
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
            break;
        case R.id.btn_main_custom_dialog:
            // 直接使用Dialog的方式已经不推荐使用
            // Dialog dialog = new Dialog(MainActivity.this, R.style.MyDialog);
            // dialog.setContentView(R.layout.activity_main_custom);
            // dialog.show();
            // 使用自定义theme
            AlertDialog.Builder aBuilder = new AlertDialog.Builder(this,
                    R.style.MyDialog);
            RelativeLayout layout = (RelativeLayout) getLayoutInflater()
                    .inflate(R.layout.activity_main_custom, null);
            aBuilder.setView(layout);
            AlertDialog dialog = aBuilder.create();
            dialog.show();
            break;
        case R.id.btn_main_popup_window:
            // 以下拉方式显示
            // popupWindow.showAsDropDown(arg0);
            // 将PopupWindow显示在指定位置
            popupWindow.showAtLocation(mButtonPopupWindow, Gravity.BOTTOM,
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            break;
        case R.id.btn_main_popup_activity:
            // 弹出式显示Activity
            Intent intent = new Intent(MainActivity.this, PopupActivity.class);
            startActivity(intent);
            break;
        case R.id.close_popup_window:
            // 关闭PopupWindow
            popupWindow.dismiss();
            break;
        default:
            break;
        }
    }
}
最终效果如下:
参考:
你可能感兴趣的文章
return、break、continue三者区别
查看>>
ajax提交与普通表单提交的优缺点
查看>>
avascript获取网页中指定节点的父节点、子节点的方法小结
查看>>
apache和php
查看>>
浮点数转字符串
查看>>
nginx的站点安全
查看>>
×××S 2012 参数化报表 -- 日期参数
查看>>
SQL Server 2017 AlwaysOn on Linux 配置和维护(15)
查看>>
如何才能提高Java Web性能?
查看>>
RHEL7下PXE+NFS+Kickstart无人值守安装操作系统
查看>>
PostgreSQL ip地址 查询
查看>>
10.Spring整合Hibernate_3_HibernateTemplate
查看>>
Mysql数据类型
查看>>
【MongoDB学习笔记2】MongoDB基本知识
查看>>
testng的报告自定义笔记三
查看>>
百度ECharts初探
查看>>
DirectSound 混音的实现
查看>>
Linux Oracle 11g, lsnrctl start 监听服务启动失败解决办法
查看>>
Scale-Out File Server for Application Data Overview
查看>>
Windows2012r2 NFS ESXi 优化
查看>>