Android UI布局问题总结

简介:
在做新行程项目期间,遇到了很多关于UI布局的问题,这里总结一部分,都是一些小细节,希望能加深理解,以后少走弯路。

一 页面唤起后view创建完成的时间

   
 Activity的生命周期为下图所示:



   
 Activity在onCreate中使用setContentView()方法中载入xml布局,那么布局中的view是在何时完成创建的呢?在父布局中添加一个TextView,使用getLeft()、getRight()方法获取TextView在父布局中的左右边界的位置,打印出来可以看到

   

    在onResume方法中获取的位置依然为0,按下home键后,将应用置为后台运行,可以看到

   
    在onPause方法中打印出了位置,所以Activity中view创建完成的时间是在调用OnResume()方法返回之后,在此之前是无法获取view的位置信息的,fragment也是类似的,fragment的生命周期如图:


     

    同样在布局中添加一个TextView,页面启动后打印TextView的位置,可以看到

  

    在OnResume方法中也并没有打印出TextView得位置,按下home键,可以看到

   
    
    打印出了TextView得位置,所以Fragment中view从创建完成到可见也是在OnResume()方法返回之后。那么如何才能知道activity已经完全加载,view已经可见了呢,可以根据OnWindowFocusChange()回调方法来判断。
OnWindowFocusChange()在OnResume()或者OnPause()方法调用完成之后被调用,可以保证activity已经完全加载,如图所示

   

二 复用View时避免之前View的属性的影响   
    在使用RecyclerView,ListView或者GridView时,为了节省内存,android系统将新创建的view直接复用上一个同类型的、当前已不可见的view,以RecyclerView为例,设置RecyclerView的item布局为一个ImageView加一个TextView,在adapter的
OnBindViewHolder()中设置第一个item的字体颜色为红色,代码如下:

@Override public void onBindViewHolder(MyViewHolder holder, int position) { String url = mUrlList.get(position); Picasso.with(mContext).load(url).into(holder.mIvPic); holder.mTvText.setText("这是第 " + position + "个"); if(position == 0){ holder.mTvText.setTextColor(Color.parseColor("#ff0000")); } }

运行效果如图所示:
     

咋看起来满足了要求,只有第一个item的字体标红了,但是上下滚动几次,使得别的view能够复用第一个view,可以看到
    
    

别的item也出现了字体被标红的效果,这是由于在view复用的时候,只是对特殊情况进行了处理,并没有对正常情况进行处理,简单来说就是只设置第一个位红色,没有设置非第一个为黑色,没有做到有if就有else,重写onBindViewHolder方法为:

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        String url = mUrlList.get(position);
        Picasso.with(mContext).load(url).into(holder.mIvPic);
        holder.mTvText.setText("这是第 " + position + "个");
        if(position == 0){
            holder.mTvText.setTextColor(Color.parseColor("#ff0000"));
        }else{
            holder.mTvText.setTextColor(Color.parseColor("#000000"));
        }
    }

这样就不会出现非0个view字体标红的情况了,如图:

   

与此类似,当使用RecyclerView、ListView或者GridView时,要注意上一个view对之后view复用的影响,对于特殊属性的处理,要做到有if就要有else,避免属性不同的影响。
三 .9图片的可绘制区域
    Android使用9patch处理图片以保证图片不会随着屏幕尺寸的变化而失真,如图:
    
    

背景图片会随着文字内容的变化动态调整大小而不会失真,在使用.9图片时候需要注意可操作区域的大小,每条边都要设置操作区域,如果设置.9图片的拉伸区域为:

    

那么在尖角上面的区域就是不可操作的区域,如图:

    

文本只存在于下方可操作区域内,上面的空间就无法使用了,正确的设置方法为:

    

保证可编辑区域的大小范围满足要求。
总结

    还有一些小细节,比如RelativeLayout使用wrap_content属性,如果其内部View使用alignParentBottom或者alignParentRight等需要依赖父布局位置时,RelativeLayout就会撑满全屏等,都是一些小细节,陆续还会总结,以便加深记忆,提高效率。


该文章来自于阿里巴巴技术协会(ATA

作者:萧锁

目录
相关文章
|
13天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
|
4月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
67 10
|
5月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
159 1
|
2月前
|
Android开发 开发者 容器
flutter:&UI布局 (六)
本文档介绍了Flutter中的UI布局方式,包括线性布局(如Column和Row)、非线性布局(如Stack、Flex、Positioned)以及Wrap布局等。通过具体示例代码展示了如何使用这些布局组件来构建灵活多变的用户界面,例如使用Column垂直排列文本、使用Stack叠加组件、以及利用Wrap实现自动换行的按钮布局等。
|
3月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
70 1
|
2月前
|
ARouter Android开发
Android不同module布局文件重名被覆盖
Android不同module布局文件重名被覆盖
122 0
|
4月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
4月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
59 1
|
4月前
|
API Android开发
Android项目架构设计问题之选择和使用合适的UI库如何解决
Android项目架构设计问题之选择和使用合适的UI库如何解决
51 0
下一篇
无影云桌面