Android自定义条目item优化布局
2016-06-30 17:31
344 查看
前言
最近项目轻松了些,也有时间静下心来优化代码了,看着有些布局近千行,我看着也是醉了,于是下决心优化下,程序猿要行动起来,不要说,这是以后我对自己的要求吧,与君共勉!自定义条目步骤
不多说,先从最常见的布局抓起,比如常见的设置界面,很多相似的条目其实可以抽出来,一般是LinearLayout上TextView+imageView,或者是ImageView+TextView等等好了,直接上代码吧,原理也都是android的自定义View,自定义属性集
1.自定义属性集
<declare-styleable name="ATSettingItem"> <attr name="item_icon" format="reference|color" /> <attr name="item_label_name" format="string" /> <attr name="is_show_right_text" format="boolean" /> <attr name="is_show_divider" format="boolean" /> <attr name="is_show_item_icon" format="boolean" /> <attr name="item_height" format="dimension" /> <attr name="item_right_label_name" format="string" /> <attr name="item_padding_left" format="dimension" /> <attr name="item_padding_right" format="dimension" /> <attr name="item_text_color" format="reference|color" /> <attr name="item_backgroud" format="reference|color" /> </declare-styleable>
2.继承自线性布局LinearLayout
package com.asiatravel.asiatravel.widget; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.asiatravel.asiatravel.R; /** * A widget for the same item * use in xml * use in code * Created by MrBoudar on 16/6/7. */ public class ATSettingItem extends LinearLayout { private View itemView; private View dividerView; private LinearLayout itemParentLayout; private ImageView itemIconIv; private TextView itemLabelTv; private TextView itemRightLabelTv; private ImageView itemVersionUpgrade; private int itemIcon; private int itemHeight; private int itemPaddingLeft; private int itemPaddingRight; private String itemLabelName; private String itemRightLabelName; private boolean isShowRightText; private boolean isShowDivider; private boolean isShowItemIcon; private ATItemChangeListener mItemChangeListener; public ATSettingItem(Context context) { this(context, null); } public ATSettingItem(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ATSettingItem(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } public void init(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ATSettingItem); itemIcon = typedArray.getResourceId(R.styleable.ATSettingItem_item_icon, R.drawable.iv_commom_data); itemLabelName = typedArray.getString(R.styleable.ATSettingItem_item_label_name); itemHeight = typedArray.getDimensionPixelSize(R.styleable.ATSettingItem_item_height, context.getResources().getDimensionPixelSize(R.dimen.dimens_44_dp)); itemPaddingLeft = typedArray.getDimensionPixelSize(R.styleable.ATSettingItem_item_padding_left, context.getResources().getDimensionPixelSize(R.dimen.dimens_14_dp)); itemPaddingRight = typedArray.getDimensionPixelSize(R.styleable.ATSettingItem_item_padding_right, context.getResources().getDimensionPixelSize(R.dimen.dimens_14_dp)); isShowRightText = typedArray.getBoolean(R.styleable.ATSettingItem_is_show_right_text, false); isShowDivider = typedArray.getBoolean(R.styleable.ATSettingItem_is_show_divider, false); isShowItemIcon = typedArray.getBoolean(R.styleable.ATSettingItem_is_show_item_icon, true); if (isShowRightText) { itemRightLabelName = typedArray.getString(R.styleable.ATSettingItem_item_right_label_name); } initView(context); initData(); typedArray.recycle(); } public void initView(Context context) { if (itemView == null) { itemView = LayoutInflater.from(context).inflate(R.layout.at_setting_item, this); } itemParentLayout = (LinearLayout) itemView.findViewById(R.id.item_parent_layout); itemIconIv = (ImageView) itemView.findViewById(R.id.item_icon_imageview); itemLabelTv = (TextView) itemView.findViewById(R.id.item_label_textview); itemRightLabelTv = (TextView) itemView.findViewById(R.id.item_right_label_textview); dividerView = itemView.findViewById(R.id.item_divider); itemVersionUpgrade = (ImageView) itemView.findViewById(R.id.item_version_update); } public void initData() { itemParentLayout.setLayoutParams(generateLayoutParams()); this.setPadding(itemPaddingLeft, 0, itemPaddingRight, 0); itemIconIv.setImageResource(itemIcon); itemLabelTv.setText(itemLabelName); if (isShowItemIcon) { itemIconIv.setVisibility(View.VISIBLE); } if (isShowRightText) { itemRightLabelTv.setVisibility(View.VISIBLE); itemRightLabelTv.setText(itemRightLabelName); } if (isShowDivider) { dividerView.setVisibility(View.VISIBLE); } } public void setItemLabelName(String name) { if (null != itemLabelTv) { itemLabelTv.setText(name); } } public void setItemIcon(int iconResId) { if (null != itemIconIv) { itemIconIv.setImageResource(iconResId); } } public void showUpgradeIcon() { if (null != itemVersionUpgrade) { itemVersionUpgrade.setVisibility(View.VISIBLE); } } /** * Add item in code * * @param mainContainer */ public void addItem(LinearLayout mainContainer) { mainContainer.addView(this); } public void setIsShowRightText(boolean isShowRightText) { this.isShowRightText = isShowRightText; } public void setItemRightLabelName(String rightLabelName) { if (null != itemRightLabelTv && this.isShowRightText) { itemRightLabelTv.setVisibility(View.VISIBLE); itemRightLabelTv.setText(rightLabelName); } } public LayoutParams generateLayoutParams() { return new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, itemHeight); } /** * interface for outer to use this widget */ public interface ATItemChangeListener { public void setItemLabel(); public void setItemRightLabel(); public void setItemIcon(); } public void setAtItemChangeListener(ATItemChangeListener atItemChangeListener) { this.mItemChangeListener = atItemChangeListener; } }
3.代码基本就是这样,原理就是使用android自定义的属性集,其实可以看看android TextView的实现,一个完美的自定义View首先可以引入到XML,可以动态的添加条目,就类似web上动态表单,根据动态添加需要的条目,可根据需求定义不同类型,展示不同的条目到前端。
总结:实现思路就是这样,多学多练吧,我觉得提升最快的就是自己要写一遍,加深理解,向大神们多学习!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories