今日头条适配方案造成Dialog显示异常的解决方法
产生问题的原因
由于该适配方案是更改的全局的density, 对整个项目生效,所以在使用第三方View或者系统的的view时,如果和项目中的设计尺寸差别很大,就会出现很严重的UI问题。
解决办法
- 方法一: 尽量所有的视图都使用自定义的视图。
- 方法二: 更改原生Dialog的大小。
代码示例一: 根据屏幕宽度, 更改原生Dialog的比例
/**
* 显示取消/确认的dialog
*/
public void showConfirmDialog(int title, int positiveButtonText, int negativeButtonText, ConfirmDialogCallback callback) {
if (mActivity == null) return;
mAlertDialog = new AlertDialog.Builder(mActivity).setTitle(title).setCancelable(false)
.setPositiveButton(positiveButtonText, (dialogInterface, i) -> {
if (callback != null)
callback.confirm();
}).setNegativeButton(negativeButtonText, (dialogInterface, i) -> {
if (callback != null)
callback.cancel();
}).show();
if (mAlertDialog.getWindow() != null) {
WindowManager.LayoutParams lp = mAlertDialog.getWindow().getAttributes();
lp.width = mActivity.getWindowManager().getDefaultDisplay().getWidth() / 10 * 8; // 宽度,可根据屏幕宽度进行计算
lp.gravity = Gravity.CENTER;
mAlertDialog.getWindow().setAttributes(lp);
}
}
代码示例二: 重写 AlertDialog.Builder,把项目的设计尺寸给原生的Dialog
public class BaseAlertDialogBuilder extends AlertDialog.Builder {
/**
* 设计图尺寸
*/
private static final float ALERT_BASE_WIDTH = 420f;
public BaseAlertDialogBuilder(@NonNull Context context) {
super(adjustAutoSize(context));
}
public BaseAlertDialogBuilder(@NonNull Context context, int themeResId) {
super(adjustAutoSize(context), themeResId);
}
private static Context adjustAutoSize(Context context) {
return new ContextWrapper(context) {
private Resources mResources;
{
Resources oldResources = super.getResources();
mResources = new Resources(oldResources.getAssets(), oldResources.getDisplayMetrics(), oldResources.getConfiguration());
}
@Override
public Resources getResources() {
// 根据横竖屏状态需要更改。
AutoSizeCompat.autoConvertDensityBaseOnWidth(mResources, ALERT_BASE_WIDTH);
// AutoSizeCompat.autoConvertDensityBaseOnHeight(mResources, ALERT_BASE_WIDTH);
return mResources;
}
};
}
}