前言
可能有很多猿兄遇到和我类似的情况,就是项目中用到了很多Dialog, 有些Dilaog的风格并不是统一的,虽然不影响功能,但是使用起来体验还是不好. 这不最近有点时间了, 着手统一项目中的所有Dialog的风格,及封装. 如有错误的地方,欢迎大家拍砖!
一. AlertDialog踩坑,出现背景黑边的情况
- 因为代码里面AlertDialog用的比较多,所以想统一用AlertDilaog,但是出现了背景黑色的问题
- 有一下几种解决方案,但是没有好的效果,最后就放弃了AlertDialog
- 解决方法一: "然并卵"
mDialog.setView(view,0,0,0,0);
- 解决方法二:通过Theme来解决,但是效果不好,没有圆角效果,果断放弃
<!-- styles.xml on API 14+ devices -->
<style name="SampleTheme.Light" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:windowNoTitle">true</item>
</style>
<activity android:name="com.kesar.ui.MainActivity"
android:theme="@style/SampleTheme.Light"/>
- 解决方法三: 配置dialog style, 网上有些猿兄说有效果,但是 我的没有效果,大家试试看
<style name="AlertDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
二. Dialog踩坑,设置宽高问题
- 由于以上的问题,弃用了AlertDialog,选用了Dialog, 可以完全满足需求,没有黑边,也有圆角, 但是猿们的需求是无限的, 我想自定义Dilaog宽高,试用了几种网上的方法没有用,列出来,大家试试
方法一: 无效
WindowManager windowManager = getActivity().getWindowManager();
Display display = windowManager.getDefaultDisplay();
WindowManager.LayoutParams lp = dialogAppStoreUpdate.getWindow().getAttributes();
lp.width = (int) (display.getWidth()); //设置宽度
dialogAppStoreUpdate.getWindow().setAttributes(lp);
方法二: 无效
//设置大小
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
dialog.getWindow().setLayout(dm.widthPixels, dialog.getWindow().getAttributes().height);
方法三: 亲测有效 ,代码见 DialogHelper.getDialog()
<style name="AlertDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
Dialog弹出动画
<style name="Animation.Dialog.ShowDialog" parent="@android:style/Animation">
<item name="android:windowEnterAnimation">@anim/dialog_in</item>
<item name="android:windowExitAnimation">@anim/dialog_out</item>
</style>
dialog_in
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:shareInterpolator="true">
<alpha
android:fromAlpha="0.2"
android:toAlpha="1"
android:duration="90"/>
<scale
android:fromXScale="0.7"
android:toXScale="1.05"
android:fromYScale="0.7"
android:toYScale="1.05"
android:pivotX="50%"
android:pivotY="50%"
android:duration="135"/>
<scale
android:fromXScale="1.05"
android:toXScale="0.95"
android:fromYScale="1.05"
android:toYScale="0.95"
android:pivotX="50%"
android:pivotY="50%"
android:duration="105"
android:startOffset="135"/>
<scale
android:fromXScale="0.95"
android:toXScale="1"
android:fromYScale="0.95"
android:toYScale="1"
android:pivotX="50%"
android:pivotY="50%"
android:duration="60"
android:startOffset="240"/>
</set>
dialog_out
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:shareInterpolator="true">
<scale
android:fromXScale="1"
android:toXScale="0.6"
android:fromYScale="1"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:duration="150"/>
</set>
public void showModiSimDialog(DeviceInfo device) {
Dialog mDialog = DialogHelper.getDialog(this);
View contentView = View.inflate(this, R.layout.dialog_update_device_sim, null);
final TextView tvTitle = contentView.findViewById(R.id.tv_title);
tvTitle.setText("修改设备SIM卡号(11-13位)");
etNumber = contentView.findViewById(R.id.et_number);
etNumber.setText(device.mdn);
etNumber.setSelection((device.mdn).length());
etNumber.setHint("请输入11-13位SIM卡号");
contentView.findViewById(R.id.tv_phonebook).setOnClickListener(view -> {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, REQUEST_GET_CONTACT);
});
contentView.findViewById(R.id.btn_confirm).setOnClickListener(v -> {
//et_sim在布局中限制了,只能是数字 此处不做判断了,因为有物联网卡,首字母不确定
final String number = etNumber.getText().toString().trim();
//长度为11-13的数字
if (!TextUtils.isEmpty(number) && number.length() > 10 && number.length() < 14) {
mDialog.dismiss();
dvPresenter.requestModiSim(number);
} else {
showShortTips(R.string.format_sim_11_13);
}
});
contentView.findViewById(R.id.btn_cancel).setOnClickListener(v -> mDialog.dismiss());
mDialog.setContentView(contentView);
mDialog.show();
}
public class DialogHelper {
/**
* AlertDialog setView在show前面 setContentView在show后面
*/
public static AlertDialog getAlertDialog(Context context){
AlertDialog alertDialog = new AlertDialog.Builder(context).create();
alertDialog.getWindow().setWindowAnimations(R.style.Animation_Dialog_ShowDialog);
return alertDialog;
}
public static Dialog getDialog(Context context){
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
Dialog dialog = new Dialog(context, R.style.AlertDialogStyle);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int) (display.getWidth() * 0.85), FrameLayout.LayoutParams.WRAP_CONTENT);
dialog.getWindow().getDecorView().findViewById(android.R.id.content).setLayoutParams(params);
dialog.getWindow().setWindowAnimations(R.style.Animation_Dialog_ShowDialog);
return dialog;
}
public static AlertDialog showMsgDialog(Context context,int msgId){
return new AlertDialog.Builder(context).setMessage(msgId).show();
}
}
附上一张完美效果图: