版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中自定义EditText注册验证码
怎么在Android中自定义EditText注册验证码?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现思路
用一个透明的EditText与四个TextView重叠,并给TextView设置默认背景第4个TextView输入完成后,要设置回调,并且要加入增加删除的回调还要监听EditText内容的变化,获取内容,并且改变EditText下面的TextView的颜色重新发送的是采用一个自定义的CountDownTimer类弹出效果自定义的一个Dialog继承DialogFragment自定义EditText的布局<?xml
version="1.0"
encoding="utf-8"?>
<RelativeLayout
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="47dp"
android:gravity="center"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:id="@+id/item_code_iv1"
/>
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:id="@+id/item_code_iv2"
/>
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:id="@+id/item_code_iv3"
/>
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<TextView
android:id="@+id/item_code_iv4"
/>
</LinearLayout>
<EditText
android:id="@+id/item_edittext"
android:layout_width="match_parent"
android:layout_height="47dp"
android:background="@android:color/transparent"
android:inputType="number"
/>
</RelativeLayout>style
<style
name="text_editStyle"
>
<item
name="android:layout_height">47dp</item>
<item
name="android:layout_width">47dp</item>
<item
name="android:background">@mipmap/bg_verify</item>
<item
name="android:gravity">center</item>
<item
name="android:textColor">@color/common_blue_0090FF</item>
<item
name="android:textSize">18sp</item>
</style>View的代码private
EditText
editText;
private
TextView[]
TextViews;
private
StringBuffer
stringBuffer
=
new
StringBuffer();
private
int
count
=
4;
private
String
inputContent;
public
SecurityCodeView(Context
context)
{
this(context,
null);
}
public
SecurityCodeView(Context
context,
AttributeSet
attrs)
{
this(context,
attrs,
0);
}
public
SecurityCodeView(Context
context,
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
TextViews
=
new
TextView[4];
View.inflate(context,
R.layout.view_security_code,
this);
editText
=
(EditText)
findViewById(R.id.item_edittext);
TextViews[0]
=
(TextView)
findViewById(R.id.item_code_iv1);
TextViews[1]
=
(TextView)
findViewById(R.id.item_code_iv2);
TextViews[2]
=
(TextView)
findViewById(R.id.item_code_iv3);
TextViews[3]
=
(TextView)
findViewById(R.id.item_code_iv4);
editText.setCursorVisible(false);//将光标隐藏
setListener();
}
/**
*
清空输入内容
*/
public
void
clearEditText()
{
stringBuffer.delete(0,
stringBuffer.length());
inputContent
=
stringBuffer.toString();
for
(int
i
=
0;
i
<
TextViews.length;
i++)
{
TextViews[i].setText("");
TextViews[i].setBackgroundResource(R.mipmap.bg_verify);
}
}
private
InputCompleteListener
inputCompleteListener;
public
void
setInputCompleteListener(InputCompleteListener
inputCompleteListener)
{
this.inputCompleteListener
=
inputCompleteListener;
}
public
interface
InputCompleteListener
{
void
inputComplete();
void
deleteContent(boolean
isDelete);
}
/**
*
获取输入文本
*
*
@return
*/
public
String
getEditContent()
{
return
inputContent;
}监听代码
private
void
setListener()
{
editText.addTextChangedListener(new
TextWatcher()
{
@Override
public
void
beforeTextChanged(CharSequence
charSequence,
int
i,
int
i1,
int
i2)
{
}
@Override
public
void
onTextChanged(CharSequence
charSequence,
int
i,
int
i1,
int
i2)
{
}
@Override
public
void
afterTextChanged(Editable
editable)
{
//重点
如果字符不为""时才进行操作
if
(!editable.toString().equals(""))
{
if
(stringBuffer.length()
>
3)
{
//当文本长度大于3位时edittext置空
editText.setText("");
return;
}
else
{
//将文字添加到StringBuffer中
stringBuffer.append(editable);
editText.setText("");//添加后将EditText置空
造成没有文字输入的错局
//
Log.e("TAG",
"afterTextChanged:
stringBuffer
is
"
+
stringBuffer);
count
=
stringBuffer.length();//记录stringbuffer的长度
inputContent
=
stringBuffer.toString();
if
(stringBuffer.length()
==
4)
{
//文字长度位4
则调用完成输入的监听
if
(inputCompleteListener
!=
null)
{
inputCompleteListener.inputComplete();
}
}
}
for
(int
i
=
0;
i
<
stringBuffer.length();
i++)
{
TextViews[i].setText(String.valueOf(inputContent.charAt(i)));
TextViews[i].setBackgroundResource(R.mipmap.bg_verify_press);
}
}
}
});
editText.setOnKeyListener(new
OnKeyListener()
{
@Override
public
boolean
onKey(View
v,
int
keyCode,
KeyEvent
event)
{
if
(keyCode
==
KeyEvent.KEYCODE_DEL
&&
event.getAction()
==
KeyEvent.ACTION_DOWN)
{
if
(onKeyDelete())
return
true;
return
true;
}
return
false;
}
});
}
public
boolean
onKeyDelete()
{
if
(count
==
0)
{
count
=
4;
return
true;
}
if
(stringBuffer.length()
>
0)
{
//删除相应位置的字符
stringBuffer.delete((count
-
1),
count);
count--;
//
Log.e(TAG,
"afterTextChanged:
stringBuffer
is
"
+
stringBuffer);
inputContent
=
stringBuffer.toString();
TextViews[stringBuffer.length()].setText("");
TextViews[stringBuffer.length()].setBackgroundResource(R.mipmap.bg_verify);
if
(inputCompleteListener
!=
null)
inputCompleteListener.deleteContent(true);//有删除就通知manger
}
return
false;
}自定义的EditText到这了算是结束了弹出框的布局<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="283dp"
android:layout_height="273dp"
android:layout_gravity="center"
android:layout_marginBottom="50dp"
android:background="@mipmap/bg_view1"
android:orientation="vertical">
<include
layout="@layout/layout_titile"
/>
<com.example.admin.myapplication.SecurityCodeView
android:id="@+id/scv_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="35dp"
/>
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="13dp"
android:text="输入验证码表示同意《用户协议》"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="25dp"
android:layout_marginTop="3dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_phone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="13dp"
android:layout_weight="1"
android:text="电话"
/>
<TextView
android:id="@+id/tv_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="13dp"
android:text="重新发送"
android:textColor="@color/colorPrimary"
/>
</LinearLayout>
</LinearLayout>[大体的思路,点击事件之后弹出一个Dialog,然后再这个页面进行注册,有可能这个Dialog会复用,或者改一些样式(采用Builder设计模式)]接下来自定义Dialog要实现EditText的两个接口public
class
XyAlertDialog
extends
DialogFragment
implements
SecurityCodeView.InputCompleteListener
{
private
SecurityCodeView
editText;
private
TextView
text;
private
TextView
tv_title;
private
ImageView
img_close;
public
static
final
String
TAG
=
XyAlertDialog.class.getSimpleName();
private
Builder
builder;
private
static
XyAlertDialog
instance
=
new
XyAlertDialog();
private
TextView
tv_phone;
private
TextView
tv_click;
public
static
XyAlertDialog
getInstance()
{
return
instance;
}
@Override
public
void
onCreate(@Nullable
Bundle
savedInstanceState)
{
this.setCancelable(true);
setRetainInstance(true);
super.onCreate(savedInstanceState);
if
(savedInstanceState
!=
null)
{
try
{
if
(isAdded()
&&
getActivity()
!=
null)
if
(builder
!=
null)
builder
=
(Builder)
savedInstanceState.getSerializable(Builder.class.getSimpleName());
}
catch
(Exception
e)
{
}
}
}
@Override
public
void
onSaveInstanceState(Bundle
outState)
{
super.onSaveInstanceState(outState);
try
{
if
(isAdded()
&&
getActivity()
!=
null)
if
(builder
!=
null)
outState.putSerializable(Builder.class.getSimpleName(),
builder);
}
catch
(Exception
e)
{
Log.d(TAG,
e.toString());
}
}
@NonNull
@Override
public
Dialog
onCreateDialog(Bundle
savedInstanceState)
{
Dialog
dialog
=
super.onCreateDialog(savedInstanceState);
dialog.getWindow().setBackgroundDrawable(new
ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.setCanceledOnTouchOutside(false);//点击旁白不消失
return
dialog;
}
@Nullable
@Override
public
View
onCreateView(LayoutInflater
inflater,
@Nullable
ViewGroup
container,
@Nullable
Bundle
savedInstanceState)
{
return
inflater.inflate(R.layout.activity_xia,
container,
false);
}
@Override
public
void
onViewCreated(View
view,
@Nullable
Bundle
savedInstanceState)
{
super.onViewCreated(view,
savedInstanceState);
initViews(view);
}
private
Dialog
show(Activity
activity,
Builder
builder)
{
this.builder
=
builder;
if
(!isAdded())
show(((AppCompatActivity)
activity).getSupportFragmentManager(),
TAG);
return
getDialog();
}
private
void
initViews(View
view)
{
tv_title
=
(TextView)
view.findViewById(R.id.tv_title);
img_close
=
(ImageView)
view.findViewById(R.id.img_close);
editText
=
(SecurityCodeView)
view.findViewById(R.id.scv_edittext);
text
=
(TextView)
view.findViewById(R.id.tv_text);
tv_phone
=
(TextView)
view.findViewById(R.id.tv_phone);
tv_click
=
(TextView)
view.findViewById(R.id.tv_click);
editText.setInputCompleteListener(this);
tv_phone.setText(builder.getTextTitle());
img_close.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
view)
{
dismiss();
}
});
tv_click.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
view)
{
CountDownTimerUtils
mCountDownTimerUtils
=
new
CountDownTimerUtils(tv_click,
60000,
1000);
mCountDownTimerUtils.start();
}
});
}
public
static
class
Builder
implements
Serializable
{
private
String
positiveButtonText;
private
String
negativeButtonText;
private
String
textTitle;
private
String
body;
private
OnPositiveClicked
onPositiveClicked;
private
OnNegativeClicked
onNegativeClicked;
private
boolean
autoHide;
private
int
timeToHide;
private
int
positiveTextColor;
private
int
backgroundColor;
private
int
negativeColor;
private
int
titleColor;
private
int
bodyColor;
private
Typeface
titleFont;
private
Typeface
bodyFont;
private
Typeface
positiveButtonFont;
private
Typeface
negativeButtonFont;
private
Typeface
alertFont;
private
Context
context;
private
PanelGravity
buttonsGravity;
public
PanelGravity
getButtonsGravity()
{
return
buttonsGravity;
}
public
Builder
setButtonsGravity(PanelGravity
buttonsGravity)
{
this.buttonsGravity
=
buttonsGravity;
return
this;
}
public
Typeface
getAlertFont()
{
return
alertFont;
}
public
Builder
setAlertFont(String
alertFont)
{
this.alertFont
=
Typeface.createFromAsset(context.getAssets(),
alertFont);
return
this;
}
public
Typeface
getPositiveButtonFont()
{
return
positiveButtonFont;
}
public
Builder
setPositiveButtonFont(String
positiveButtonFont)
{
this.positiveButtonFont
=
Typeface.createFromAsset(context.getAssets(),
positiveButtonFont);
return
this;
}
public
Typeface
getNegativeButtonFont()
{
return
negativeButtonFont;
}
public
Builder
setNegativeButtonFont(String
negativeButtonFont)
{
this.negativeButtonFont
=
Typeface.createFromAsset(context.getAssets(),
negativeButtonFont);
return
this;
}
public
Typeface
getTitleFont()
{
return
titleFont;
}
public
Builder
setTitleFont(String
titleFontPath)
{
this.titleFont
=
Typeface.createFromAsset(context.getAssets(),
titleFontPath);
return
this;
}
public
Typeface
getBodyFont()
{
return
bodyFont;
}
public
Builder
setBodyFont(String
bodyFontPath)
{
this.bodyFont
=
Typeface.createFromAsset(context.getAssets(),
bodyFontPath);
return
this;
}
public
int
getTimeToHide()
{
return
timeToHide;
}
public
Builder
setTimeToHide(int
timeToHide)
{
this.timeToHide
=
timeToHide;
return
this;
}
public
boolean
isAutoHide()
{
return
autoHide;
}
public
Builder
setAutoHide(boolean
autoHide)
{
this.autoHide
=
autoHide;
return
this;
}
public
Context
getContext()
{
return
context;
}
public
Builder
setActivity(Context
context)
{
this.context
=
context;
return
this;
}
public
Builder(Context
context)
{
this.context
=
context;
}
public
void
setCancelable(boolean
flag)
{
throw
new
RuntimeException("Stub!");
}
public
int
getPositiveTextColor()
{
return
positiveTextColor;
}
public
Builder
setPositiveColor(int
positiveTextColor)
{
this.positiveTextColor
=
positiveTextColor;
return
this;
}
public
int
getBackgroundColor()
{
return
backgroundColor;
}
public
Builder
setBackgroundColor(int
backgroundColor)
{
this.backgroundColor
=
backgroundColor;
return
this;
}
public
int
getNegativeColor()
{
return
negativeColor;
}
public
Builder
setNegativeColor(int
negativeColor)
{
this.negativeColor
=
negativeColor;
return
this;
}
public
int
getTitleColor()
{
return
titleColor;
}
public
Builder
setTitleColor(int
titleColor)
{
this.titleColor
=
titleColor;
return
this;
}
public
int
getBodyColor()
{
return
bodyColor;
}
public
Builder
setBodyColor(int
bodyColor)
{
this.bodyColor
=
bodyColor;
return
this;
}
public
String
getPositiveButtonText()
{
return
positiveButtonText;
}
public
Builder
setPositiveButtonText(int
positiveButtonText)
{
this.positiveButtonText
=
context.getString(positiveButtonText);
return
this;
}
public
Builder
setPositiveButtonText(String
positiveButtonText)
{
this.positiveButtonText
=
positiveButtonText;
return
this;
}
public
String
getNegativeButtonText()
{
return
negativeButtonText;
}
public
Builder
setNegativeButtonText(String
negativeButtonText)
{
this.negativeButtonText
=
negativeButtonText;
return
this;
}
public
Builder
setNegativeButtonText(int
negativeButtonText)
{
this.negativeButtonText
=
context.getString(negativeButtonText);
return
this;
}
public
String
getTextTitle()
{
return
textTitle;
}
public
Builder
setTextTitle(String
textTitle)
{
this.textTitle
=
textTitle;
retur
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年中大型重载轴承行业企业战略风险管理报告
- 2024年高压均质设备项目分析评价报告
- 2024年复合微生物肥料项目调研分析报告
- 2024年CT模拟定位机项目调研分析报告
- 2024年铬氧化铝陶瓷材料项目调研分析报告
- 2024年芝士片项目调研分析报告
- 2024年能量系统优化行业企业战略风险管理报告
- 2024年风力发电机组项目分析评价报告
- 【可行性报告】2023年机场行李输送系统相关行业可行性分析报告
- 2023年模型制作项目评估报告
- GB/T 36814-2018进境植物隔离检疫圃的设计和操作
- 2023 年九年级数学中考复习 几何图形变换综合压轴题 培优提升专题训练(含解析)
- 外研版七年级下册英语全册教案完整版教学设计含教学反思
- 加油站员工安全生产教育培训档案范本参考模板范本
- 国家电力投资集团公司安全监督实施办法(发布稿)
- 创新创业实践课程课件
- 工程建设项目招标投标问责细则
- 例谈小组合作学习在小学英语教学中的有效开展(讲座)课件
- 青春期和人际交往课件
- 用待定系数法确定一次函数表达式课件讲义
- 驾驶员管理台帐
评论
0/150
提交评论