自定义Dialog

来源:互联网 发布:unix内核源码剖析 pdf 编辑:程序博客网 时间:2024/06/06 11:56

    直接使用系统的dialog往往达不到自己想要的结果:

使用自定义的dialog,其实是很简单的自己上代码不啰嗦!


       Dialog mDialog = new Dialog(MainActivity.this, R.style.MyDialog);
       mDialog.setContentView(R.layout.dialogview1);
       mDialog.show();


样式定义如下:

<style name="MyDialog" parent="@android:Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>

就3行代码就可以使用自己定义的dialog,dialogview1 是由自己定义的,想使用啥背景就使用啥背景, 想是使用啥颜色就啥颜色,

 想要几个按钮就几个按钮,反正一切自定义:布局如下

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="
http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="200dp"
    android:background="@drawable/dialog_bg" >
   
    <TextView
        android:layout_centerHorizontal="true"
        android:id="@+id/dialog_title"
        android:layout_marginTop="15dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffffff"
        android:textSize="30dp"
        android:text="TITLE"
        />
    <TextView
        android:id="@+id/message"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:layout_below="@id/dialog_title"
        android:layout_height="200dp"
        android:layout_width="300dp"
        android:textSize="20dp"
        android:text="ADBa"/>
   
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="150dp"
        android:gravity="center_horizontal"
        >
    <Button
        android:id="@+id/button_0"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="ONE"/>
   
    <Button
        android:id="@+id/button_1"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/button_0"
        android:layout_marginLeft="5dp"
        android:text="TWO"/>
   
    <Button
        android:id="@+id/button_2"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_toRightOf="@id/button_1"
        android:text="THREE"/>
    </RelativeLayout>

</RelativeLayout>


把这些写到自己的代码上以后,运行结果肯定都已经看到了:

     


接下来加上3个button的监听事件即可:

Button  one = (Button)mDialog.findViewById(R.id.button_0);
       Button  two = (Button)mDialog.findViewById(R.id.button_1);
       Button  three = (Button)mDialog.findViewById(R.id.button_2);
      
       one.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View arg0) {
               Toast.makeText(MainActivity.this, "one is clicked", Toast.LENGTH_LONG).show();
            }
        });
      
       two.setOnClickListener(new OnClickListener() {
          
           @Override
           public void onClick(View arg0) {
              Toast.makeText(MainActivity.this, "two is clicked", Toast.LENGTH_LONG).show();
           }
       });
     
      
       three.setOnClickListener(new OnClickListener() {
          
           @Override
           public void onClick(View arg0) {
              Toast.makeText(MainActivity.this, "three is clicked", Toast.LENGTH_LONG).show();
           }
       });

再加上setMessage即可了


       TextView  mTextView = (TextView)mDialog.findViewById(R.id.message);
       mTextView.setText("This is test");

最后在再加上自定位位置:

/*
* 获取圣诞框的窗口对象及参数对象以修改对话框的布局设置,
* 可以直接调用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);

完成,简单的自定义dialog完成了,当然中间的大家可以封装的漂亮一些!



            
      



0 0
原创粉丝点击