一个难倒 3年 android开发经验 " 工程师 " 的 "bug"

发表于:2018-7-27 16:19

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:指尖下的幽灵    来源:博客园

#
Bug
分享:
  就在刚才 晚上9 点多的时候,我的一个外包伙伴发一个工程代码我,叫我去看下这样一个"bug",说折腾了很久,图片选择器在选择完图片后,就要显示图片到界面上,大家可以想象下 微信 发表图片,因为我们相机的图片肯定是 长宽都不一致的,为了统一格式,一般都是把要显示出来的 imageView 设置成 scaleType = centerCrop 或者 center。
  问题就是:他在设置了上面的属性后,宛然无效!imageView 设置成 scaleType = centerCrop 或者 center,对图片没效果。
  先上事例图:
  理想效果 和 问题效果(左->右):
   
   
  公用的 xml:
  1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2     xmlns:tools="http://schemas.android.com/tools"
  3     android:layout_width="match_parent"
  4     android:layout_height="match_parent"
  5     android:paddingBottom="@dimen/activity_vertical_margin"
  6     android:paddingLeft="@dimen/activity_horizontal_margin"
  7     android:paddingRight="@dimen/activity_horizontal_margin"
  8     android:paddingTop="@dimen/activity_vertical_margin"
  9     tools:context=".MainActivity" >
  10
  11     <LinearLayout
  12         android:id="@+id/images_container"
  13         android:paddingLeft="10dp"
  14         android:orientation="horizontal"
  15         android:layout_width="wrap_content"
  16         android:layout_height="wrap_content">
  17
  18
  19
  20     </LinearLayout>
  21
  22
  23 </RelativeLayout>
  我们来看看出问题的代码:
  imageView 的 xml:
  1 <?xml version="1.0" encoding="utf-8"?>
  2 <ImageView
  3     xmlns:android="http://schemas.android.com/apk/res/android"
  4     android:id="@+id/image_one"
  5     android:scaleType="centerCrop"
  6     android:layout_width="30dp"
  7     android:layout_height="30dp" />
  他设置了动态 addView() 的方法 添加用户选中的 图片,java 代码,为了避免长篇大论,我已做简化,事例效果一样:
  1 @Override
  2     protected void onCreate(Bundle savedInstanceState) {
  3         super.onCreate(savedInstanceState);
  4         setContentView(R.layout.test);
  5         final ImageView image = (ImageView) LayoutInflater.from(this).inflate(R.layout.send_post_image, null, false);
  6         LinearLayout images_container = (LinearLayout) findViewById(R.id.images_container);
  7         image.setImageResource(R.drawable.beni);
  8         images_container.addView(image);
  9     }

  这样的代码,貌似没什么问题,通过 LayoutInflater.from(this).inflate(...) 来事例化一个 View,而最为之关键的是,这个View 就是上面的 imageView的xml,里面明确设置了 width 和 height 是 30dp,显示方式是 centerCrop,最后通过 addView 添加到一个 linearLayout 中。但是,这份代码显示出来的效果是 右图,非 理想效果!!哈哈,感觉恍然大悟吧。
  你可能会有这样一个印象,我们绝大多项目或者是练习中的 imageVIew 使用都是直接 findViewById, 一样的 imageView 设置,却没问题, 没错,的确没问题,你可以把上面的代码替换为这个试试:
  test.xml 换为:
  1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2     xmlns:tools="http://schemas.android.com/tools"
  3     android:layout_width="match_parent"
  4     android:layout_height="match_parent"
  5     android:paddingBottom="@dimen/activity_vertical_margin"
  6     android:paddingLeft="@dimen/activity_horizontal_margin"
  7     android:paddingRight="@dimen/activity_horizontal_margin"
  8     android:paddingTop="@dimen/activity_vertical_margin"
  9     tools:context=".MainActivity" >
  10
  11     <LinearLayout
  12         android:id="@+id/images_container"
  13         android:paddingLeft="10dp"
  14         android:orientation="horizontal"
  15         android:layout_width="wrap_content"
  16         android:layout_height="wrap_content">
  17         <ImageView
  18             android:id="@+id/image"
  19             android:scaleType="centerCrop"
  20             android:layout_width="30dp"
  21             android:layout_height="30dp" />
  22
  23
  24     </LinearLayout>
  25
  26
  27 </RelativeLayout>
  java 换为
  1 @Override
  2     protected void onCreate(Bundle savedInstanceState) {
  3         super.onCreate(savedInstanceState);
  4         setContentView(R.layout.test);
  5         final ImageView image = (ImageView)findViewById(R.id.image);
  6         image.setImageResource(R.drawable.beni);
  7     }
  这样显示出来的 效果 就是我们所 期望的。
  为什么通过 addView() 的方法却败了呢?
  问题的原因是这样的:任何使用 addView(...) 的方法,无论你所实例化的 View 本身的 xml 的 width 和 height 设置了什么,都是没效果的,请看清楚,是 width height 失效,上面的 scaleType 是有效的, 问题 java 代码中调用 addView 的时候并没有传入 LayoutParam 布局参数,好了,我们来 粘下 源码,见证真相只有一个。

  上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号