自己封装的一个控件: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. HDU_1401——同步双向BFS,八进制位运算压缩,map存放hash

    这个速度比分步快一点,内存占的稍微多一点 Problem Description Solitaire is a game played on a chessboard 8x8. The rows an ...

  2. Spark on YARN的两种运行模式

    Spark on YARN有两种运行模式,如下 1.yarn-cluster:适合于生产环境.        Spark的Driver运行在ApplicationMaster中,它负责向YARN Re ...

  3. 对于AttributeError: 'Flask' object has no attribute 'cli'的解决办法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 环境flask-script2.0.5.flask0.10.1 运行官方文档sample 出现问题 c:\kk\flask\examples\fl ...

  4. Oracle 数据库基本操作——表操作:查询

    目录: 1.基本查询 2.多表查询 3.多行查询 4.集合查询 2.连接 3.嵌套查询 1.基本查询 语法: select column|others{,columnName|others} from ...

  5. 【转】两种方法教你在Ubuntu下轻松关闭触摸板(TinkPad)

    Ubuntu是一个以桌面应用为主的Linux操作系统,所以在使用时我经常的触碰到触摸板,这样会造成我们一些的麻烦,所以要如何的关闭触摸板呢?我们一起来看看吧!   Ubuntu下如何关闭触摸板(Tin ...

  6. hibernate ThreadLocal

    代码 package com.pb.hibernate.util; import org.hibernate.HibernateException; import org.hibernate.Sess ...

  7. JavaScripts学习日记——XML DTD Schema

    今日关键词: XML DTD Schema 1.XML 1 XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和 ...

  8. 计算方法(二)用C#实现数值积分

    在工程中,经常会遇到积分问题,这时原函数往往都是找不到的,因此就需要用计算方法的数值积分来求. public class Integral { /// <summary> /// 梯形公式 ...

  9. java transient关键字和transaction的区别

    transient:表示临时的,不会被持久化,保存进数据库 transaction:表示事务 <div style="background: #fff; color: #0ff;&qu ...

  10. (转)ASP.NET里面简单的记住用户名和密码

    using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using S ...