Android 自定义控件 EditText输入框两边加减按钮Button
自己封装的一个控件: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的更多相关文章
- 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)
之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...
- 纯CSS样式实现数字加减按钮的最佳方案
前言: 对于数字加减按钮的实现,以前用过不少方案,诸如: 1.使用背景图片——这种效果比较好,缺点是样式控制有点复杂了,还需要使用图片: 2.直接使用“+”“-”——这种方法简单粗暴,最容易实现,缺点 ...
- js实现输入框数量加减【转】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Vue Input输入框两侧加减框内数字组件
NumberBox组件内容: <template> <div class="number-box" :class="{'box-disable': is ...
- Vue: 购物车数量加减按钮
效果图: HTML: <div class="label"> <p class="buy_num">购买数量</p> < ...
- 不难懂-----type=number 去掉加减按钮并禁止鼠标滚轮滚动
<style> /* 去除webkit中input的type="number"时出现的上下图标 */ input::-webkit-outer-spin-button, ...
- 小巧实用的数字加减插件(jquery插件)
2015-12-04 近期项目需要,我将插件更新了,增加了两个参数,一个参数控制文本框是否支持输入,另一个参数则是新增了一个回调函数,返回文本框内的值.另外对代码局部重构了,优化了一下封装,需要的朋友 ...
- js实现购买数量加减效果
写在前面:当我们需要在多个页面都有操作数量的需求时的一种解决方案 结构: js代码: <script type="text/javascript"> function ...
- Vue(小案例_vue+axios仿手机app)_购物车(二模拟淘宝购物车页面,点击加减做出相应变化)
一.前言 在上篇购物车中,如果用户刷新了当前的页面,底部导航中的数据又会恢复为原来的: 1.解决刷新,购物车上数值不变 ...
随机推荐
- Git Bash 使用心得
1:下载Git Git for Windows 2:点击安装,依次默认下一步 3:安装完成 4:设置SSH建立计算机与Github的链接 4.1 点击开始菜单找到Git Bash,并点击: 4.2 ...
- java笔记11之二维数组
格式1: 二维数组:就是元素为一维数组的一个数组 数据类型[][] 数组名 = new 数组类型[m][n] 其中m为行 n为列 注意: A:以下格式也可以表示二维数组 a:数据 ...
- Java并发编程:CopyOnWrite容器的实现
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- Linux shell 之 提取文件名和目录名的一些方法
很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等.例如,从路径/dir1/dir2/file.tx ...
- 032数值的整数次方(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php? pid=1514 题目描写叙述: 给定一个double类型的浮点数base和int类型的整数exponent. ...
- Ajax提交Form表单及文件上传
刚刚申请下来的博客,写得第一篇.有点小激动,本人以前是一名工业3D设计师突然有些变故做上了JavaWeb开发: 前几天,发现了一些小问题.我在写后台管理页面时,需要上传一张图片.于是我就用很普通的Fo ...
- web页面缓存技术之Local Storage
业务:检测页面文本框的值是否有改变,有的话存入缓存,并存储到数据库,这样用户异常操作后再用浏览器打开网页,就可避免重新填写数据 数据库表:Test,包含字段:PageName,PageValue BL ...
- Linux内核启动分析
张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 我的代码可见https://www.shiyanlo ...
- (转)select 1 from ... sql语句中的1代表什么意思? .
select 1 from ..., sql语句中的1代表什么意思?查出来是个什么结果? select 1 from table;与select anycol(目的表集合中的任意一行 ...
- 合理使用Memcached进行缓存部署
Memcached是danga.com(运营 LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东西,相信很多人都用过,本 文意在通 ...