码迷,mamicode.com
首页 > 其他好文 > 详细

自定义Dialog

时间:2014-05-26 23:10:24      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:android   style   c   class   blog   code   

  先说下,一开始学习android使用的是AlertDialog,对付最简单的要求还算可以,后来要适用各种对话框,还要死乞白赖使用AlertDialog,那是找死。

  贴一个几乎万能的简单dialog,首先定义对话框的style:

bubuko.com,布布扣
<style name="dialog" parent="@android:style/Theme.Dialog">
  <item name="android:windowFrame">@null</item><!--边框-->
  <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
  <item name="android:windowIsTranslucent">true</item><!--半透明-->   <item name="android:windowNoTitle">true</item><!--无标题-->   <item name="android:background">@android:color/transparent</item><!--背景透明-->   <item name="android:windowBackground">@android:color/transparent</item>   <item name="android:backgroundDimEnabled">true</item><!--蒙板-->   <item name="android:backgroundDimAmount">0.6</item><!--蒙板模糊程度--> </style>
bubuko.com,布布扣

  可惜有很多属性不知道,比如上面的window开头的属性eclipse不会自动提示,怎么破?多多积累吧。sytle是个好东西,知道的属性多了以后简直无所不能,贴一个不错的例子网址拓展思维:http://www.cnblogs.com/jiezzy/archive/2012/09/06/2673229.html

  java代码中,new对话框的时候使用构造器Dialog(Context context, int theme),并且使用setContentView()方法把要使用的布局加载进去就OK了:

  dialog = new Dialog(context,R.style.dialog);
  dialog.setContentView(R.layout.XXX);
  dialog.setCancelable(true);
  dialog.show();

  setContentView()的参数可以是View也可以是layout资源文件。如果这个布局中需要取得组件id,直接dialog.findViewById就行了。

  接下来贴出一个网上的demo,里面提供了设置dialog位置、大小、透明度的方法:

bubuko.com,布布扣
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;

public class DialogDemoActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Dialog dialog = new Dialog(this);
        
        // setContentView可以设置为一个View也可以简单地指定资源ID
        // LayoutInflater
        // li=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
        // View v=li.inflate(R.layout.dialog_layout, null);
        // dialog.setContentView(v);
        dialog.setContentView(R.layout.dialog_layout);

        dialog.setTitle("Custom Dialog");

        /* 
         * 获取对话框的窗口对象及参数对象以修改对话框的布局设置,
         * 可以直接调用getWindow(),表示获得这个Activity的Window
         * 对象,这样这可以以同样的方式改变这个Activity的属性.
         */
        Window dialogWindow = dialog.getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        dialogWindow.setGravity(Gravity.LEFT | Gravity.TOP);

        /*
         * lp.x与lp.y表示相对于原始位置的偏移.
         * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
         * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.

         * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
         * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
         * 当参数值包含Gravity.CENTER_HORIZONTAL时
         * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
         * 当参数值包含Gravity.CENTER_VERTICAL时
         * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
         * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
         * Gravity.CENTER_VERTICAL.
         * 
         * 本来setGravity的参数值为Gravity.LEFT | Gravity.TOP时对话框应出现在程序的左上角,但在
         * 我手机上测试时发现距左边与上边都有一小段距离,而且垂直坐标把程序标题栏也计算在内了,
         * Gravity.LEFT, Gravity.TOP, Gravity.BOTTOM与Gravity.RIGHT都是如此,据边界有一小段距离
         */
        lp.x = 100; // 新位置X坐标
        lp.y = 100; // 新位置Y坐标
        lp.width = 300; // 宽度
        lp.height = 300; // 高度
        lp.alpha = 0.7f; // 透明度

        // 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes
        // dialog.onWindowAttributesChanged(lp);
        dialogWindow.setAttributes(lp);

        /*
         * 将对话框的大小按屏幕大小的百分比设置
         */
//        WindowManager m = getWindowManager();
//        Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
//        WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
//        p.height = (int) (d.getHeight() * 0.6); // 高度设置为屏幕的0.6
//        p.width = (int) (d.getWidth() * 0.65); // 宽度设置为屏幕的0.65
//        dialogWindow.setAttributes(p);

        dialog.show();

    }
}
bubuko.com,布布扣

 

自定义Dialog,布布扣,bubuko.com

自定义Dialog

标签:android   style   c   class   blog   code   

原文地址:http://www.cnblogs.com/Couch-potato/p/3737621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!