自己封装的一个控件:EditText两边放加减按钮Button来控制输入框的数值

Demo 下载地址:

第一版:http://download.csdn.net/detail/zjjne/6740865

第二版:(修改部分BUG和添加从XML中实例化的Demo)http://download.csdn.net/detail/zjjne/8044679

转载请注明出处:

http://www.goteny.com/articles/2013/12/81.html

http://www.cnblogs.com/zjjne/p/3482842.html

效果图:

有三种构造方法

public AddAndSubView(Context context)  //EditText中数值初始化为0

public AddAndSubView(Context context, int num)  //带初始值构造

public AddAndSubView(Context context, AttributeSet attrs)

调用AddAndSubView方法

AddAndSubView addAndSubView = new AddAndSubView(MainActivity.this);

http://www.eoee.tk/articles/2013/12/81.html     http://www.cnblogs.com/zjjne/p/3482842.html

设置EditText中数值的方法:

addAndSubView.setNum(30);  或在构造函数中设置数值

获取EditText中数值的方法:

addAndSubView.getNum();

转载请注明出处:

http://www.goteny.com/articles/2013/12/81.html

http://www.cnblogs.com/zjjne/p/3482842.html

动态获取EditText中数值的方法:

//设置AddAndSubView中数值变化的监听器OnNumChangeListener
//OnNumChangeListener为AddAndSubView的内部接口
//当AddAndSubView中数值变化时会触发onNumChange,需重写此方法

addAndSubView.setOnNumChangeListener(new OnNumChangeListener()
{ @Override
public void onNumChange(View view, int num)
{
textView.setText(Integer.toString(num));
}
});

//以Drawable形式 设置按钮背景图

public void Drawable(Drawable addBtnDrawable, Drawable subBtnDrawable)

//以资源Resource形式 设置按钮背景图

public void setButtonBgResource(int addBtnResource, int subBtnResource)

//设置按钮背景颜色

public void setButtonBgColor(int addBtnColor, int subBtnColor)

还有一些设置EditText宽高的函数,具体见源码

下面是详细效果图和代码:

 

  

  

 

源码:

 import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast; /**
*
* @author ZJJ
*
*/
public class AddAndSubView extends LinearLayout
{
Context context;
LinearLayout mainLinearLayout; //主View,即AddAndSubView
LinearLayout leftLinearLayout; //内部左view
LinearLayout centerLinearLayout; //中间view
LinearLayout rightLinearLayout; //内部右view
OnNumChangeListener onNumChangeListener;
Button addButton;
Button subButton;
EditText editText;
int num; //editText中的数值
int editTextLayoutWidth; //editText视图的宽度
int editTextLayoutHeight; //editText视图的宽度
int editTextMinimumWidth; //editText视图的最小宽度
int editTextMinimumHeight; //editText视图的最小高度
int editTextMinHeight; //editText文本区域的最小高度
int editTextHeight; //editText文本区域的高度 public AddAndSubView(Context context)
{
super(context);
this.context = context;
num = 0;
control();
} /**
* 带初始数据实例化
* @param context
* @param 初始数据
*/
public AddAndSubView(Context context, int num)
{
super(context);
this.context = context;
this.num = num;
control();
} public AddAndSubView(Context context, AttributeSet attrs)
{
super(context, attrs);
       this.context = context;
67 num = 0;
control();
} /**
*
*/
private void control()
{
initTextWithHeight();
initialise(); //实例化内部view
setViewsLayoutParm(); //设置内部view的布局参数
insertView(); //将子view放入linearlayout中
setViewListener();
} /**
* 初始化EditText宽高参数
*/
private void initTextWithHeight()
{
editTextLayoutWidth = -1;
editTextLayoutHeight = -1;
editTextMinimumWidth = -1;
editTextMinimumHeight = -1;
editTextMinHeight = -1;
editTextHeight = -1;
} /**
* 实例化内部View
*/
private void initialise()
{
mainLinearLayout = new LinearLayout(context);
leftLinearLayout = new LinearLayout(context);
centerLinearLayout = new LinearLayout(context);
rightLinearLayout = new LinearLayout(context);
addButton = new Button(context);
subButton = new Button(context);
editText = new EditText(context); addButton.setText("+");
subButton.setText("-");
addButton.setTag("+");
subButton.setTag("-");
//设置输入类型为数字
editText.setInputType(android.text.InputType.TYPE_CLASS_NUMBER);
editText.setText(String.valueOf(num));
} /**
* 设置内部view的布局参数
*/
private void setViewsLayoutParm()
{
LayoutParams viewLayoutParams = new LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT); addButton.setLayoutParams(viewLayoutParams);
subButton.setLayoutParams(viewLayoutParams);
editText.setLayoutParams(viewLayoutParams);
editText.setGravity(Gravity.CENTER);
setTextWidthHeight(); viewLayoutParams.gravity = Gravity.CENTER;
centerLinearLayout.setLayoutParams(viewLayoutParams);
//让editText不自动获得焦点
centerLinearLayout.setFocusable(true);
centerLinearLayout.setFocusableInTouchMode(true); viewLayoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
viewLayoutParams.weight = 1.0f;
leftLinearLayout.setLayoutParams(viewLayoutParams); //参数:宽、高、比重,比重为1.0
rightLinearLayout.setLayoutParams(viewLayoutParams); //参数:宽、高、比重,比重为1.0 viewLayoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT;
mainLinearLayout.setLayoutParams(viewLayoutParams);
mainLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
} /**
* 设置EditText视图和文本区域宽高
*/
private void setTextWidthHeight()
{
float fPx; //设置视图最小宽度
if (editTextMinimumWidth < 0)
{
// 将数据从dip(即dp)转换到px,第一参数为数据原单位(此为DIP),第二参数为要转换的数据值
fPx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
80f, context.getResources().getDisplayMetrics());
editTextMinimumWidth = Math.round(fPx);
}
editText.setMinimumWidth(editTextMinimumWidth); //设置文本区域高度
if (editTextHeight > 0)
{
if (editTextMinHeight >= 0 && editTextMinHeight > editTextHeight)
{
editTextHeight = editTextMinHeight;
}
editText.setHeight(editTextHeight);
} //设置视图高度
if (editTextLayoutHeight > 0)
{
if (editTextMinimumHeight > 0 &&
editTextMinimumHeight > editTextLayoutHeight)
{
editTextLayoutHeight = editTextMinimumHeight;
} LayoutParams layoutParams = (LayoutParams) editText.getLayoutParams();
layoutParams.height = editTextLayoutHeight;
editText.setLayoutParams(layoutParams);
} //设置视图宽度
if (editTextLayoutWidth > 0)
{
if (editTextMinimumWidth > 0 &&
editTextMinimumWidth > editTextLayoutWidth)
{
editTextLayoutWidth = editTextMinimumWidth;
} LayoutParams layoutParams = (LayoutParams) editText.getLayoutParams();
layoutParams.width = editTextLayoutWidth;
editText.setLayoutParams(layoutParams);
}
} /**
* 将子view放入linearlayout中
*/
private void insertView()
{
mainLinearLayout.addView(leftLinearLayout, 0);
mainLinearLayout.addView(centerLinearLayout, 1);
mainLinearLayout.addView(rightLinearLayout, 2); leftLinearLayout.addView(addButton);
centerLinearLayout.addView(editText);
rightLinearLayout.addView(subButton); addView(mainLinearLayout); //将整块视图添加进当前AddAndSubView中
} /**
* 设置editText中的值
* @param num
*/
public void setNum(int num)
{
this.num = num;
editText.setText(String.valueOf(num));
} /**
* 获取editText中的值
* @return
*/
public int getNum()
{
if ( editText.getText().toString() != null )
{
return Integer.parseInt(editText.getText().toString());
}
else {
return 0;
}
} /**
* 设置EditText视图的最小高度
* @param minimumWidth EditText的最小高度,单位px
*/
public void setEditTextMinimumWidth(int editTextMinimumWidth)
{
//设置视图最小宽度
if (editTextMinimumWidth > 0)
{
this.editTextMinimumWidth = editTextMinimumWidth;
editText.setMinimumWidth(editTextMinimumWidth);
} } /**
* 设置EditText视图的最小高度
* @param editTextMinimumHeight EditText视图的最小高度,单位:px
*/
public void setEditTextMinimumHeight(int editTextMinimumHeight)
{
//设置视图最小高度
if (editTextMinimumHeight > 0)
{
this.editTextMinimumHeight = editTextMinimumHeight;
editText.setMinimumHeight(editTextMinimumHeight);
}
} /**
* 设置EditText文本区域的最小高度
* @param editTextMinHeight EditText文本区域的最小高度,单位:px
*/
public void setEditTextMinHeight(int editTextMinHeight)
{
//设置文本区域最小高度
if (editTextMinHeight > 0)
{
this.editTextMinHeight = editTextMinHeight;
editText.setMinHeight(editTextMinHeight);
}
} /**
* 设置EditText文本区域的高度
* @param editTextHeight EditText文本区域的高度,单位:px
*/
public void setEditTextHeight(int editTextHeight)
{
this.editTextHeight = editTextHeight;
setTextWidthHeight();
} /**
* 设置EditText视图的宽度
* @param editTextLayoutWidth 设置EditText视图的宽度,单位px
*/
public void setEditTextLayoutWidth(int editTextLayoutWidth)
{
this.editTextLayoutWidth = editTextLayoutWidth;
setTextWidthHeight();
} /**
* 设置EditText视图的高度
* @param editTextLayoutHeight EditText视图的最小高度,单位px
*/
public void setEditTextLayoutHeight(int editTextLayoutHeight)
{
this.editTextLayoutHeight = editTextLayoutHeight;
setTextWidthHeight();
} /**
* 以Drawable形式 设置按钮背景图
* @param addBtnDrawable 加号背景图
* @param subBtnDrawable 减号背景图
*/
public void Drawable(Drawable addBtnDrawable, Drawable subBtnDrawable)
{
//不推荐用setBackgroundDrawable,新API推荐用setBackground(在API 16中)
addButton.setBackgroundDrawable(addBtnDrawable);
subButton.setBackgroundDrawable(subBtnDrawable);
addButton.setText("");
subButton.setText("");
} /**
* 以资源Resource形式 设置按钮背景图
* @param addBtnResource 加号背景图
* @param subBtnResource 减号背景图
*/
public void setButtonBgResource(int addBtnResource, int subBtnResource)
{
addButton.setBackgroundResource(addBtnResource);
subButton.setBackgroundResource(subBtnResource);
addButton.setText("");
subButton.setText("");
} /**
* 设置按钮背景色
* @param addBtnColor 加号背景色
* @param subBtnColor 减号背景色
*/
public void setButtonBgColor(int addBtnColor, int subBtnColor)
{
addButton.setBackgroundColor(addBtnColor);
subButton.setBackgroundColor(subBtnColor);
} /**
* 设置EditText文本变化监听
* @param onNumChangeListener
*/
public void setOnNumChangeListener(OnNumChangeListener onNumChangeListener)
{
this.onNumChangeListener = onNumChangeListener;
} /**
* 设置文本变化相关监听事件
*/
private void setViewListener()
{
addButton.setOnClickListener(new OnButtonClickListener());
subButton.setOnClickListener(new OnButtonClickListener());
editText.addTextChangedListener(new OnTextChangeListener());
} /**
* 加减按钮事件监听器
* @author ZJJ
*
*/
class OnButtonClickListener implements OnClickListener
{ @Override
public void onClick(View v)
{
String numString = editText.getText().toString();
if (numString == null || numString.equals(""))
{
num = 0;
editText.setText("0");
} else
{
if (v.getTag().equals("+"))
{
if (++num < 0) //先加,再判断
{
num--;
Toast.makeText(context, "请输入一个大于0的数字",
Toast.LENGTH_SHORT).show();
} else
{
editText.setText(String.valueOf(num)); if (onNumChangeListener != null)
{
onNumChangeListener.onNumChange(AddAndSubView.this, num);
}
}
} else if (v.getTag().equals("-"))
{
if (--num < 0) //先减,再判断
{
num++;
Toast.makeText(context, "请输入一个大于0的数字",
Toast.LENGTH_SHORT).show();
} else
{
editText.setText(String.valueOf(num));
if (onNumChangeListener != null)
{
onNumChangeListener.onNumChange(AddAndSubView.this, num);
}
}
}
}
}
} /**
* EditText输入变化事件监听器
* @author ZJJ
*
*/
class OnTextChangeListener implements TextWatcher
{ @Override
public void afterTextChanged(Editable s)
{
String numString = s.toString();
if(numString == null || numString.equals(""))
{
num = 0;
if (onNumChangeListener != null)
{
onNumChangeListener.onNumChange(AddAndSubView.this, num);
}
}
else {
int numInt = Integer.parseInt(numString);
if (numInt < 0)
{
Toast.makeText(context, "请输入一个大于0的数字",
Toast.LENGTH_SHORT).show();
} else
{
//设置EditText光标位置 为文本末端
editText.setSelection(editText.getText().toString().length());
num = numInt;
if (onNumChangeListener != null)
{
onNumChangeListener.onNumChange(AddAndSubView.this, num);
}
}
}
} @Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after)
{ } @Override
public void onTextChanged(CharSequence s, int start, int before,
int count)
{ } } public interface OnNumChangeListener
{
/**
* 输入框中的数值改变事件
* @param view 整个AddAndSubView
* @param num 输入框的数值
*/
public void onNumChange(View view, int num);
} }

Demo 下载地址:

第一版:http://download.csdn.net/detail/zjjne/6740865

第二版:(修改部分BUG和添加从XML中实例化的Demo)http://download.csdn.net/detail/zjjne/8044679

转载请注明出处:

http://www.goteny.com/articles/2013/12/81.html

http://www.cnblogs.com/zjjne/p/3482842.html

THE END


Android 自定义控件 EditText输入框两边加减按钮Button的更多相关文章

  1. 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)

    之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...

  2. 纯CSS样式实现数字加减按钮的最佳方案

    前言: 对于数字加减按钮的实现,以前用过不少方案,诸如: 1.使用背景图片——这种效果比较好,缺点是样式控制有点复杂了,还需要使用图片: 2.直接使用“+”“-”——这种方法简单粗暴,最容易实现,缺点 ...

  3. js实现输入框数量加减【转】

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Vue Input输入框两侧加减框内数字组件

    NumberBox组件内容: <template> <div class="number-box" :class="{'box-disable': is ...

  5. Vue: 购物车数量加减按钮

    效果图: HTML: <div class="label"> <p class="buy_num">购买数量</p> < ...

  6. 不难懂-----type=number 去掉加减按钮并禁止鼠标滚轮滚动

    <style> /* 去除webkit中input的type="number"时出现的上下图标 */ input::-webkit-outer-spin-button, ...

  7. 小巧实用的数字加减插件(jquery插件)

    2015-12-04 近期项目需要,我将插件更新了,增加了两个参数,一个参数控制文本框是否支持输入,另一个参数则是新增了一个回调函数,返回文本框内的值.另外对代码局部重构了,优化了一下封装,需要的朋友 ...

  8. js实现购买数量加减效果

    写在前面:当我们需要在多个页面都有操作数量的需求时的一种解决方案 结构: js代码: <script type="text/javascript"> function ...

  9. Vue(小案例_vue+axios仿手机app)_购物车(二模拟淘宝购物车页面,点击加减做出相应变化)

    一.前言 在上篇购物车中,如果用户刷新了当前的页面,底部导航中的数据又会恢复为原来的: 1.解决刷新,购物车上数值不变                                         ...

随机推荐

  1. Linux下遍历目录及文件,更改权限

    Linux下遍历目录及文件,更改权限 引言: 我在Linux下搭建android时,将eclipse及sdk复制到/usr/下时,总会出现无法读,无法写写样的问题. 解决方案: 有两个方案: 一.将复 ...

  2. Java语言与JVM中的Lambda表达式全解

    Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法. ...

  3. E - Just a Hook - hdu 1698(区间覆盖)

    某个英雄有这样一个金属长棍,这个金属棍有很多相同长度的短棍组成,大概最多有10w节,现在这个人有一种魔法,他可以把一段区间的金属棍改变成别的物质,例如金银或者铜, 现在他会有一些操作在这个金属棍上,他 ...

  4. SCGHR 系统设计

    1.表,弄清表的意义,表是系统的核心.

  5. 集成对象和 JSON

    想象一下,如果 NSDictionary,NSArray,NSString 呾 NSData 都提供方法 相亏转换 JSON 数据,返样丌径好举? 嗯,等等 – 我们正在使用 Objective-C, ...

  6. unix网络编程第三版源代码ubuntu下配置的问题解决

    第一步:首先下载本书配套的源码unpv13e.tar.gz 第二步:解压后进入根文件夹有一个README 4 Execute the following from the src/ directory ...

  7. COM编程入门第二部分——深入COM服务器

    本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口.继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需 ...

  8. In-Cell、On-Cell和OGS全贴合屏幕技术区别

    昨天刚发布的小米3用的是OGS全贴合屏幕技术,包括魅族MX3也是同样的技术,但是iPhone5是In-Cell屏幕技术,什么才是全贴合?它们之间到底有何区别?哪个好?小编今天就来普及一下全贴合屏幕技术 ...

  9. 动态规划+滚动数组 -- POJ 1159 Palindrome

    给一字符串,问最少加几个字符能够让它成为回文串. 比方 Ab3bd 最少须要两个字符能够成为回文串 dAb3bAd 思路: 动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几 ...

  10. javascript加载图片获取图片尺寸信息方法

    如果你遇到不方便从服务器取图片尺寸信息的话,用下面代码就很方便了. // 更新: // 05.27: 1.保证回调执行顺序:error > ready > load:2.回调函数this指 ...