android 自定义dialog小米华为机型适配问题
2016-08-18 本文已影响764人
AndyJue
在开发项目时,ui和ux提出需要统一app的弹出框样式的需求,拿到这个需求之后,考虑做一个定制的 alertdialog 来实现这个需求,由于这个dialog的式样是圆角矩形的白色背景,所以写了如下代码来设置:
mCustomDialog = new AlertDialog.Builder(this).create();
View view = getLayoutInflater().inflate(R.layout.base_alertdialog, null);
TextView titleTv = (TextView) view.findViewById(R.id.dialog_title);
TextView contentTv = (TextView) view.findViewById(R.id.dialog_content);
TextView okBtn = (TextView) view.findViewById(R.id.positive_btn);
TextView cancelBtn = (TextView)view.findViewById(R.id.negative_btn);
titleTv.setText(title);
contentTv.setText(content);
okBtn.setText(okText);
cancelBtn.setText(cancelText);
okBtn.setOnClickListener(okBtnClickListener);
cancelBtn.setOnClickListener(cancelBtnClickListener);
mCustomDialog.setView(view);
mCustomDialog.setCancelable(true);
mCustomDialog.show();
Point point = new Point();
getWindowManager().getDefaultDisplay().getSize(point);
int width = point.x;width = width - UIUtil.dip2px(this, 60);
WindowManager.LayoutParams params = mCustomDialog.getWindow().getAttributes();
params.width = width;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.CENTER;
mCustomDialog.getWindow().setAttributes(params);
//给dialog的窗口设置一个空背景,这样圆角背景能得到正确显示
mCustomDialog.getWindow().setBackgroundDrawable(new BitmapDrawable());
layout:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@drawable/background_alertdialog"
android:paddingBottom="30dp"
android:layout_height="wrap_content">
<TextView
android:layout_marginTop="30dp"
android:textSize="17sp"
android:textStyle="bold"
android:textColor="#333333"
android:text="提示"
android:layout_centerHorizontal="true"
android:id="@+id/dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:text=""
android:textColor="#777777"
android:textSize="15sp"
android:lineSpacingExtra="10dp"
android:layout_marginTop="30dp"
android:gravity="center"
android:layout_below="@id/dialog_title"
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:id="@+id/dialog_content"
android:layout_marginBottom="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_below="@id/dialog_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:visibility="visible"
android:background="@drawable/negative_btn_bg"
android:layout_marginRight="20dp"
android:id="@+id/negative_btn"
android:text="取消"
android:textColor="#777777"
android:textSize="17sp"
android:gravity="center"
android:layout_width="120dp"
android:layout_height="34dp" />
<TextView
android:background="@drawable/positive_btn_bg"
android:layout_toRightOf="@id/negative_btn"
android:id="@+id/positive_btn"
android:text="确定"
android:textColor="#ff8447"
android:textSize="17sp"
android:gravity="center"
android:layout_width="120dp"
android:layout_height="34dp" />
</RelativeLayout>
</RelativeLayout>
背景:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white"/>
<corners android:radius="8dp" />
</shape>
但是这样存在一个机型适配的问题,在华为和红米手机上这种设置的圆角矩形背景不适用,为了解决这个问题,查了下网上的解决方案,最后还是决定用一个自定义的dialog 并自定义style来解决这个问题:
public class PADialog extends Dialog {
private Context context;
private TextView okBtn;
private TextView cancelBtn;
private TextView titleTv;
private TextView contentTv;
private static int mTheme = R.style.PADialog;
public PADialog(Context context) {
super(context, mTheme);
this.context = context;
}
public PADialog(Context context, int theme) {
super(context, theme);
this.context = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.base_alertdialog);
okBtn = (TextView) findViewById(R.id.positive_btn);
cancelBtn = (TextView) findViewById(R.id.negative_btn);
titleTv = (TextView) findViewById(R.id.dialog_title);
contentTv = (TextView) findViewById(R.id.dialog_content);
}
public void setAllText(String title, String content, String okBtnText, String cancelBtnText) {
if (!TextUtils.isEmpty(title)) {
titleTv.setText(title);
}
if (!TextUtils.isEmpty(content)) {
contentTv.setText(content);
}
if (!TextUtils.isEmpty(okBtnText)) {
okBtn.setText(okBtnText);
}
if (!TextUtils.isEmpty(cancelBtnText)) {
cancelBtn.setText(cancelBtnText);
}
}
public void setClickListener(View.OnClickListener okClickListener, View.OnClickListener cancelClickListener) {
okBtn.setOnClickListener(okClickListener);
if (cancelClickListener != null) {
cancelBtn.setVisibility(View.VISIBLE); cancelBtn.setOnClickListener(cancelClickListener);
}
else {
cancelBtn.setVisibility(View.GONE);
}
}
}
style:
<!--自定义dialog style-->
<style name="PADialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<!--<item name="android:backgroundDimEnabled">true</item>-->
<!--<item name="android:backgroundDimAmount">0.6</item>-->
</style>
因为小米和华为系统在改变了系统层面的alertdialog的style,所以在外层修改它的背景什么的都是不起作用的,自定义一个继承于dialog的自定义dialog并自定义style才能达到预期的效果,另外小米1s上dialog的布局设置底部margin无效只能设置底部的padding才能起作用,这个也是一个坑。