1.背景:alertdialog的弹出,想设置成全屏,而且不想用popuwindow,还有就是在布局里设置好了之后,就是不行。
解决:
查找资料,发现都是先show,在动态设计大小,在生成的时候,就是可以设置主题。
2.来上代码:
2.1view的代码
public class CustomProgressDialog extends ProgressDialog {
private Context mContext;
private ImageView mImageView;
private String mLoadingTip;
private TextView mLoadingTv;
private int count = 0;
private String oldLoadingTip;
private int mResid;
private AnimationDrawable mAnimation;
// public CustomProgressDialog(Context context) {
// super(context);
// this.mContext=context;
// setCanceledOnTouchOutside(true);
// }
public CustomProgressDialog(Context context, String content,int theme, int id) {
super(context,theme);
this.mContext = context;
this.mResid = id;
this.mLoadingTip = content;
this.setCanceledOnTouchOutside(false);
}
public CustomProgressDialog(Context context, String content, int id) {
super(context);
this.mContext = context;
this.mResid = id;
this.mLoadingTip = content;
this.setCanceledOnTouchOutside(false);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_custom_dialog);
initView();
initData();
}
private void initData() {
mImageView.setBackgroundResource(mResid);
mLoadingTv.setText(mLoadingTip);
// 通过ImageView对象拿到背景显示的AnimationDrawable
mAnimation = (AnimationDrawable) mImageView.getBackground();
// 为了防止在onCreate方法中只显示第一帧的解决方案之一
mImageView.post(new Runnable() {
@Override
public void run() {
mAnimation.start();
}
});
}
private void initView() {
mLoadingTv = (TextView) findViewById(R.id.loadingTv);
mImageView = (ImageView) findViewById(R.id.loadingIv);
}
}
2.2主题代码,写到style
<!--加载进度对话框样式-->
<style name="Dialog_Fullscreen">
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
<!--<item name="android:windowIsTranslucent">false</item><!–半透明–>-->
<!--<item name="android:windowBackground">@android:color/transparent</item><!–背景透明–>-->
<!--<item name="android:backgroundDimEnabled">true</item><!–模糊–>-->
</style>
2.3布局代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e7e7e7">
<ImageView
android:id="@+id/loadingIv"
android:layout_alignParentTop="true"
android:layout_marginTop="180dp"
android:layout_width="90dp"
android:layout_centerHorizontal="true"
android:layout_height="90dp" />
<TextView
android:id="@+id/loadingTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/loadingIv"
android:layout_marginTop="15dp"
android:layout_centerHorizontal="true"
android:textSize="20sp"
android:text="加载中..." />
</RelativeLayout>
2.4在activity中使用
使用时,发现在,部分带虚拟按键的手机,效果不佳,当虚拟按键弹出时,和消失后,弹出的dialog大小不一样,这种情况不能使用。
必须获取真正屏幕的高宽,
就查了一下,api,发现17之后,有新方法。
getHeight,getWidth在api 13之后过期
获得真正的屏幕大小
在oncreat中使用:
//正在加载的dialog
dialogLoading = new CustomProgressDialog(this,"加载中...",R.style.Dialog_Fullscreen, R.drawable.dialog_loading);
/**控制dialog的显示和隐藏
* @param dialog
* @param isDisplay true 展示,false 显示
*/
public void showDialog(Dialog dialog,boolean isDisplay){
if(isDisplay){
dialog.show();
//获取对话框当前的参数值
android.view.WindowManager.LayoutParams p = dialog.getWindow().getAttributes();
// 动态设置自定义Dialog的显示内容的宽和高
if(Build.VERSION.SDK_INT<17){
//自动减去虚拟按键的高度
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("Android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
method.invoke(display, dm);
}catch(Exception e){
e.printStackTrace();
}
p. width = dm.widthPixels;
p.height = dm.heightPixels;
} else if (Build.VERSION.SDK_INT >= 17) {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(dm);
p.width = dm.widthPixels; // 屏幕宽
p.height = dm.heightPixels; // 屏幕高
}
dialog.getWindow().setAttributes(p); //设置生效
}else if(dialog.isShowing()){
dialog.dismiss();
}
}
写的这么清晰,demo就不发了;