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。