Android造轮子遇到的坑:自定义Dilaog,AlertDialog黑边,设置宽度,高度等问题(亲测有效)

前言

        可能有很多猿兄遇到和我类似的情况,就是项目中用到了很多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();
	}

}

附上一张完美效果图:

猜你喜欢

转载自blog.csdn.net/mawei7510/article/details/89180730