您的位置:首页 > 移动开发 > Android开发

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上动态表单,根据动态添加需要的条目,可根据需求定义不同类型,展示不同的条目到前端。

总结:实现思路就是这样,多学多练吧,我觉得提升最快的就是自己要写一遍,加深理解,向大神们多学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息