`
bit6211
  • 浏览: 74299 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android之自定义Dialog

阅读更多

        前段时间,做了一个android涂鸦板项目(http://mm.10086.cn/1007/300001153536.html?fw=411130),在项目中,用到了一些自定义的对话框,如图所示。

对话框

        在参考了android提供的ApiDemos程序以后,这里对如何实现自己定义的对话框进行一下总结。
在android的ApiDemos中的com.example.android.apis.graphics包下,有一个ColorPickerDialog类,是经典的自定义对话框的例子,我们在去除一些代码,剩下的主框架代码如下(代码中的注释详细注明每个类和方法的用途):
 public class ColorPickerDialog extends Dialog {
 
     /**
      * 监听接口,通过此接口,可以把自定义Dialog需要向外界传递的信息,传递出去
      */
     public interface OnColorChangedListener {
         void colorChanged(int color);
     }
 
     /**
      * 需要在对话框(ColorPickerDialog)上呈现的视图,我们自定义对话框的工作,主要就是构造出一个这样的视图
      */
     private static class ColorPickerView extends View {
 
          private OnColorChangedListener mListener;
        
         /**
          * ColorPickerView的构造函数,可以在这个构造函数里用android自带的控件,比如说LinearLayout、EditText和SeekBar等,把ColorPickerView构造出来。
          * 也可以在onDraw(Canvas canvas)函数中,把ColorPickerView给绘制出来,ColorPickerView采用的就是这种方法。
          */
         ColorPickerView(Context c, OnColorChangedListener l, int color) {
             super(c);
         }
        
         /**
          * 在这个函数里把ColorPickerView给绘制出来
          * @param canvas
          */
         @Override
         protected void onDraw(Canvas canvas) {
         }
        
         /**
          * 通过此方法来设置ColorPickerView的宽度和高度
          */
         @Override
         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
             setMeasuredDimension(CENTER_X*2, CENTER_Y*2);
         }
        
         /**
          * 在这个函数里,调用监听接口OnColorChangedListener的方法,把此自定义Dialog需要向外界传递的信息设置进去
          */
         @Override
         public boolean onTouchEvent(MotionEvent event) {
             switch (event.getAction()) {
                 case MotionEvent.ACTION_DOWN:
                 case MotionEvent.ACTION_MOVE:
                 case MotionEvent.ACTION_UP:
                  mListener.colorChanged(mCenterPaint.getColor());//这条语句调用了监听接口的方法,把信息设置了进去
             }
             return true;
         }
     }
    
 
     /**
      * 自定义对话框的构造方法
      */
     public ColorPickerDialog(Context context,
                              OnColorChangedListener listener,
                              int initialColor) {
     }
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         OnColorChangedListener l = new OnColorChangedListener() {
             public void colorChanged(int color) {
                 mListener.colorChanged(color);
                 dismiss();
             }
         };
 
         /**
          * 只要通过ColorPickerDialog的setContentView方法,即可把我们辛苦绘制的ColorPickerView视图在对话框上呈现出来。
          */
         setContentView(new ColorPickerView(getContext(), l, mInitialColor));
         setTitle("Pick a Color");//这条语句设置对话框的标题
     }
 }

 

 

        总的来说,创建自定义Dialog的关键只有两个步骤:
        1.创建一个需要在自定义Dialog显示的自定义View,创建这个自定义View时,既可以在这个View的构造方法中用android自带的控件把自定义View构造出来;也可以在自定义View的@Override protected void onDraw(Canvas canvas)方法中,把自定义View绘制出来
        2.在自定义Dialog的@Override protected void onCreate(Bundle savedInstanceState)方法中,通过setContentView(自定义View);方法,把我们的自定义View显示出来
        在创建好自定义Dialog后,我们在别的类中,只要调用自定义Dialog的构造函数就可以把自定义Dialog显示出来。对于ColorPickerDialog这个类,调用语句如下:new ColorPickerDialog(getContext(), listener, mPaint.getColor()).show();

 


        下面提供一个在自定义View的构造函数中把View构造出来的例子:


/**
 * 文字对话框
 */
public class TextDialog extends Dialog implements SeekBar.OnSeekBarChangeListener{

 private LinearLayout linearLayout;
 private EditText etForText;
 private SeekBar seekBar;
 private TextView tvForSeekBar;
 private Button btnOk;
 private Button btnCancel;
 private LinearLayout topChildLinearLayout;
 private LinearLayout bottomChildLinearLayout;

 private OnTextInputListener mListener;
 /**
  * 文字对话框标题
  */
 private String title = "请输入文字与选择文字大小";
 
    public interface OnTextInputListener {
        void textInput(String text, int textSize);
    }

    public TextDialog(Context context, OnTextInputListener listener)
    {
        super(context);
        mListener = listener;
       
        linearLayout = new LinearLayout(getContext());
        linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        linearLayout.setGravity(Gravity.CENTER);
       
        etForText = new EditText(context);
        etForText.setMinLines(5);//设置最大行数
       
        seekBar = new SeekBar(context);
        seekBar.setLayoutParams(new LinearLayout.LayoutParams(200, LayoutParams.FILL_PARENT));
        seekBar.setMax(100);
        seekBar.setProgress(50);
        seekBar.setOnSeekBarChangeListener(this);
       
        tvForSeekBar = new TextView(context);
        tvForSeekBar.setText("50");
       
        btnOk = new Button(getContext());
        btnOk.setText("确定");
       
        btnCancel = new Button(getContext());
        btnCancel.setText("取消");
       
        linearLayout.addView(etForText);
       
        topChildLinearLayout = new LinearLayout(getContext());
        topChildLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        topChildLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
       
        topChildLinearLayout.addView(seekBar);
        topChildLinearLayout.addView(tvForSeekBar);
       
        linearLayout.addView(topChildLinearLayout);
       
        bottomChildLinearLayout = new LinearLayout(getContext());
        bottomChildLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        bottomChildLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
        bottomChildLinearLayout.setGravity(Gravity.CENTER);
       
        bottomChildLinearLayout.addView(btnOk);
        bottomChildLinearLayout.addView(btnCancel);
       
        linearLayout.addView(bottomChildLinearLayout);
       
        btnOk.setOnClickListener(new View.OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    // TODO Auto-generated method stub
    //验证text是否为空
    String text = etForText.getText().toString()/*.replace("\n", "")*/;
    if(text == null || text.trim().equals(""))
    {
     Toast.makeText(getContext(), "文字不能为空", Toast.LENGTH_SHORT).show();
     return;
    }
    
    int textSizeInt = Integer.valueOf(tvForSeekBar.getText().toString());
    mListener.textInput(text, textSizeInt);
    dismissDialog();
   }
  });
       
        btnCancel.setOnClickListener(new View.OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    // TODO Auto-generated method stub
    dismissDialog();
   }
  });
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(linearLayout);
        setTitle(title);
    }
   
    public void dismissDialog()
    {
     this.dismiss();
    }

 @Override
 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
 {
  // TODO Auto-generated method stub
  tvForSeekBar.setText(progress + "");
 }

 @Override
 public void onStartTrackingTouch(SeekBar seekBar)
 {
  // TODO Auto-generated method stub
 }

 @Override
 public void onStopTrackingTouch(SeekBar seekBar)
 {
  // TODO Auto-generated method stub
 }
}

此自定义Dialog的效果图如下:

对话框

全文结束,谢谢大家。

  • 大小: 29.6 KB
  • 大小: 8.8 KB
分享到:
评论
2 楼 keqi24 2011-04-25  
恩,借鉴一下,谢谢!
1 楼 niCe 2011-04-25  
写的不错,支持一下

相关推荐

    Android:自定义Dialog-Demo

    本示例"Android:自定义Dialog-Demo"就是针对这种情况提供的一种解决方案。 首先,我们来看自定义Dialog的基本步骤: 1. **创建布局文件**:自定义Dialog的第一步是设计一个XML布局文件,这个文件会定义Dialog的...

    android 自定义Dialog提示+动画效果

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者根据应用的UI风格和功能需求进行个性化设计。本文将深入探讨如何实现一个带有动画效果的自定义Dialog,并以"android 自定义Dialog提示+动画效果"为主题...

    Android自定义Dialog多选对话框(Dialog+Listview+CheckBox)

    在Android开发中,自定义Dialog是一种常见的需求,用于提供一种轻量级的用户交互界面,如提示信息或者进行选择操作。本示例是关于如何创建一个具有多选功能的Dialog,结合了Dialog、ListView和CheckBox的使用。下面...

    Android 自定义dialog

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者根据应用的UI风格和功能需求创建具有...通过学习和实践,你将能够熟练掌握Android自定义Dialog的技巧,从而在应用开发中提供更加丰富和个性化的用户体验。

    Android自定义dialog

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者根据应用的设计风格和功能需求创建出独具特色的对话框。本文将深入探讨如何在Android中实现自定义Dialog,并提供相关实践步骤。 首先,我们来理解一下...

    Android 通过自定义Dialog来理解接口回调callback

    在Android开发中,自定义Dialog是一种常见的用户交互方式,它能提供更为丰富的界面展示和定制化功能。本文将深入探讨如何通过自定义Dialog来理解接口回调(callback)机制,这在进行Android应用开发时是非常重要的一...

    Android自定义loading Dialog

    记得在实际项目中,要确保自定义Dialog的可访问性和可用性,遵循Android的设计指南,以提供最佳的用户体验。 通过这样的自定义,我们可以创建出与应用整体风格一致、具有个性化特色的加载对话框,从而提升用户对...

    Android支付底部弹窗自定义dialog

    接下来,我们需要创建自定义Dialog类,继承自`AppCompatDialogFragment`。在这个类中,我们将加载上面创建的布局,并实现点击事件处理。 ```java public class BottomPaymentDialog extends ...

    android自定义dialog下载

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者根据应用的设计风格和功能需求创建具有独特外观和交互方式的对话框。本文将深入探讨如何在Android中实现自定义Dialog,包括基本概念、步骤和一些实用...

    android自定义dialog和Toast

    在Android开发中,自定义Dialog和Toast是提升用户体验和界面个性化的重要手段。Dialog通常用于向用户展示重要信息或需要用户做出决策的情况,而Toast则用于轻量级的通知,不打断用户的当前操作。以下是对如何自定义...

    很好android自定义dialog加载转圈等待,适合初学,透明+正常两种主题

    在Android开发中,自定义Dialog是一种常见的需求,用于提供一种用户交互的方式,通常用来显示一些临时的通知或进行一些简短的操作。在这个主题中,我们主要关注如何创建一个自定义的加载等待Dialog,它包括透明和...

    android自定义Dialog的简单实现

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者根据应用的设计风格或者特定功能来创建具有...在学习和实践中,多参考官方文档和社区资源,如CSDN博客,能帮助你更好地掌握Android自定义Dialog的技巧。

    Android自定义Dialog 界面比较好看

    标题“Android自定义Dialog 界面比较好看”表明我们将探讨如何创建一个视觉上吸引人的自定义Dialog。描述中提到的链接是一个CSDN博客文章,详细介绍了如何实现这一目标。 自定义Dialog的基础在于创建一个新的布局...

    Android中自定义Dialog

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者根据应用的设计风格和功能需求创建具有独特外观和行为的对话框。"Android中自定义Dialog"这个话题主要涵盖了如何利用Android SDK提供的Dialog类及其...

    Android自定义显示内容的Dialog

    总结来说,Android自定义显示内容的Dialog可以通过继承Dialog或PopupWindow实现。Dialog提供了基本的对话框功能,而PopupWindow提供了更大的定制空间和灵活性。结合`PopAnim`中的动画效果,我们可以创造出既美观又...

    各种自定义Dialog 以及Dialog加载动画

    在Android开发中,自定义Dialog和Dialog加载动画是提升应用用户体验的重要手段。默认的Dialog样式虽然功能齐全,但在追求个性化和美观的今天,往往显得过于简单甚至有些过时。因此,开发者常常需要根据应用的设计...

    自定义dialog仿ios风格的dialog

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者创建具有独特设计和功能的对话框,以符合应用的品牌风格或提供更丰富的用户体验。本文将深入探讨如何在Android中实现一个仿iOS风格的Dialog,并根据...

    Android自定义dialogDemo

    `Android自定义dialogDemo`是一个实例,帮助开发者理解如何在Android应用中创建并使用自定义的Dialog。下面将详细解释相关知识点。 1. **Dialog基础** Dialog是Android中的一个对话框组件,通常用于显示临时的通知...

    自定义右上角带叉号Dialog Android 自定义layout Dialog

    Dialog是Android系统提供的一种轻量级窗口,它浮现在当前Activity之上,用于显示临时信息或者进行用户交互。在Android中,我们通常使用`AlertDialog`或`DialogFragment`来创建对话框,但这些内置的对话框可能无法...

Global site tag (gtag.js) - Google Analytics