开发者社区> 爆米花9958> 正文

android实现弹出式对话框方法分析

简介: 利用Dialog,PopupWindow都可以实现对话框的功能。 Dialog实现比较方便,可以用系统自带的样式,也可以自定义一下,但是它显示位置比较固定,有时不能满足我们的需求。
+关注继续查看

利用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;
        }
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
体育分析技术进行时:凭借AI洞察与数据故事不断发展
各类企业正利用持续增长的数据总量巩固自身优势,同时着力开发技术方案,希望在市场对抗中占据领先。
417 0
SLS新版告警入门-统一的查询分析语法
SLS新版告警支持多种监控目标,如SLS的日志存储,时序存储;也支持对外部系统如Promethus,Grafana,Zabbix产生的告警进行管理;在对SLS的存储进行监控时,用户可以自定义告警监控规则或者使用内置的告警规则。自定义告警监控规则主要包括监控目标,触发条件,行动配置等。本文主要介绍在创建自定义告警规则时,如何使用统一的查询分析语法来查询并定义监控目标。
624 0
android实现弹出式对话框方法分析
利用Dialog,PopupWindow都可以实现对话框的功能。 Dialog实现比较方便,可以用系统自带的样式,也可以自定义一下,但是它显示位置比较固定,有时不能满足我们的需求。
898 0
Android 对话框用法
来自:http://www.cnblogs.com/salam/archive/2010/11/15/1877512.html   Activities提供了一种方便管理的创建、保存、回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(int, Di...
1044 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20879 0
[Android]从Launcher开始启动App流程源码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码分析 com.
655 0
141
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载