Android布局优化是一个课题,本文仅从实际中的使用介绍一些优化的技巧。平常的项目中使用的一些布局,第一眼看上去像是多个空间搭建出来的,但其实只需要一个原生控件就可以。
-
个人中心的设置布局
优化之前的布局可以使用一个
LinearLayout
或者RelativeLayout
加两个个ImageView
,但是其实只需要一个TextView
即可,下面是使用方式<TextView android:id="@+id/tvExit" android:layout_width="match_parent" android:layout_height="@dimen/dp_60" android:gravity="center_vertical" style="@style/itemMargin" android:textSize="@dimen/contentSize" android:textColor="@color/colorAccent" android:text="@string/exit" android:drawablePadding="@dimen/dp_13" android:drawableStart="@mipmap/sign_out_icon" android:drawableEnd="@mipmap/right_icon"/>
-
详情页里的item布局
优化之前这种布局可以用一个
LinearLayout
加两个TextView
实现同样,优化之后使用一个
TextView
//布局文件 <TextView android:id="@+id/tvPlanLeader" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="@dimen/textSmall" android:textColor="@color/textGray" android:text="@string/planLeader"/> //资源文件,这种适合文字颜色一样 <string name="planLeader">负责人:%s</string> //java代码 tvPlanLeader.setText(mContext.getString(R.string.planLeader,item.getLeaderName())) //还有一种情况:文字颜色不一样,布局文件同上 //资源文件 <string name="htmlItem"><![CDATA[ <font color="#272829">%s</font> ]]><![CDATA[ <font color="#515354">%s</font> ]]></string> //java代码--format(String, Object...) 和 getString(int, Object...) 方法会删除字符串中的所有样式信息 tvDevelopProjectName.setText(Html.fromHtml( String.format( getString(R.string.htmlItem), getString(R.string.tvProjectName),developPlan.getProjectName())));
-
类似默写升级Dialog里的说明布局
这种情况和案例2差不多,优化之前可以用3个
TextView
,优化之后只需要一个TextView
,只不过这里用SpannableString
更方便一些//布局文件 <TextView android:gravity="center_horizontal" android:id="@+id/tvNoReportDetail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="@dimen/contentSize" android:textColor="@color/colorAccent" android:lineSpacingExtra="@dimen/dp_10"/> //android:lineSpacingExtra控制行间距 //资源文件 <string name="noReportDetail">你当天的工作内容\n未汇报\n请点击下方按钮申请重新汇报</string> //java代码 SpannableString spannableString = new SpannableString(getString(R.string.noReportDetail)); ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.textBright));//设置字体颜色 spannableString.setSpan(foregroundColorSpan,9,12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//最后一个参数在这里没意义 AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(20, true);//设置字体大小,不使用px,看文档是dip,不过和sp差不多 spannableString.setSpan(absoluteSizeSpan, 9, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); tvNoReportDetail.setText(spannableString);
下面是使用一个
TextView
和3个TextView
的区别