Android 自定义带回调的Dialog 及EditText相关
2015-08-14 14:25
696 查看
importandroid.app.Activity;
importandroid.content.Context;
importandroid.text.Editable;
importandroid.text.TextUtils;
importandroid.text.TextWatcher;
importandroid.view.LayoutInflater;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.View.OnTouchListener;
importandroid.view.WindowManager;
importandroid.view.inputmethod.InputMethodManager;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.TextView;
/**
*
*ModifyCountDialogModifyCountDialog=newModifyCountDialog.Builder(
*Activity.this,2030L).build();
*ModifyCountDialog.setModifyCountListener(newModifyCountListener(){
*@Override
*publicvoidonDelivered(longCount){
*Log.d(TAG,"--------送你"+Count+"朵花");
*}
*
*});
*ModifyCountDialog.show();
*
*
*/
publicclassModifyCountDialogextendspopDialogimplementsOnClickListener
,OnTouchListener{
privatestaticfinalStringTAG="ModifyCountDialog";
privatestaticfinalintSCORE_PER_=10;//currentScore=totalScore-Count*SCORE_PER_
privateActivitymActivity;
privateStringtitle;//titlestring,havedefault
//R.string.dialog_deliver__title
privatelongtotalScore;//usertotalscore
privatelongmMaxCount=0;
privatelongmCurrentCount=0;
privatelongmCurrentScore;
privateButtonmBtnCountSub;
privateButtonmBtnCountAdd;
privateTextViewmTvScore;
privateEditTextmEditCount;
//privatebooleanisButtonCountChange=false;
publicstaticclassBuilder{
privatefinalActivitymActivity;
privateStringtitle;
privatelongscore;//usercurrentscore
/**
*@paramcontext
*@paramscore
*/
publicBuilder(Activitycontext,longscore){
this.mActivity=context;
this.score=score;
}
publicBuildertitle(Stringtitle){
this.title=title;
returnthis;
}
publicModifyCountDialogbuild(){
returnnewModifyCountDialog(this);
}
}
privateModifyCountDialog(Builderbuilder){
super(builder.mActivity);
this.mActivity=builder.mActivity;
this.totalScore=builder.score;
if(this.totalScore>0){
this.mMaxCount=(long)(this.totalScore/SCORE_PER_);
this.mCurrentScore=this.totalScore;
}
if(!TextUtils.isEmpty(builder.title)){
this.title=builder.title;
}
initDialog();
}
privatevoidinitDialog(){
Viewview=LayoutInflater.from(mActivity).inflate(
R.layout.dialog_deliver_,null,false);
view.findViewById(R.id.btn_cancle).setOnClickListener(this);
view.findViewById(R.id.btn_deliver).setOnClickListener(this);
mBtnCountSub=(Button)view
.findViewById(R.id.dialog_deliver__count_sub);
mBtnCountSub.setOnClickListener(this);
mBtnCountAdd=(Button)view
.findViewById(R.id.dialog_deliver__count_add);
mBtnCountAdd.setOnClickListener(this);
mTvScore=(TextView)view
.findViewById(R.id.dialog_deliver__score_tv);
mTvScore.setText(String.valueOf(totalScore));
mEditCount=(EditText)view
.findViewById(R.id.dialog_deliver__count);
mEditCount.setOnTouchListener(this);
//setkeyboardproperty,thedialogwillpushupgetWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE|WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
this.build(view,true);
}
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
if(v.getId()==R.id.dialog_deliver_flower_count){
mEditFlowerCount.selectAll();//selectallcharacterinEditText
showKeyboard(mEditFlowerCount);//withoutcallingthis.keyboardhide
returntrue;
}
returnfalse;
}
privatebooleanisCountLegal(longcount){
return(count>=0)&&(count<=mMaxCount);
}
/**
*EditTexttextchangewatcher
*
*whenuserinputisillegal,setTextto0orMaxCount
*
*warn:callsetText()inwrongplace,willcauseinfiniteloopandStackOverFlow
*
*/
TextWatchermTextWatcher=newTextWatcher(){
privatelongmCount;
@Override
publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
}
@Override
publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){
}
@Override
publicvoidafterTextChanged(Editables){
Stringstr=s.toString();
//Log.d(TAG,"---myc---afterTextChangedstr------"+str);
if(!TextUtils.isEmpty(str)&&TextUtils.isDigitsOnly(str)){
mCount=Long.parseLong(str);
}else{
mCount=0;
}
//ifuserinputisillegal,settolegalcount
if(!isCountLegal(mCount)){
if(mCount<0){
mCount=0;
}elseif(mCount>mMaxFlowerCount){
mCount=mMaxFlowerCount;
}
mEditFlowerCount.setText(String.valueOf(mCount));//illegal,setto0ormaxFlowerCount
mEditFlowerCount.selectAll();
}
setCurrentFlowerCount(mCount);
}
};
/**
*getter
*
*@return
*/
publiclonggetCurrentCount(){
returnthis.mCurrentCount;
}
/**
*setter
*
*@return
*/
publicvoidsetCurrentCount(longCount){
if(isCountLegal(Count)&&Count!=mCurrentCount){
Log.d(TAG,"---setCurrentCount------"+Count);
this.mCurrentCount=Count;
refreshUI(Count);
}
}
ModifyCountListenermModifyCountListener;
publicinterfaceModifyCountListener{//在Activity里弹框获取用户输入,可以通过回调的方法来获取用户输入值
voidonModified(longCount);
}
publicvoidsetModifyCountListener(ModifyCountListenerlistener){
mModifyCountListener=listener;
}
/**
*userpress"modify"button
*
*/
privatevoiddoModifyCount(){
if(mModifyCountListener!=null){
mModifyCountListener.onModified(mCurrentCount); //将值回调给Activity
}
}
/**
*refreshEditText,currentcoreTextViewandsoon
*
*@paramCount
*/
privatevoidrefreshUI(longCount){
mCurrentScore=totalScore-Count*SCORE_PER_;
if(mCurrentScore>=0){
mTvScore.setText(String.valueOf(mCurrentScore));
}
if(Count<=0){
setBtnClickable(false,true);
}elseif(Count>=mMaxCount){
setBtnClickable(true,false);
}else{
setBtnClickable(true,true);
}
}
/**
*hidekeyboard
*
*@paramv
*/
privatevoidhideKeyboard(Viewv){
//Log.d(TAG,"---hideKeyboard()------");
if(v==null){
return;
}
InputMethodManagerimm=(InputMethodManager)v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(),0);
}
/**
*showkeyboard
*
*@paramv
*/
privatevoidshowKeyboard(Viewv){
//Log.d(TAG,"---showKeyboard()------");
if(v==null){
return;
}
InputMethodManagerimm=(InputMethodManager)v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(v,0);
}
/**
*setButtonClickable
*
*@paramcanSub
*iftrue,cansubcount
*@paramcanAdd
*iftrue,canaddcount
*/
privatevoidsetBtnClickable(booleancanSub,booleancanAdd){
mBtnCountSub.setClickable(canSub);
mBtnCountAdd.setClickable(canAdd);
}
@Override
publicvoidonClick(Viewview){
if(!view.equals(R.id.dialog_deliver__count))
{
hideKeyboard(mEditCount);
}
switch(view.getId()){
caseR.id.btn_cancle:
this.dismiss();
break;
caseR.id.btn_deliver:
doModifyCount();
this.dismiss();
break;
caseR.id.count_sub:
if(mCurrentCount>0){
setCurrentCount(mCurrentCount-1);
mEditCount.setText(String.valueOf(mCurrentCount));
}
break;
caseR.id.count_add:
if(getCurrentCount()<mMaxCount){
setCurrentCount(getCurrentCount()+1);
mEditCount.setText(String.valueOf(mCurrentCount));
}
break;
default:
break;
}
}
}
包括
(1)隐藏和弹出键盘
/**
*hidekeyboard
*
*@paramv
*/
privatevoidhideKeyboard(Viewv){
//Log.d(TAG,"---hideKeyboard()------");
if(v==null){
return;
}
InputMethodManagerimm=(InputMethodManager)v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(),0);
}
/**
*showkeyboard
*
*@paramv
*/
privatevoidshowKeyboard(Viewv){
//Log.d(TAG,"---showKeyboard()------");
if(v==null){
return;
}
InputMethodManagerimm=(InputMethodManager)v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(v,0);
}
(2)防止键盘挡住输入框
//setkeyboardproperty,thedialogwillpushup防止EditText被挡住,往上推Dialog
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE|
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
(3)点击EditText以外的区域,隐藏键盘,注意父view要设置onClickListener
parentView.setOnClickListener(this);
@Override
publicvoidonClick(Viewview){
if(!view.equals(R.id.dialog_deliver__count))
{
hideKeyboard(mEditCount);
}
}
本来想在EditTextOnFocusListener()里监听,失去焦点后,隐藏键盘.不起作用
因为对话框弹出的时候,EditText的isFocused是true的。除非点击按钮等,才会失去焦点。但是现在是想点击任何区域都失去焦点。
所以需要通过监听整个父控件
(4)监听EditText输入
官方文档也指出:千万注意别在三个方法里随意重复调用setText,会死循环
mEditCount.addTextChangedListener(mTextWatcher); //先给EditText设置监听
/**
*EditTexttextchangewatcher
*
*whenuserinputisillegal,setTextto0orMaxCount
*
*warn:callsetText()inwrongplace,willcauseinfiniteloopandStackOverFlow
*
*/
TextWatchermTextWatcher=newTextWatcher(){
privatelongmCount;
@Override
publicvoidonTextChanged(CharSequences,intstart,intbefore,
intcount){
}
@Override
publicvoidbeforeTextChanged(CharSequences,intstart,intcount,
intafter){
}
@Override
publicvoidafterTextChanged(Editables){
Stringstr=s.toString();
//Log.d(TAG,"---afterTextChangedstr------"+str);
if(!TextUtils.isEmpty(str)&&TextUtils.isDigitsOnly(str)){
mCount=Long.parseLong(str);
}else{
mCount=0;
}
//ifuserinputisillegal,settolegalcount
if(!isCountLegal(mCount)){
if(mCount<0){
mCount=0;
}elseif(mCount>mMaxCount){
mCount=mMaxCount;
}
mEditCount.setText(String.valueOf(mCount));//illegal,setto0ormaxCount
mEditCount.selectAll();//如果设置成最大值以后不全选,再点一个数字.s比最大值还大,EditText没反 //应,看起来就像失去焦点了.但事实上调用isFocused判断时,还是有焦点的
}
setCurrentCount(mCount);
}
};
(5)全选一个输入框的内容
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
if(v.getId()==R.id.dialog_deliver__count){
mEditCount.selectAll();//全选EditText的内容
showKeyboard(mEditCount);//全选完如果不调用这个,不弹出键盘
returntrue;
}
returnfalse;
}
相关文章推荐
- 用在计时器上的“神器”------Timer
- 【Android学习笔记】【Android学习资源】GitHub上史上最全的Android开源项目分类汇总
- android 图片压缩方法
- Android-Xml序列化器生成短信xml文件
- Android中的Selector的用法
- Cubietruck---3. android编译命令分析
- Android的线程(Thread)和服务(Service)的区别
- Android学习笔记之二:矩阵ColorMatrix实现图片ARGB变化
- Android的线程(Thread)和服务(Service)的区别
- Android笔记:菜单
- Android Studio使用笔记
- Android--修改ListView的点击效果
- Android 强制下线功能 第一行代码
- Android取得已安装的应用列表
- 一张图看明白android 接口回调机制
- Android的存储目录
- 《深入理解Android 卷III》第八章深入理解Android壁纸
- 《深入理解Android 卷III》第六章 深入理解控件(ViewRoot)系统
- Android安全研究经验谈
- 《深入理解Android 卷III》第五章 深入理解Android输入系统