您的位置:首页 > 移动开发 > Android开发

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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: