`
javacode23
  • 浏览: 29265 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android 创建自定Dialog

阅读更多
本文通过实例为大家讲解如何自定义DIALOG,希望对大家有所帮助。

一、如何实现自己定义的对话框

在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



  }



  }


原文出处:http://www.eoeandroid.com/thread-70061-1-1.html
分享到:
评论

相关推荐

    Android自定漂亮Dialog中嵌入ListView

    在Android开发中,有时我们需要创建具有独特样式和功能的对话框(Dialog)来提供更好的用户体验。本教程将探讨如何在Android中自定义一个美观的Dialog,并在其内部嵌入一个ListView,以便展示更多信息。这个自定义...

    Android五种显示Dialog的方法实现

    在Android开发中,Dialog是一种非常常见的用户界面组件,它用于在主界面之上显示临时信息或者进行简单的交互。本文将详细讲解五种不同的方法来在Android应用中实现Dialog,并结合源码进行解析。 1. **AlertDialog**...

    Android自定义Dialog带分隔的8位输入框按钮回调输入值部分代码

    接下来,我们需要创建自定义Dialog类,继承自`AlertDialog.Builder`,并重写`onCreateView()`方法来加载我们的自定义布局。在该类中,我们将添加一个接口来处理回调: ```java public class CustomInputDialog { ...

    android 磨砂透明效果的dialog

    创建一个新的Dialog类,继承自`AppCompatDialog`。在这个类中,覆盖`onCreate()`方法,加载你刚刚创建的布局,并设置Dialog的属性,如宽度、高度以及是否允许用户触摸Dialog外部区域关闭它。 5. **处理触摸事件** ...

    android自定义dialog下载

    2. **创建Dialog类**: 创建一个继承自AppCompatDialogFragment的类。在这个类中,重写onCreateDialog()方法,这里将加载刚刚创建的布局并构建Dialog实例。示例代码如下: ```java public class ...

    Android支付底部弹窗自定义dialog

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

    android dialog进度对话框

    创建自定义的进度对话框,首先需要继承自`AlertDialog.Builder`或直接使用`ProgressDialog`。`AlertDialog.Builder`允许我们自定义对话框的标题、消息、按钮等元素,而`ProgressDialog`则专门用于显示带有进度条的...

    android dialog向上弹效果

    在Android开发中,Dialog是一种常见的用户交互界面,用于显示临时信息或者进行简单的用户操作。"android dialog向上弹效果"指的是在展示Dialog时,通过动画使其从屏幕下方向上弹出,给用户带来更生动、自然的视觉...

    Android带动画对话框Dialog

    在Android开发中,Dialog是一种非常重要的组件,它...通过掌握上述知识,开发者可以创建出既美观又实用的Dialog,提升Android应用的用户体验。记得在实践中不断试验和调整,找到最适合应用风格和用户需求的动画效果。

    底部自定以dialog添加recyclerView

    自定义滑动条控件(SeekBar)通常需要继承自Android的SeekBar类,并重写一些方法,如onProgressChanged(),以便在滑动条滑动时执行相应的动作。在这个项目中,滑动条的值被用来更新Activity中的状态,可能涉及到...

    android 二维码扫描 及自定义dialog时间处理

    在这个精简版的实现中,我们将探讨如何在Android应用中集成Zxing库进行二维码扫描,并且创建自定义Dialog来处理时间展示。 首先,我们需要在项目中引入Zxing库。如果你使用的是Gradle构建系统,可以在app的build....

    安卓Android源码——所有Dialog对话框.rar

    这份"安卓Android源码——所有Dialog对话框.rar"压缩包很可能包含了各种类型的Dialog实现,这对于我们理解Android系统中Dialog的工作原理以及自定义Dialog的实现方法非常有帮助。 首先,我们要知道Dialog是基于...

    Android之实现带动画加载状态的Dialog

    在Android开发中,Dialog是一种非常常见的用户界面组件,它用于向用户展示临时信息或进行交互操作,例如提示、警告、确认等。当我们需要在应用程序中显示一个正在加载数据的指示器时,一个带有动画效果的加载状态...

    android 全局dialog,兼容android 8.0新特性

    - 对于Android 8.0及以上版本,创建通知渠道(Notification Channel)是必不可少的,即使我们的目标是显示Dialog而非通知。这是因为Dialog通常与系统通知有关联,创建渠道可以避免因未设置渠道而导致的通知问题。 - ...

    Android之UI--打造12种不同Dialog对话框

    在Android开发中,UI设计是至关重要的一环,而Dialog对话框则是用户交互界面中的常见元素。本文将深入探讨如何打造12种不同类型的Dialog对话框,以满足各种场景下的需求。通过阅读CSDN博主dickyqie的文章,我们可以...

    Android Dialog.pdf

    在Android开发中,Dialog是一种非常重要的UI组件,用于在用户与当前Activity交互过程中提供额外的信息或功能。对话框通常出现在Activity之上,使底层Activity失去焦点,以便用户专注于对话框中的内容。Android API...

    android dialog的使用

    `DialogFragment`是Android支持库的一部分,它继承自`Fragment`,并实现了`DialogInterface.OnDismissListener`接口。 总之,Android Dialog是与用户交互的重要工具。理解并熟练运用各种Dialog类型和自定义方法,...

    安卓Android源码——android-styled-dialogs 可自定义样式的dialog.rar

    `android-styled-dialogs` 是一个专门为 Android 设计的库,允许开发者轻松创建具有自定义样式的 Dialog。这个压缩包文件 `android-styled-dialogs-master` 包含了这个库的源代码,对于学习和理解如何自定义 Android...

    自定义带两个按钮的Dialog-修改

    在Android开发中,自定义Dialog是一种常见的需求,它允许开发者根据应用的UI风格和功能需求创建独特的对话框。本文将详细讲解如何实现一个带有两个按钮的自定义Dialog,并结合"DefinedDialog"这个压缩包文件中的内容...

Global site tag (gtag.js) - Google Analytics