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才能起作用,这个也是一个坑。

上一篇 下一篇

猜你喜欢

热点阅读