import android.app.Activity;
import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; /**
*
* ModifyCountDialog ModifyCountDialog = new ModifyCountDialog.Builder(
* Activity.this,2030L).build();
* ModifyCountDialog.setModifyCountListener(new ModifyCountListener(){
* @Override
* public void onDelivered(long Count) {
* Log.d(TAG, "--------送你"+Count+"朵花");
* }
*
* });
* ModifyCountDialog.show();
*
*
*/
public class ModifyCountDialog extends popDialog implements OnClickListener
,OnTouchListener{ private static final String TAG = "ModifyCountDialog";
private static final int SCORE_PER_ = 10; // currentScore = totalScore - Count * SCORE_PER_ private Activity mActivity;
private String title; // title string, have default
// R.string.dialog_deliver__title
private long totalScore; // user total score private long mMaxCount = 0;
private long mCurrentCount = 0;
private long mCurrentScore; private Button mBtnCountSub;
private Button mBtnCountAdd; private TextView mTvScore;
private EditText mEditCount; // private boolean isButtonCountChange=false; public static class Builder {
private final Activity mActivity; private String title;
private long score; // user current score /**
* @param context
* @param score
*/
public Builder(Activity context, long score) {
this.mActivity = context;
this.score = score;
} public Builder title(String title) {
this.title = title;
return this;
} public ModifyCountDialog build() {
return new ModifyCountDialog(this);
}
} private ModifyCountDialog(Builder builder) {
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();
} private void initDialog() {
View view = 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);   //set keyboard property, the dialog will push up getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);     this.build(view, true);
  }   @Override
  public boolean onTouch(View v, MotionEvent event) {
    if(v.getId()==R.id.dialog_deliver_flower_count) {
      mEditFlowerCount.selectAll(); //select all character in EditText
      showKeyboard(mEditFlowerCount); //without calling this. keyboard hide
      return true;
    }
    return false;
  }   private boolean isCountLegal(long count){
return (count >=0)&&(count <= mMaxCount);
} /**
* EditText text change watcher
*
* when user input is illegal, setText to 0 or MaxCount
*
* warn: call setText() in wrong place, will cause infinite loop and StackOverFlow
*
*/
TextWatcher mTextWatcher = new TextWatcher() {
private long mCount;
@Override
public void onTextChanged(CharSequence s, int start, int before,int count) { } @Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override
public void afterTextChanged(Editable s) {
String str = s.toString();
// Log.d(TAG, "---myc---afterTextChanged str------" + str);
if(!TextUtils.isEmpty(str) && TextUtils.isDigitsOnly(str)){
mCount = Long.parseLong(str);
}else{
mCount = 0;
} //if user input is illegal, set to legal count
if(!isCountLegal(mCount)){
if(mCount < 0){
mCount = 0;
}else if(mCount > mMaxFlowerCount){
mCount = mMaxFlowerCount;
}
mEditFlowerCount.setText(String.valueOf(mCount)); //illegal, set to 0 or maxFlowerCount
mEditFlowerCount.selectAll();
}
setCurrentFlowerCount(mCount);
}
}; /**
* getter
*
* @return
*/
public long getCurrentCount() {
return this.mCurrentCount;
} /**
* setter
*
* @return
*/
public void setCurrentCount(long Count) {
if(isCountLegal(Count) && Count!=mCurrentCount){
Log.d(TAG, "---setCurrentCount------" + Count);
this.mCurrentCount = Count;
refreshUI(Count);
}
} ModifyCountListener mModifyCountListener; public interface ModifyCountListener { //在Activity里弹框获取用户输入,可以通过回调的方法来获取用户输入值
void onModified(long Count);
} public void setModifyCountListener(ModifyCountListener listener) {
mModifyCountListener = listener;
} /**
* user press "modify" button
*
*/
private void doModifyCount() {
if (mModifyCountListener != null) {
mModifyCountListener.onModified(mCurrentCount);    //将值回调给Activity
}
} /**
* refresh EditText, current core TextView and so on
*
* @param Count
*/
private void refreshUI(long Count) {
mCurrentScore = totalScore - Count * SCORE_PER_; if (mCurrentScore >= 0) {
mTvScore.setText(String.valueOf(mCurrentScore));
} if (Count <= 0) {
setBtnClickable(false, true);
} else if (Count >= mMaxCount) {
setBtnClickable(true, false);
} else {
setBtnClickable(true, true);
}
} /**
* hide keyboard
*
* @param v
*/
private void hideKeyboard(View v) {
// Log.d(TAG, "---hideKeyboard()------");
if(v == null){
return;
}
InputMethodManager imm = (InputMethodManager) v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
} /**
* show keyboard
*
* @param v
*/
private void showKeyboard(View v) {
// Log.d(TAG, "---showKeyboard()------");
if(v == null){
return;
}
InputMethodManager imm = (InputMethodManager) v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(v, 0);
} /**
* set Button Clickable
*
* @param canSub
* if true, can sub count
* @param canAdd
* if true, can add count
*/
private void setBtnClickable(boolean canSub, boolean canAdd) {
mBtnCountSub.setClickable(canSub);
mBtnCountAdd.setClickable(canAdd);
} @Override
public void onClick(View view) {
if(!view.equals(R.id.dialog_deliver__count))      
{
hideKeyboard(mEditCount);
}
   switch (view.getId()) {
case R.id.btn_cancle:
this.dismiss();
break;
case R.id.btn_deliver:
doModifyCount();
this.dismiss();
break;
case R.id.count_sub:
if (mCurrentCount > 0) {
setCurrentCount(mCurrentCount - 1);
mEditCount.setText(String.valueOf(mCurrentCount));
}
break;
case R.id.count_add:
if (getCurrentCount() < mMaxCount) {
setCurrentCount(getCurrentCount() + 1);
mEditCount.setText(String.valueOf(mCurrentCount));
}
break;
default:
break;
}
}
}

包括

(1)隐藏  和 弹出键盘

     /**
* hide keyboard
*
* @param v
*/
private void hideKeyboard(View v) {
// Log.d(TAG, "---hideKeyboard()------");
if(v == null){
return;
}
InputMethodManager imm = (InputMethodManager) v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
} /**
* show keyboard
*
* @param v
*/
private void showKeyboard(View v) {
// Log.d(TAG, "---showKeyboard()------");
if(v == null){
return;
}
InputMethodManager imm = (InputMethodManager) v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(v, 0);
}

(2)防止键盘挡住输入框

         //set keyboard property, the dialog will push up  防止EditText被挡住, 往上推Dialog
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |  
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

(3)点击EditText以外的区域,隐藏键盘,注意父view要设置onClickListener

parentView.setOnClickListener(this); 

@Override
public void onClick(View view) {
if(!view.equals(R.id.dialog_deliver__count))      
{
hideKeyboard(mEditCount);
}
}

本来想在 EditText OnFocusListener()里监听, 失去焦点后,隐藏键盘. 不起作用

因为对话框弹出的时候, EditText的isFocused是true的。除非点击按钮等,才会失去焦点。但是现在是想点击任何区域都失去焦点。

所以需要通过监听整个父控件

(4) 监听EditText输入

官方文档也指出:千万注意别在三个方法里随意重复调用setText,会死循环
mEditCount.addTextChangedListener(mTextWatcher);        //先给EditText设置监听
    /**
* EditText text change watcher                  
*
* when user input is illegal, setText to 0 or MaxCount    
*
* warn: call setText() in wrong place, will cause infinite loop and StackOverFlow  
*
*/
TextWatcher mTextWatcher = new TextWatcher() {
private long mCount;
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) { } @Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) { } @Override
public void afterTextChanged(Editable s) {
String str = s.toString();
// Log.d(TAG, "---afterTextChanged str------" + str); if(!TextUtils.isEmpty(str) && TextUtils.isDigitsOnly(str)){
mCount = Long.parseLong(str);
}else{
mCount = 0;
} //if user input is illegal, set to legal count
if(!isCountLegal(mCount)){
if(mCount < 0){
mCount = 0;
}else if(mCount > mMaxCount){
mCount = mMaxCount;
}
mEditCount.setText(String.valueOf(mCount)); //illegal, set to 0 or maxCount
mEditCount.selectAll(); //如果设置成最大值以后不全选,再点一个数字.s比最大值还大,EditText没反                                          //应,看起来就像失去焦点了. 但事实上调用 isFocused判断时, 还是有焦点的
}
setCurrentCount(mCount);
}
};
(5)全选一个输入框的内容
     @Override
public boolean onTouch(View v, MotionEvent event) {
if(v.getId()==R.id.dialog_deliver__count) {
mEditCount.selectAll(); //全选EditText的内容
showKeyboard(mEditCount); //全选完如果不调用这个,不弹出键盘
return true;
}
return false;
}
 

Android 自定义带回调的Dialog 及EditText相关的更多相关文章

  1. Android 自定义带刻度的seekbar

    自定义带刻度的seekbar 1.布局 <span style="font-family:SimHei;font-size:18px;"><com.imibaby ...

  2. Android自定义View带有删除按钮的EditText

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/11066685 今天给大家带来一个很实用的小控件ClearEditText,就是在Andr ...

  3. Android自定义带标题边框的Layout

    今天工作中又碰到个小问题,项目需要用到像Java Swing的JPanel一样带标题边框的布局,Android里没有类似控件,想到这个也不难,自己画了一个,是继承LinearLayout的一个自定义布 ...

  4. Android -- 自定义带进度条的按钮

    1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击

  5. android 自定义alertdialog和取消dialog

    看代码: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle ...

  6. 35.Android之带删除按钮EditText学习

    今天实现Android里自定义带删除功能的EditText,效果如下: 当输入内容时,EditText变为带有一个删除功能按钮的编辑框,如图: 实现代码很简单,直接上代码, 布局文件xml: < ...

  7. [置顶] xamarin android自定义标题栏(自定义属性、回调事件)

    自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...

  8. Android自定义底部带有动画的Dialog

    Android自定义底部带有动画的Dialog 效果图 先看效果图,是不是你想要的呢 自定义Dialog package --.view; import android.app.Dialog; imp ...

  9. 我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)

    今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...

随机推荐

  1. Angular各版本和组件下载

    Angular各版本和组件下载:https://code.angularjs.org/

  2. Struts2架构流程

    [Struts2] Action实现. interceptor实现. Filter工作原理. 使用 拦截器来处理请求. 业务逻辑控制器与 Servlet API分离. ================ ...

  3. 2D游戏摄像机跟随不出界

    做2D游戏的时候碰上摄像机要跟随人物时要防止摄像机看到界面外的黑幕,直接上代码. using System.Collections; using System.Collections.Generic; ...

  4. hdu3157有源汇上下界最小流

    题意:有源汇上下界最小流裸题,主要就是输入要用字符串的问题 #include<bits/stdc++.h> #define fi first #define se second #defi ...

  5. 倒置字符串函数reverse

    倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置, 如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321, 程序如下: #include<st ...

  6. [非原创] 常用加密算法整理 AES/SSL(一)

    前言: 在伟大的计算机科学家研究下,发明了许多的加密算法,以下做个简答的描述: 一.分类 加密算法分为两种:单向加密.双向加密. 单向加密,不可逆的加密算法,只能加密不能解密: 双向加密,由对称性加密 ...

  7. 达观数据分析平台架构和Hive实践——TODO

    转自: http://www.infoq.com/cn/articles/hadoop-ten-years-part03 编者按:Hadoop于2006年1月28日诞生,至今已有10年,它改变了企业对 ...

  8. Handsontable-一款仿 Excel效果的表格插件使用总结 96

    最近在做一个关于报表管理的项目,发现了一款很好用的jQuery插件-Handsontable.它真的特别给力,在 Excel 中可进行的操作,你几乎都可以在网页中做到,如拖动复制.Ctrl+C .Ct ...

  9. RNN、LSTM、Char-RNN 学习系列(一)

    RNN.LSTM.Char-RNN 学习系列(一) zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouw  2016-3-15 版权声明 ...

  10. android 关于Toast重复显示解决方法

    解决思路:   不用计算Toast的时间之类的,就是定义一个全局的成员变量Toast, 这个Toast不为null的时候才去make,否则直接setText.为了按返回键后立即使Toast不再显示,重 ...