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. 使用<s:property value="4"/>是报错

    报错的情况是 在jsp中引入标签 <%@ taglib uri="/struts-tags" prefix="s" %> 项目中也有ognl.jar ...

  2. SQL Server中的执行引擎入门

      简介 当查询优化器(Query Optimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(Execution Engine)来进行执行.本文旨在 ...

  3. 如何理解python中的if __name__=='main'的作用

    一. 一个浅显易懂的比喻 我们在学习python编程时,不可避免的会遇到if __name__=='main'这样的语句,它到底有什么作用呢? <如何简单地理解Python中的if __name ...

  4. python直接赋值,浅拷贝和深拷贝

    本文参考自<Python 直接赋值.浅拷贝和深度拷贝解析> 定义 直接赋值:就是对象的引用(别名) 浅拷贝(copy):拷贝父对象,不拷贝对象内部的子对象 深拷贝(deepcopy):co ...

  5. vue项目打包注意的地方

    打包有两种方式: 第一种方式:1.更改config文件夹下prod.env.js下的地址: 2.将config文件夹下index.js中build下改为 assetsPublicPath: '', 第 ...

  6. LeetCode OJ:Largest Number(最大数字)

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  7. L122

    These plants have much of the same nutritional value that a real plant has. Search giant Google says ...

  8. 2018.7.7 MBA -从专业到管理(1)—— 技术人才与的管理人才比较

    目录 1从基层员工到基层管理 专业,专长,专能,受赏识,团结同事 2从 基层管理到中层管理 重点:一专多能, 打造团队, 获取资源,对外沟通 3从中层到高层 重点:战略规划, 选拔人才 , 市场扩展

  9. Leetcode 976. Largest Perimeter Triangle

    送分题 class Solution(object): def largestPerimeter(self, A): """ :type A: List[int] :rt ...

  10. CCEditBox

    EditBox 创建添加 以及 一些函数参数的解析 #include "GUI/CCEditBox/CCEditBox.h" #include "GUI/CCContro ...