本文通过实例为大家讲解如何自定义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

更多相关文章

  1. C语言函数的递归(上)
  2. android启动--深入理解启动HOME
  3. Android(安卓)源码分析之旅3.1--消息机制源码分析
  4. Android(安卓)sqlite 采用execSQL和rawQuery方法完成数据的添删
  5. android适配器SimpleCursorAdapter的使用以及最后一个参数的作用
  6. Android(安卓)HandlerThread用法
  7. 在eclipse中添加插件Green UML
  8. 【Android】学习笔记(9)——SQLite简单使用
  9. 详解Android轻量型数据库SQLite

随机推荐

  1. Android Relative Layout 安卓相对布局详
  2. JDK与adb/android环境变量配置完整教程
  3. android——退出程序的功能,关闭所有本程
  4. 重新审视 Android
  5. android语音识别接科大讯飞sdk
  6. Android异步消息处理机制详解及源码分析
  7. Android五层架构
  8. 如何解决:Android中 Error generating fin
  9. Android中XML解析-SAX解析
  10. 中国Android应用商店汇总介绍