programmer/android Using EditText ocsoosoo 2013. 6. 14. 18:59 public static interface InputObserver{ public void onCanceled(); public void onCompleted(String input); } private Context mContext; private InputObserver mObserver=null; private AlertDialog mDialog=null; private AlertDialog.Builder mBuilder=null; private EditText mEdit=null; private Toast mToast; private final int INPUT_MAX = 50; InputFilter valueFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String prev = et.getText().toString(); if(prev.length() < 2){ return source; } StringBuilder sb = new StringBuilder(prev); sb.insert(dstart, source); int val = Integer.parseInt(sb.toString()); if(val > 100){ if (mToast != null) { mToast.setText("Maximum value is 100"); mToast.show(); } return ""; } return source; } }; private InputFilter specialCharFilter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Pattern ps = Pattern.compile("[\\*/\\\\\\?:<>\\|\"]+"); if (ps.matcher(source).find()) { if (mToast != null) { mToast.setText("invalid character."); mToast.show(); } return ""; } return source; } }; private InputFilter lengthFilter = new InputFilter.LengthFilter(INPUT_MAX){ @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { CharSequence result = super.filter(source, start, end, dest, dstart, dend); if (result != null) { if (mToast != null) { mToast.setText("Maximum length reached."); mToast.show(); } } return result; } }; private TextWatcher editWatcher = new TextWatcher(){ @Override public void afterTextChanged(Editable s) { if (mDialog != null) { Button btn = ((AlertDialog) mDialog).getButton(AlertDialog.BUTTON_POSITIVE); if (btn != null && mEdit != null) { if (mEdit.getText() != null) { String str = mEdit.getText().toString(); if (str != null) { btn.setEnabled((str.trim().length() > 0)); } } } } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after){ } @Override public void onTextChanged(CharSequence s, int start, int before, int count){ } }; public void show(){ if(mBuilder == null){ mBuilder = new AlertDialog.Builder(mContext); } mBuilder.setTitle(mTitle); View v = LayoutInflater.from(mContext).inflate(R.layout.edittext_layout, null); mEdit = (EditText)v.findViewById(R.id.input); mEdit.setSingleLine(); mEdit.setImeOptions(EditorInfo.IME_ACTION_DONE|EditorInfo.IME_FLAG_NO_EXTRACT_UI|EditorInfo.IME_FLAG_NO_FULLSCREEN); mEdit.setText("test"); mEdit.setFocusable(true); mEdit.setSelection("test".length()); //set cursor position to last mEdit.setFilters(new InputFilter[] {valueFilter, specialCharFilter, lengthFilter}); mEdit.addTextChangedListener(editWatcher); mBuilder.setView(v); mBuilder.setPositiveButton("OK", new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { closeImm(); String inputString = mEdit.getText().toString(); if(mObserver != null){ mObserver.onCompleted(inputString); } } }); mBuilder.setNegativeButton(R.string.general_cancel, new OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { closeImm(); if(mObserver != null){ mObserver.onCanceled(); } } }); mDialog = mBuilder.create(); mDialog.setOnShowListener(new OnShowListener(){ @Override public void onShow(DialogInterface dialog) { InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromInputMethod(mEdit.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); if (imm.isAccessoryKeyboardState() == 0){ //imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); imm.showSoftInput(mEdit, 0); } else { //imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_NOT_ALWAYS); imm.hideSoftInputFromWindow(mEdit.getWindowToken(), 0); } } }); mDialog.show(); } public void closeImm(){ if(mEdit != null){ InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mEdit.getWindowToken(), 0); } } 저작자표시 비영리 변경금지 (새창열림)