构建灵活的自定义Dialog

1)可以参考Wifip2pService, Invatation

     在layout中,可以建立一个LinearLayout,对应一个ViewGroup,然后再写一个item的xml,通过addView的方式加入到Dialog所在的Window中

2)可以参照这篇文章:http://hi.baidu.com/glzlaohuai/item/b1be05140ab13c21f7625c23 里面有详细的自定义style过程

3)完全自己写layout,layout文件就不写了,可以通过下面的方式显示出来

ContextmContext = getApplicationContext();
Dialog dialog = newDialog(mContext);
dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("CustomDialog");
TextView text = (TextView)dialog.findViewById(R.id.text);
text.setText("Hello, this isa custom dialog!");
ImageView image = (ImageView)dialog.findViewById(R.id.image);
image.setImageResource(R.drawable.android);

4) 利用WindowManager的addView来做,4)和5)比较相近,4)比较灵活,5)比较简单但是生成的对话框不能完全定制

protected WindowManager.LayoutParams getDongleLayoutParams() {
        boolean opaque = false;
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY,
            0
            | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
            | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
            | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
            (opaque ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT));
        // this will allow the navbar to run in an overlay on devices that support this
        if (ActivityManager.isHighEndGfx()) {
            lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
        } else {
            lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
            lp.dimAmount = 0.75f;
        }

        lp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
        lp.y = 20;  // 距离底部的距离20dp

        lp.setTitle("Dongle-connect");
        lp.windowAnimations = 0;
        return lp;
    }

      然后通过WindowManager的addView把panel显示出来,浮动窗口的做法也可以采取这种办法,这样做的好处是没有dialog的标题栏,并且可以控制窗口的透明度,颜色,达到任何自定义的效果

    public void addPanel() {
        if (!mAdded && mView != null) {
            Log.d(TAG, "addPanel");
            WindowManager.LayoutParams lp = getDongleLayoutParams();
            mWindowManager.addView(mView, lp);
            resetTimeout(); // 定时消失
        }
        mAdded = true;
    }

    public void removePanel() {
        Log.d(TAG, "removePanel");
        if (mAdded && mView != null) {
            Log.d(TAG, "removePanel 001");
            mWindowManager.removeView(mView);
            mView = null;
        }
        mAdded = false;
    }
5) 可以参考VolumePanel来做,写一个类似的Panel,核心的代码如下:

            mDialog = new Dialog(context) {
                public boolean onTouchEvent(MotionEvent event) {
                    return true;
                }
            };
            mDialog.setTitle("Dongle connectting info"); // No need to localize
            mDialog.setContentView(mView);
            mDialog.setOnDismissListener(new OnDismissListener() {
                public void onDismiss(DialogInterface dialog) {
                    }
                });
            
            // Change some window properties
            Window window = mDialog.getWindow();
            window.setGravity(Gravity.TOP);
            LayoutParams lp = window.getAttributes();
            lp.token = null;
            // Offset from the top
            lp.y = mContext.getResources().getDimensionPixelOffset(
                    com.android.internal.R.dimen.volume_panel_top);
            lp.type = LayoutParams.TYPE_VOLUME_OVERLAY;
            lp.width = LayoutParams.WRAP_CONTENT;
            lp.height = LayoutParams.WRAP_CONTENT;
            lp.privateFlags |= LayoutParams.PRIVATE_FLAG_FORCE_SHOW_NAV_BAR;
            window.setAttributes(lp);
            window.addFlags(LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

            mDialog.show();

6) progressDialog的使用(转载)

一个ProgressDialog(进度对话框)AlertDialog的扩展。它可以显示一个进度的动画——进度环或者进度条。这个对话框也可以提供按钮,例如取消一个下载等。
  打开一个进度对话框很简单,只需要调用ProgressDialog.show()即可。例如,上图的对话框可以不通过onCreateDialog(int),而直接显示:
  ProgressDialogdialog = ProgressDialog.show(MyActivity.this, "",
  "Loading.Please wait...",true);
  第一个参数是应用程序上下文。第二个为对话框的标题(这里为空),第三个为对话框内容,最后一个为该进度是否为不可确定的(这只跟进度条的创建有关,见下一节)。
  进度对话框的默认样式为一个旋转的环。如果你希望显示进度值,请看下一节。
  Showinga progress bar显示进度条
  使用一个动画进度条来显示进度:
  使用ProgressDialog(Context)构造函数来初始化一个ProgressDialog对象。
  将进度样式设置为"STYLE_HORIZONTAL",使用setProgressStyle(int)方法。并且设置其它属性,例如内容等。
  在需要显示时调用show()或者从onCreateDialog(int)回调函数中返回该ProgressDialog
  你可以使用setProgress(int)或者incrementProgressBy(int)来增加显示的进度。
  例如,你的设置可能像这样:ProgressDialogprogressDialog;
progressDialog = newProgressDialog(mContext);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(false);
  设置很简单。大部分创建进度对话框需要的代码是在更新它的进程中。你可能需要在一个新的线程中更新它,并使用Handler来将进度报告给Activity


你可能感兴趣的:(构建灵活的自定义Dialog)