Android中制作自定义dialog对话框的实例

http://www.jb51.net/article/83319.htm

这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继承Dialog类来制作自己的对话框,需要的朋友可以参考下

自定义dialog基础版
很多时候,我们在使用android sdk提供的alerdialog的时候,会因为你的系统的不同而产生不同的效果,就好比如你刷的是MIUI的系统,弹出框都会在顶部显示!这里简单的介绍自定义弹出框的应用。

首先创建布局文件dialog:

代码:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width="match_parent"

  android:layout_height="match_parent"

  android:orientation="vertical" >

  <EditText

    android:id="@+id/edit"

    android:layout_width="250dip"

     android:layout_height="wrap_content"

    />

  <Button

    android:id="@+id/clickbtn"

     android:layout_width="wrap_content"

     android:layout_height="wrap_content"

     android:text="click me" />

  

</LinearLayout>

其次创建MyCustomDialog类继承Dialog:

代码:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

package com.xzw.custom.dialog;

import android.app.Dialog;

import android.content.Context;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

/**

* 自定义dialog

*/

public class MyCustomDialog extends Dialog {

    //定义回调事件,用于dialog的点击事件

    public interface OnCustomDialogListener{

        public void back(String name);

    }

    

    private String name;

    private OnCustomDialogListener customDialogListener;

    EditText etName;

    public MyCustomDialog(Context context,String name,OnCustomDialogListener customDialogListener) {

        super(context);

        this.name = name;

        this.customDialogListener = customDialogListener;

    }

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.dialog);

        //设置标题

        setTitle(name);

        etName = (EditText)findViewById(R.id.edit);

        Button clickBtn = (Button) findViewById(R.id.clickbtn);

        clickBtn.setOnClickListener(clickListener);

    }

    

    private View.OnClickListener clickListener = new View.OnClickListener() {

        

        @Override

        public void onClick(View v) {

            customDialogListener.back(String.valueOf(etName.getText()));

          MyCustomDialog.this.dismiss();

        }

    };

}

最后再完成MainActivity:

代码:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

package com.xzw.custom.dialog;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

   private TextView resultText;

  @Override

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    resultText = (TextView) findViewById(R.id.result);

    Button showDialogBtn = (Button) findViewById(R.id.showdialog);

    showDialogBtn.setOnClickListener(this);

    

   

  }

    @Override

    public void onClick(View v) {

         MyCustomDialog dialog = new MyCustomDialog(this,"Enter your name",new MyCustomDialog.OnCustomDialogListener() {

                

                @Override

                public void back(String name) {

                    resultText.setText("Enter name is "+name);

                    

                }

            });

            dialog.show();

        

  }

         

  

}

效果如图:

炫酷升级版
在日常开发过程中,Android自带的对话框控件美观程度远远满足不了开发的要求,特别是相对于移植开发,下面描述的demo是基于1280X720分辨率实现的效果。

自定义对话框和上次记录的自定义RatingBar非常类似,都是通过在styles.xml里面继承父类(此处是Dialog)的样式。
styles.xml

?


1

2

3

4

5

6

7

8

<style name="NoticeDialog" parent="@android:style/Theme.Dialog">

    <item name="android:windowFrame">@null</item><!--边框-->

    <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->

    <item name="android:windowIsTranslucent">false</item><!--半透明-->

    <item name="android:windowNoTitle">true</item><!--无标题-->

    <item name="android:windowBackground">@drawable/tck_bg</item><!--背景透明-->

    <item name="android:backgroundDimEnabled">false</item><!--模糊-->

  </style>

我们下面将要做下面三个效果:
(1)带选择确认框的提示

(2)图片+文字的提示

(3)图片+图片

实现上面三个效果我们只需要继承一个Dialog类,然后根据不同的布局添加相对应的xml布局就可以简单实现功能扩展的效果了。
1.继承Dialog类,重写父类的方法,并添加子类自己的方法。
NoticeDialog.java,继承于Dialog父类,实现了点击事件的接口,如果有确认选择框,则把确认选择框的控件添加click事件监听,通过在回调方法在UI主线程里面实现界面更新和逻辑操作。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

package com.zlc.dialog;

 

import android.app.Dialog;

import android.content.Context;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.TextView;

 

 

public class NoticeDialog extends Dialog implements OnClickListener{

  Context context;

  private NoticeDialogListener listener;

  //对话框事件监听接口,用于处理回调点击事件

  public interface NoticeDialogListener {

    public void onClick(View view);

  

  public NoticeDialog(Context context) {

    super(context);

    // TODO Auto-generated constructor stub

    this.context = context;

  }

  public NoticeDialog(Context context,int theme){

    super(context, theme);

    this.context = context;

  }

  public NoticeDialog(Context context,int theme,NoticeDialogListener listener){

    super(context, theme);

    this.context = context;

    this.listener = listener;

  }

  @Override

  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    TextView enter = (TextView)findViewById(R.id.dialog_enter);//确定控件

    TextView cancel = (TextView)findViewById(R.id.dialog_cancle);//取消控件

    if(enter != null && cancel != null){//如果是不带确认选择框,不做事件监听操作

      enter.setOnClickListener(this);

      cancel.setOnClickListener(this);

      enter.requestFocus();

    }

   

  }

  @Override

  public void onClick(View v) {

    // TODO Auto-generated method stub

    listener.onClick(v);

  }

}

2.对应上面三个效果,添加不同的xml布局。
(1)带选择确认框的提示dialog_notice_choise.xml

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="vertical"

  android:layout_width="652dp"

  android:layout_height="352dp"

  >

  <LinearLayout

     android:layout_width="500dp"

     android:layout_height="200dp"

    android:layout_marginLeft="76dp"

    android:layout_marginTop="76dp"

    android:orientation="vertical"

    android:background="@drawable/tck01">

    <LinearLayout

       android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:layout_marginTop="5dp"

      android:layout_marginLeft="10dp"

       

      >

      <TextView

      android:textSize="26sp"

       android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:textColor="@color/dialog_title"

      android:text="@string/dialog_title"

         android:focusable="false"

      />

    </LinearLayout>

     

    <LinearLayout

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:layout_marginTop="40dp"

      android:gravity="center"

      

      

       <TextView

      android:id="@+id/notice_value"

      android:textSize="32sp"

      android:layout_marginLeft="10dp"

       android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:textColor="@color/dialog_content"

      android:text="@string/dialog_uninstall"

        android:focusable="false"

      />

      </LinearLayout>

    <LinearLayout

      android:layout_width="fill_parent"

      android:layout_height="44dp"

      android:layout_marginTop="35dp"

      android:layout_marginLeft="4dp"

      

      <TextView

        android:id="@+id/dialog_enter"

        android:textSize="25sp"

         android:layout_width="246dp"

      android:layout_height="fill_parent"

      android:text="@string/dialog_enter"

      android:gravity="center"

      android:textColor="@drawable/app_manager_dialog_textcolor"

      android:background="@drawable/app_manager_dialog_btn_color"

      android:focusable="true"

        />

      <TextView

        android:id="@+id/dialog_cancle"

         android:textSize="25sp"

         android:layout_width="246dp"

      android:layout_height="fill_parent"

       android:text="@string/dialog_cancel"

       android:gravity="center"

        android:textColor="@drawable/app_manager_dialog_textcolor"

         android:background="@drawable/app_manager_dialog_btn_color"

          android:focusable="true"

        />

      </LinearLayout>

       

    </LinearLayout>

</LinearLayout>  

(2)图片+文字的提示dialog_notice_ing.xml

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="vertical"

  android:layout_width="652dp"

  android:layout_height="352dp"

  >

  <LinearLayout

     android:layout_width="500dp"

     android:layout_height="200dp"

    android:layout_marginLeft="76dp"

       android:layout_marginTop="76dp"

    android:orientation="vertical"

    android:background="@drawable/tck01">

    <LinearLayout

       android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:layout_marginTop="5dp"

      android:layout_marginLeft="10dp"

       

      >

      <TextView

      android:textSize="26sp"

       android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:textColor="@color/dialog_title"

      android:text="@string/dialog_title"

      />

    </LinearLayout>

     

    <LinearLayout

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:layout_marginTop="50dp"

       android:gravity="center"

      

      <ImageView

         android:layout_width="38dp"

         android:layout_height="42dp"

        android:src="@drawable/uninstall_icon"/>

       <TextView

         android:id="@+id/dialog_in_msg"

      android:textSize="32sp"

      android:layout_marginLeft="10dp"

       android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:textColor="@color/dialog_content"

      android:text="@string/dialog_uninstall_in"

      />

      </LinearLayout>

       

    </LinearLayout>

</LinearLayout>   

(3)图片+图片dialog_notice_finish.xml

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:orientation="vertical"

  android:layout_width="652dp"

  android:layout_height="352dp"

  >

  <LinearLayout

     android:layout_width="500dp"

     android:layout_height="200dp"

    android:layout_marginLeft="76dp"

       android:layout_marginTop="76dp"

    android:orientation="vertical"

    android:background="@drawable/tck01">

    <LinearLayout

       android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:layout_marginTop="5dp"

      android:layout_marginLeft="10dp"

       

      >

      <TextView

      android:textSize="26sp"

       android:layout_width="wrap_content"

      android:layout_height="wrap_content"

      android:textColor="@color/dialog_title"

      android:text="@string/dialog_title"

      />

    </LinearLayout>

     

    <LinearLayout

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:layout_marginTop="40dp"

       android:gravity="center"

      

      <ImageView

         android:layout_width="66dp"

         android:layout_height="67dp"

        android:src="@drawable/cg"/>

       <ImageView

      android:id="@+id/dialog_finish_img"

      android:layout_marginLeft="20dp"

       android:layout_width="165dp"

         android:layout_height="36dp"

        android:src="@drawable/uninstall_ok"

      />

      </LinearLayout>

       

    </LinearLayout>

</LinearLayout>

3.在MainActivity实现对自定义对话框的添加显示。
MainActivity.java,在进行对话框切换显示的时候,只需要设置不同的xml配置文件就行了。(注意:NoticeDialog里面的构造方法的context参数只能是XXXActivity.this,不能是通过getApplicationContext获取的context对象)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

package com.zlc.dialog;

 

 

import java.util.Timer;

import java.util.TimerTask;

 

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

 

import com.zlc.dialog.NoticeDialog.NoticeDialogListener;

 

public class MainActivity extends Activity {

  private Context context;

  private NoticeDialog notiDialog;

  int count = 0;

  Handler handler;

  @Override

  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    context = getApplicationContext();

    notiDialog = new NoticeDialog(MainActivity.this,

        R.style.NoticeDialog, new NoticeDialogListener() {

      @Override

      public void onClick(View view) {

        try {

          if(view.getId() == R.id.dialog_enter){

            notiDialog.dismiss();

            //TODO 购买

          }

          notiDialog.dismiss();

        } catch (Exception e) {

          e.printStackTrace();

        }

      }

    });

    notiDialog.setContentView(R.layout.dialog_notice_choise);

    notiDialog.show();

    Timer timer = new Timer();

    handler = new Myhandler();

     

    timer.schedule(new TimerTask() {

      @Override

      public void run() {

        // TODO Auto-generated method stub

        count = count % 4;

        notiDialog.cancel();

        handler.sendEmptyMessage(count);

        count ++;

      }

    }, 3000, 3000);

  }

  private class Myhandler extends Handler{

    @Override

    public void handleMessage(Message msg) {

      // TODO Auto-generated method stub

      switch (msg.what) {

      case 0:

        notiDialog.setContentView(R.layout.dialog_notice_ing);

        break;

      case 1:

        notiDialog.setContentView(R.layout.dialog_notice_finish);

        break;

      case 2:

        notiDialog.setContentView(R.layout.dialog_notice_choise);

        break;

      default:

        break;

      }

      notiDialog.show();

    }

  }

 

}

时间: 2024-10-19 11:17:00

Android中制作自定义dialog对话框的实例的相关文章

【Android UI设计】Dialog对话框详解(二)

上一篇我们介绍了Dialog的基本使用方法,[Android UI设计]Dialog对话框详解(一)今天继续介绍,废话不多说,今天主要实现ProgressDialog和透明Dialog两种效果,最后介绍一下github上的一个Dialog动画开源库,里面包含多种动画特效,效果图如下: 一.ProgressDialog基本使用 1.ProgressDialog关键代码 mProgressDialog = new ProgressDialog(MainActivity.this); // 圆形pro

Android开发之自定义Dialog二次打开报错问题解决

之前自定义了一个AlertDialog对话框,第一次点击时正常,但第二次调用时会出现错误:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 关于这个错误纠结了我好久,在网上百度了也不少,但感觉解决效果都达不到自己想要的效果.网上的解释说是一个子视图指定了多个父视图.由此可以推断出,在第二

android 如何让自定义dialog的宽度充满整个屏幕?

============问题描述============ android 如何让自定义dialog的宽度跟屏幕的宽度一样.求大神们指教下.. ============解决方案1============ 在你dialog.show();后面加上 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); WindowManager.LayoutParam

Android 中使用自定义字体的方法

1.Android系统默认支持三种字体,分别为:“sans”, “serif”, “monospace 2.在Android中可以引入其他字体 . <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:Android="http://schemas.android.com/apk/res/android" Android:layout_width="fill

浅谈android中的自定义封装易用的Dialog

好久没写android的博客,最近在做一个android的项目,里面用到我们经常用的一个控件就是对话框,大家都知道android自带的对话框是很丑的,android5.x之后除外.所以就出现了自定义view,自己定义美观的对话框.好我们就来自定义对话框. 整体思路:定义一个类然后去继承Dialog类,然后重写相应的构造器方法.大家都知道一般的对话框的创建过程都是来一个AlertDialog.Builder对象,然后使用一些set方法来设置标题内容以及设置一些自定义的view和点击的Button以

Android中的自定义Adapter(继承自BaseAdapter)——与系统Adapter的调用方法一致——含ViewHolder显示效率的优化(转)

Android中很多地方使用的是适配器(Adapter)机制,那我们就要好好把这个Adapter利用起来,并且用出自己的特色,来符合我们自行设计的需要喽~~~ 下面先上一个例子,是使用ViewHolder进行显示效率优化过的工程: package com.test.listviewsimpleadapter;    import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;  import java

【Android UI设计】Dialog对话框详解(一)

所谓Dialog其实就是一个小窗口,用户在对界面进行某些操作的时候,可以通过Dialog来响应,对用户进行反馈,但是我们一般在使用Dialog的时候是不会直接使用Dialog来进行编码创建对话框,而是使用它的子类来进行操作: AlertDialog 一个对话框-–可以显示一个标题,最多三个按钮,一个可选项列表,或自定义布局. Dialog继承关系图 其他子类不在此处介绍,本篇主要介绍AlertDialog和Android官方推荐使用的DialogFragment这两种方式来创建Dialog. D

Android中的跨进程通信方法实例及特点分析(二):ContentProvider

1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据.比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能). 这种优点是统一管理,比方添加了某个音频文件,底层就会将这种变化通知Content Provider.从而当应用程序訪问

Android中的跨进程通信方法实例及特点分析(一):AIDL Service

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 最近有一个需求就是往程序中加入大数据的采集点,但是因为我们的Android程序包含两个进程,所以涉及到跨进程通信的问题.现将Android中的跨进程通信方式总结如下. Android中有4种跨进程通信方式,分别是利用AIDL Service.ContentProvider.Broadcast.Activity实现. 1.利用AIDL Service实现跨进程通信 这是