Android今日头条适配方案对AlertDialog的影响

AndroidAutoSize实战教程:今日头条屏幕适配方案详解 通过 AndroidAutoSize 库来实现屏幕适配,确保在不同的屏幕尺寸、分辨率、密度下,应用界面和广告(如果涉及)能正常显示,特别是在字体、布局、图标等方面的适配。今日头条的屏幕适配方案,如果项目需求不涉及横竖屏切换,且不需要做平板适配,AndroidAutoSize 方案有一定的适用性,尤其是在应对多种屏幕尺寸和密度的情况下。AutoSize 会自动处理不同屏幕密度的适配,确保你的应用在 hdpi、mdpi、xhdpi 等不同的屏幕密度下能够正常显示。单位,这样可以确保字体在不同设备上适配。 阅读详情

Android今日头条适配方案对AlertDialog的影响

前言

前段时间维护公司老项目时发现系统弹框显示不全,右边总是会少一部分,手机比较窄的直接只显示一半.然后找了半天才发现是使用的今日头适配方案。

今日头适配方案

先来说今日头适配方案,简单来说就是直接修改Activity的density值。但是我们在调用AlertDialog弹框时是不会去使用的这个density值,就会导致我的弹框超出屏幕。

使用:
在Application的onCreate方法中调用setDensity,并自己设定一个width,width是一个UI图的参照值,单位是dp,例如参照的是1280*720像素的XHDPI图,width就是720/2 = 360,这个根据你拿到的实际设计图来计算。
然后我们来看下px与dp的转换
在这里插入图片描述
不过现在我们可以不用直接去写Density类了,有大佬给你封装好了,拿去直接用,而且提供了取消适配的接口。传送门,具体的使用方法可以参考。

Density类

 	private static float appDensity;
    private static float appScaledDensity;
    private static DisplayMetrics appDisplayMetrics;
    /**
     * 用来参照的的width
     */
    private static float WIDTH;

    public static void setDensity(@NonNull final Application application, float width) {
        appDisplayMetrics = application.getResources().getDisplayMetrics();
        WIDTH = width;
        registerActivityLifecycleCallbacks(application);
        if (appDensity == 0) {
            //初始化的时候赋值
            appDensity = appDisplayMetrics.density;
            appScaledDensity = appDisplayMetrics.scaledDensity;

            //添加字体变化的监听
            application.registerComponentCallbacks(new ComponentCallbacks() {
                @Override
                public void onConfigurationChanged(Configuration newConfig) {
                    //字体改变后,将appScaledDensity重新赋值
                    if (newConfig != null && newConfig.fontScale > 0) {
                        appScaledDensity = application.getResources().getDisplayMetrics().scaledDensity;
                    }
                }
                @Override
                public void onLowMemory() {
                }
            });
        }
    }
    private static void setDefault(Activity activity) {
        setAppOrientation(activity);
    }
    private static void setAppOrientation(@Nullable Activity activity) {
        float targetDensity = 0;
        try {
            targetDensity = appDisplayMetrics.widthPixels / WIDTH;
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        float targetScaledDensity = targetDensity * (appScaledDensity / appDensity);
        int targetDensityDpi = (int) (160 * targetDensity);

        /**
         *
         * 最后在这里将修改过后的值赋给系统参数
         *
         * 只修改Activity的density值
         */
        DisplayMetrics activityDisplayMetrics = activity.getResources().getDisplayMetrics();
        activityDisplayMetrics.density = targetDensity;
        activityDisplayMetrics.scaledDensity = targetScaledDensity;
        activityDisplayMetrics.densityDpi = targetDensityDpi;
    }
    private static void registerActivityLifecycleCallbacks(Application application) {
        application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                setDefault(activity);
            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {
            }
            @Override
            public void onActivityPaused(Activity activity) {
            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }

AlertDialog

简单介绍一下AlertDialog,它是其他 Dialog的的父类!比如ProgressDialog,TimePickerDialog等,而AlertDialog的父类是:Dialog! 另外AlertDialog并不能直接new出来,如果你打开 AlertDialog的源码,会发现构造方法是protected的,如果我们要创建AlertDialog的话,我们 需要使用到该类中的一个静态内部类:public static class Builder,然后来调用AlertDialog 里的相关方法,来对AlertDialog进行定制,最后调用show()方法来显示我们的AlertDialog对话框。

回到我们的问题:调用AlertDialog弹框时没有使用的Avtiaity的density值,那么问题又来了,那自定义的Dialog,是不是也是这样呢?

我们先写一个AlertDialog

	 public static AlertDialog.Builder getDialog(Context context) {
	        return new AlertDialog.Builder(context, R.style.App_Theme_Dialog_Alert);
	 }

  	 public static AlertDialog.Builder getMessageDialog(
            Context context,
            String title,
            String message,
            boolean cancelable) {
        return getDialog(context)
                .setCancelable(cancelable)
                .setTitle(title)
                .setMessage(message)
                .setPositiveButton("确定", null);
    }

在写一个自定义的Dialog


public class ConfirmDialog extends Dialog {
    private Context context;
    private String content;
    private View sLine;
    private View inflate;
    private TextView dialog_textView, dialog_sure, dialog_cancel;
    private OnDialogInterfaceClickListener sureClickListener, cancelClickListener;
    private boolean outSide = true;
    private String strSureText = "确定",strCancelText = "取消";
    private boolean isShowSureView = true,isShowCancelView = true,isShowLineView = true;

    public ConfirmDialog(@NonNull Context context) {
        super(context, R.style.ActionSheetDialogStyle);
        this.context = context;
    }
    public ConfirmDialog setOnSureClickListener(OnDialogInterfaceClickListener sureClickListener){
        this.sureClickListener = sureClickListener;
        return this;
    }
    public ConfirmDialog setCanOutSide(boolean outSide){
        this.outSide = outSide;
        return this;
    }
    public ConfirmDialog setOnCancelClickListener(OnDialogInterfaceClickListener cancelClickListener){
        this.cancelClickListener = cancelClickListener;
        return this;
    }
    public ConfirmDialog setMessage(String message){
        this.content = message;
        return this;
    }
    public ConfirmDialog setSureText(String strSureText){
        this.strSureText = strSureText;
        return this;
    }
    public ConfirmDialog setCancelText(String strCancelText){
        this.strCancelText = strCancelText;
        return this;
    }
    public ConfirmDialog setShowSureView(boolean isShowSureView){
        this.isShowSureView = isShowSureView;
        this.isShowLineView = this.isShowSureView;
        return this;
    }
    public ConfirmDialog setShowCancelView(boolean isShowCancelView){
        this.isShowCancelView = isShowCancelView;
        this.isShowLineView = this.isShowCancelView;
        return this;
    }

    public ConfirmDialog builder() {
        initView();
        return this;
    }

    private void initView() {
        inflate = LayoutInflater.from(context).inflate(
                R.layout.sure_cancel_dialog, null);
        // 初始化控件
        dialog_textView = inflate.findViewById(R.id.dialog_textView);
        dialog_sure = inflate.findViewById(R.id.dialog_sure);
        dialog_cancel = inflate.findViewById(R.id.dialog_cancel);
        sLine = inflate.findViewById(R.id.s_line);
        dialog_sure.setText(strSureText);
        dialog_cancel.setText(strCancelText);

        if(!isShowLineView)
            sLine.setVisibility(View.GONE);
        if(!isShowCancelView)
            dialog_cancel.setVisibility(View.GONE);
        if(!isShowSureView)
            dialog_sure.setVisibility(View.GONE);

        if (sureClickListener != null) {
            dialog_sure.setOnClickListener(v -> {
                dismiss();
                sureClickListener.onDialogClick(this);
            });
        } else {
            dialog_sure.setOnClickListener(v -> dismiss());
        }

        if (cancelClickListener != null) {
            dialog_cancel.setOnClickListener(v -> {
                dismiss();
                cancelClickListener.onDialogClick(this);
            });
        } else
            dialog_cancel.setOnClickListener(v -> dismiss());
        dialog_textView.setText(content);
        setCanceledOnTouchOutside(outSide);
        setContentView(inflate);
    }

}

结果如下
在这里插入图片描述
????????为啥呢
看了一下代码,找到了自动定义Dialog中的setContentView(inflate),我们set了一个我们的自定义的一个View,这个View是我们使用适配方案后的产物,而AlertDialog是使用的原生系统的View,好吧破案了。

 inflate = LayoutInflater.from(context).inflate(
                R.layout.sure_cancel_dialog, null);


 setContentView(inflate);

解决方案

 public static void getMessageDialog(
            Context context,
            String message,
            boolean cancelable, DialogInterface.OnClickListener positiveListener) {
        AlertDialog dialog = new AlertDialog.Builder(context).create();
        dialog.setCancelable(cancelable);
        dialog.setMessage(message);
        dialog.setButton(AlertDialog.BUTTON_POSITIVE, "确定", positiveListener);
        dialog.show();
        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
//设置宽高,高度默认是自适应的,宽度根据屏幕宽度比例设置
        lp.width = ScreenUtils.getScreenWidth(context) * 9 / 10;
//这里设置居中
        lp.gravity = Gravity.CENTER;
        dialog.getWindow().setAttributes(lp);
    }

我们在AlertDialog 的show()方法后设置dialog的弹出位置,这样我们就可以不管系统的原生View就可以把他固定到当前Avtivity上了,当然Dialog也可以这么做。ScreenUtils.getScreenWidth(context)是获取当前Activity的宽,好吧ScreenUtils工具类也贴出来吧

ScreenUtils工具类

public class ScreenUtils {
    private ScreenUtils()
    {
        /* cannot be instantiated */
        throw new UnsupportedOperationException("cannot be instantiated");
    }

    /**
     * 获得屏幕宽度
     *
     * @param context
     * @return
     */
    public static int getScreenWidth(Context context)
    {
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        return outMetrics.widthPixels;
    }

    /**
     * 获得屏幕高度
     *
     * @param context
     * @return
     */
    public static int getScreenHeight(Context context)
    {
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        return outMetrics.heightPixels;
    }

    /**
     * 获得状态栏的高度
     *
     * @param context
     * @return
     */
    public static int getStatusHeight(Context context)
    {

        int statusHeight = -1;
        try
        {
            Class<?> clazz = Class.forName("com.android.internal.R$dimen");
            Object object = clazz.newInstance();
            int height = Integer.parseInt(clazz.getField("status_bar_height")
                    .get(object).toString());
            statusHeight = context.getResources().getDimensionPixelSize(height);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return statusHeight;
    }

    /**
     * 获取当前屏幕截图,包含状态栏
     *
     * @param activity
     * @return
     */
    public static Bitmap snapShotWithStatusBar(Activity activity)
    {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bmp = view.getDrawingCache();
        int width = getScreenWidth(activity);
        int height = getScreenHeight(activity);
        Bitmap bp = null;
        bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
        view.destroyDrawingCache();
        return bp;

    }

    /**
     * 获取当前屏幕截图,不包含状态栏
     *
     * @param activity
     * @return
     */
    public static Bitmap snapShotWithoutStatusBar(Activity activity)
    {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bmp = view.getDrawingCache();
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;

        int width = getScreenWidth(activity);
        int height = getScreenHeight(activity);
        Bitmap bp = null;
        bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height
                - statusBarHeight);
        view.destroyDrawingCache();
        return bp;

    }

}
每日一学——Android屏幕适配方案分析以及头条适配原理—基于头条适配方案的框架AndroidAutoSize (一) Android屏幕适配方案之头条适配—AutoSize介绍下目前主流的适配方案头条方案适配的原理适配具体操作呈现适配效果 荒废了几天继续我的每日一篇学习博客 go go go! 介绍下目前主流的适配方案 须知: 首先,我们应该明白没有完美的适配方案,因为安卓设备真的是五花八门,宽高比差距太大,在保证页面View不变形的情况下,只能取宽度为基准,自适应的设置高度,这样造成的页面整体高度会超出屏幕高度,解决的方法就只能是设置页面滚动,避免页面内容显示不全;其次要是以高度为基准,很大情况下view会变形,比如图片 阅读详情

相关推荐

今日头条发布最终版本的屏幕适配方案!——适用于Android移动应用开发平台

不同设备的屏幕尺寸、分辨率和屏幕比例的差异,给开发人员带来了挑战。通过使用今日头条最终版本的屏幕适配方案,开发者可以更轻松地实现Android平台上的屏幕适配,提升应用在不同设备上的用户体验。除了上述基本的屏幕适配原则和示例代码,今日头条的屏幕适配方案还提供了更多的功能和工具,帮助开发者更好地实现屏幕适配。屏幕比例适配:不同设备的屏幕比例(宽高比)也可能不同,开发者需要考虑应用在不同比例下的布局效果。通过使用上述代码,开发者可以根据屏幕的宽度和高度动态调整元素的大小和位置,以适应不同设备的屏幕。

JaDentenet的博客 1006

Android今日头条的屏幕适配方案

今日头条的屏幕适配方案是一种基于动态调整设备密度(density)的适配方法,其核心原理是通过修改系统默认的屏幕密度参数,使得不同分辨率和尺寸的设备能够按照设计图的尺寸比例显示界面元素。

zhukui66的专栏 1470

DialogFragment和AndroidAutoSize 的适配问题

相关博客:【android学习开源项目之AndroidAutoSize】AndroidAutoSize和DialogFragment的适配 https://blog.youkuaiyun.com/ljb568838953/article/details/103906449; 本demo的知识点:1.AndroidAutoSize 的使用(今日头条屏幕适配方案);2.DialogFragment 的使用;3.DialogFragment 的适配(在1440*900的宽度上面显示1080*900的对话框,并适配不同屏幕);4.在android5.1上面都是正常的,在android9.0上面会出现兼容问题(显示不全);本代码为java版本,带有V7版和androidx版,带有apk,带有截图;

今日头条适配方案造成Dialog显示异常的解决方法

今日头条适配方案造成Dialog显示异常的解决方法 产生问题的原因 由于该适配方案是更改的全局的density, 对整个项目生效,所以在使用第三方View或者系统的的view时,如果和项目中的设计尺寸差别很大,就会出现很严重的UI问题。 解决办法 方法一: 尽量所有的视图都使用自定义的视图。 方法二: 更改原生Dialog的大小。 代码示例一: 根据屏幕宽度, 更改原生Dialog的比例 /** * 显示取消/确认的dialog */ public void sh

Android唐浮的专栏 1941

保姆级教程:用Arduino+MPU6050自制寻北仪(附MEMS陀螺精度测试报告)

本文提供了一份详细的Arduino与MPU6050自制寻北仪的保姆级教程,包括硬件选型、卡尔曼滤波算法优化、地磁场补偿及真北计算等关键技术。通过实测数据展示了MEMS陀螺仪在民用领域的高精度性能,帮助读者低成本实现1°以内的寻北精度。

weixin_42522964的博客 364

WPF的基础设施:XAML基础语法

XAML是WPF的核心标记语言,采用XML语法实现界面与逻辑分离。其基础语法包括:1)控件声明方式(特性语法和属性元素语法);2)x:Name与Name的区别(适用范围和编译行为);3)注释规范与代码折叠技巧;4)实用特性如属性继承、附加属性等。文章还提供了常见错误排查方法,建议通过实践练习掌握XAML开发技巧。全文系统介绍了XAML的核心语法与应用场景,是WPF开发者的基础学习指南。

Hare的博客 1756

Android屏幕适配—最易懂的今日头条适配方案解析

屏幕参数基础概念 硬件/物理参数 物理属性 名称 定义 单位 尺寸 对角线的长度 inch,约等于2.54厘米 分辨率 屏幕方向上的像素个数 pixel,个 像素密度 单位英寸上的像素个数 ppi,point per inch 其中: (此处应该是height^2 + width^2 但是优快云不支持此类型的maekdown我就不

E的博客 1605

STM32 IAP+APP合并Hex文件全自动脚本(Keil5一键生成)

本文详细介绍了一种基于Keil5开发环境的STM32 IAP与APP程序Hex文件全自动合并方案。通过编写批处理或Python脚本,并将其集成到Keil的编译后流程中,实现一键编译、自动合并,彻底解决手动操作繁琐易错的问题,极大提升STM32固件开发与远程升级的效率。

weixin_29191761的博客 306

Android 屏幕适配之框架(AndroidAutoSize)(今日头条)适配 bug

1.使用今日头条适配方案会出现修改的density莫名奇妙复原的问题,导致从新使用context的控件会出现UI异常问题,如刷新RecleView ,dialog toast (从app长按wifi进入wifi列表切换wifi,再回到App必现); 2.解决方法在acitivity的onResume 重新调用适配方法就可以(在BaseActivity的onResume中直接调用适配方法不起作用)...

Dy的专栏 1972

【知识图谱】实践篇——基于知识图谱的《红楼梦》人物关系可视化及问答系统实践:part1项目介绍与环境准备

看到这篇文章的你,相信对知识图谱相关概念不在陌生。知识图谱相关内容在实际开发中包含两个部分:1.知识图谱构建,2.知识图谱使用。知识图谱构建过程中涉及内容、技术都比较多。知识图谱的应用也逐渐在我们的生活中随处可见,其中基于知识图谱的问答系统就是其中的一个应用。基于知识图谱的问答系统称做KGQA(knowledge graph question answer),也有人称其为KBQA(knowledge based question answ).基于知识图谱的问答系统通常是使用的是领域知识图谱。下面就结合Git

让算法融入生活,改变生活! 4718

lammps多晶正弦粗糙界面建模

其中,30可以理解为正弦曲线的幅度,150为正弦曲线的基准坐标值,80控制周期,改变参数多试试就能找到规律。很久之前介绍过lammps粗糙界面建模,主要是在lammps中进行一维和二维的正弦粗糙面建模。运行完成后,会生成final.data,这个模型即为上表面为正弦波动的粗糙界面。新建1.py文件,粘贴下面内容后,运行:python 1.py。多晶需要在atomsk中进行,因此上述的方法就不再适用。最近有学员咨询多晶模型的正弦粗糙界面建模应该如何实现。在cmd窗口按顺序运行以下命令创建多晶模型。

lammps_jiayou的博客 387

Android开发者的福音:今日头条屏幕适配方案—AndroidAutoSize深度解析

Android开发者的福音:今日头条屏幕适配方案—AndroidAutoSize深度解析 项目地址:https://gitcode.com/gh_mirrors/an/AndroidAutoSize 在Android开发的世界里,屏幕适配一直是个令人头疼的问题。大小各异的设备、纷繁复杂的分辨率让界面适配变得复杂而繁琐。然而,有了AndroidAutoSize,这个问题迎刃而解。这是一个由JessY...

gitblog_00067的博客 1518

基于YOLOv11与相机标定的齿轮尺寸测量系统

本文详细介绍了一种基于深度学习的目标检测算法YOLOv11与相机标定技术相结合的齿轮尺寸自动测量系统。该系统能够实时检测图像中的齿轮目标,并精确测量其关键尺寸参数,包括齿顶圆直径、齿根圆直径、模数等。我们构建了完整的深度学习解决方案,包含数据采集与标注、模型训练、相机标定、尺寸测量算法以及用户友好的UI界面。本文提供了完整的代码实现,并推荐了相关的参考数据集,为工业视觉检测领域提供了实用的技术方案。关键词:YOLOv11;齿轮检测;尺寸测量;相机标定;深度学习;工业视觉python。

YOLO 411

今日头条屏幕适配方案终极版正式发布!,2024最新百度、头条等公司Android面试题目

在使用上非常简单,只需要填写设计图尺寸这一步即可接入项目,但需要注意的是,有两种类型的布局单位可以选择,一个是主单位 (dp、sp),一个是副单位 (pt、in、mm),两种单位面向的应用场景都有不同,也都有各自的优缺点主单位: 使用dp、sp为单位进行布局,侵入性最低,会影响其他三方库页面、三方库控件以及系统控件的布局效果,但也通过这个特性,使用实现了在不修改三方库源码的情况下适配三方库的功能副单位: 使用pt、in、mm。

1048

【系统架构设计师】预测试卷一:综合知识(75道选择题)

软件架构风格是描述某一特定应用领域中系统组织方式的惯用模式,架构风格反映领域中众多系统所共有的结构和 (48),强调对架构(49)的重用。 (48) A. 语义特性 B. 功能需求 C. 质量属性 D. 业务规则 (49) A. 分析 B. 设计 C.实现

数据知道的博客 7766

别让 Claude Code 一直问你“能不能执行“:权限配置完全指南

Claude Code 提供了一套精细的权限配置机制,配置好权限设置,可以提速不少。这个小技巧需要掌握一下。

沐风 3843

Android屏幕适配-第三篇(今日头条适配方案)

今天记录的笔记是今日头条的适配方案原理以及开源库”AndroidAutoSize“的实现剖析!(备注:此文仅供自己参考,全文全是文字,如果读者读起来比较生涩难懂,建议阅读引入文章) 此篇文章是通过阅读《骚年你的屏幕适配方式该升级了!-今日头条适配方案》理解的整理。感谢作者JessYan 适配的前提是你需要知道安卓适配的基础知识和基本方法 《Android屏幕适配-第一篇(基础知识)》、《And...

yrmao9893的博客 5148

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android 今日头条屏幕适配详细使用攻略

今日头条屏幕适配的核心代码为基础进行了扩展封装,产生了《AndroidAutoSize》这个能快速接入使用的屏幕适配方案,这个屏幕适配方案是我遇到的截止2020.9.15为止最强大、简单有效的屏幕适配方案。...

luo_boke的博客 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【安卓学习之第三方库】 AndroidAutoSiz学习:DialogFragment的适配

█ 【android学习开源项目之AndroidAutoSize】AndroidAutoSize和DialogFragment的适配 █ 相关文章: -   ● 【web学习之html】 HTML基础 - 常见语法总结  ● 【web学习之html】 HTML基础 - 表单学习 █ 读前说明: -   ● 本文通过学习别人写demo,学习一些课件,参考一些博客,’学习相关知识,如...

任我飞的博客 2608

android屏幕适配无效_屏幕适配方案3- 今日头条适配方案

个人觉得今日头条的适配方案可能是最简单也是开发起来最轻松的方案啦!它的核心代码也就区区几十行。 这里我只说下原理,其详细过程还是参考今日头条团队的文章吧今日头条适配方案。 通过修改系统的 density, densityDpi,如果不知道这个两个变量的意思的话请先看 Android 屏幕适配方案。核心适配过程首先就是需要寻找兼容的突破口,根据公式 px = density * dp, 在这个公式中...

weixin_42101237的博客 547

今日头条屏幕适配方案

作者:JessYan 链接:https://juejin.im/post/5b7a29736fb9a019d53e7ee2 原理 上面已经告知,不了解这两个方案的先看看上面的两篇文章,所以这里我就假设大家已经看了上面的文章或者之前就了解过这两个方案,所以在本文中我就不再阐述 DPI、Density 以及一些比较基础的知识点,上面的文章已经阐述的够清楚了。 今日头条屏幕适配方案的核心原理在于,根据以下公式算出 density 当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位...

qq_36652595的博客 2188

今日头条屏幕适配方案终极版正式发布!

在使用上非常简单,只需要填写设计图尺寸这一步即可接入项目,但需要注意的是,有两种类型的布局单位可以选择,一个是主单位 (dp、sp),一个是副单位 (pt、in、mm),两种单位面向的应用场景都有不同,也都有各自的优缺点主单位: 使用dp、sp为单位进行布局,侵入性最低,会影响其他三方库页面、三方库控件以及系统控件的布局效果,但也通过这个特性,使用实现了在不修改三方库源码的情况下适配三方库的功能副单位: 使用pt、in、mm。

浪漫之圣 1283

AlertDialog底部弹出并横向铺满屏幕

当我们弹出一个AlertDialog时,AlertDialog提示框通常表现为悬浮在一个页面上,周围都是带黑色透明度的遮板。 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); View dialogView = LayoutInflater.from(MainActi...

Peak1Chen的博客 2061

AndroidAutoSize头条适配方案系统弹窗展示不全问题

比如AlertDialog展示不全。

柳的博客 724

AndroidAutoSize今日头条适配方案

最近公司没有什么事,闲来无聊,就研究一下今日头条的适配方案,不看不知道,真是一看吓一跳,快速上手而且还简单易懂, 推荐一篇文章: http://www.wanandroid.com/blog/show/2343 我也是看的这位大佬写的。 今日头条适配只是一个基准,它是以宽或者高来进行适配的。 今日头条的适配是通过修改Application/Activity等的DisplayMetrics...

nyb521的博客 4245

★ Android 使用AlertDialog 不能全屏解决方案

Android 自定义Dialog 继承AlertDialog 不能全屏解决方案。

Xia_燚的博客 2230
上一篇: Android Studio引用另一个模块module的方法
下一篇: Android wps文件下载、预览
曾经_Once
博客等级 码龄8年 33粉丝 10原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值