Tengo algo de EditText para la entrada de número de móvil. La aplicación debe agregar texto único para cada país. Por ejemplo, para Armenia es necesario agregar +374
, y el usuario debe completar otros números. Además, +374
debe ser inalterable, el usuario no puede cambiarlo o eliminarlo. Entonces, ¿hay algún tipo de formas de hacer esto?
EDITAR:
No quiero usar textView u otra vista con este texto y ponerlo a la izquierda de ediText. Quiero encontrar el camino con menos operaciones. Necesito que el texto se congele para no revisar todos los cambios de texto o agregar texto faltante cuando el usuario elimine una parte de él.
Crea una clase dibujable personalizada que te ayude a convertir el texto en dibujable.
public class TextDrawable extends Drawable { private final String text; private final Paint paint; public TextDrawable(String text) { this.text = text; this.paint = new Paint(); paint.setColor(Color.BLACK); paint.setTextSize(16f); paint.setAntiAlias(true); paint.setTextAlign(Paint.Align.LEFT); } @Override public void draw(Canvas canvas) { canvas.drawText(text, 0, 6, paint); } @Override public void setAlpha(int alpha) { paint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { paint.setColorFilter(cf); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } }
A continuación, establezca el dibujable a la izquierda del texto de edición como
EditText et = (EditText)findViewById(R.id.editText1); String code = "+374"; et.setCompoundDrawablesWithIntrinsicBounds(new TextDrawable(code), null, null, null); et.setCompoundDrawablePadding(code.length()*10);
Donde el texto de edición está definido en el archivo de diseño como
La salida final se ve como
public class MainActivity extends Activity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText1); editText.setText("+374"); Selection.setSelection(editText.getText(), editText.getText().length()); editText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { if (!s.toString().startsWith("+374")) { editText.setText("+374"); Selection.setSelection(editText.getText(), editText .getText().length()); } } }); } }
Use el observador de texto y cuando el usuario ingrese +3 completa con +374 y compara los primeros cuatro caracteres y, si es lo mismo, deshabilita la presión atrás del teclado para que no cambie el texto y entre el otro dígito que se agrega para el texto utilizado por el observador de texto
puedes crear la clase extender AppCompatEditText o EditText.
clase pública CEditTextMaster extends AppCompatEditText {
private boolean isNeedNoChangeSomeCharacters; private String charactersNoChange; public CEditTextMaster(Context context) { super(context); init(context, null); } public CEditTextMaster(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public CEditTextMaster(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } public void init(Context context, @Nullable AttributeSet attrs) { if (isInEditMode()) return; addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (isNeedNoChangeSomeCharacters && charactersNoChange != null) { if (!getText().toString().startsWith(charactersNoChange)) { removeTextChangedListener(this); if (charactersNoChange.length() > s.length()) { setText(charactersNoChange); } else { setText(charactersNoChange + getText()); } setSelection(getText().toString().length()); addTextChangedListener(this); } } } }); } @Override protected void onSelectionChanged(int selStart, int selEnd) { if (isNeedNoChangeSomeCharacters && charactersNoChange != null) { if (length() > charactersNoChange.length() && selStart < charactersNoChange.length()) { setSelection(charactersNoChange.length(),selEnd); } } } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, type); if (isNeedNoChangeSomeCharacters && charactersNoChange != null) { if (!getText().toString().trim().startsWith(charactersNoChange)) { setText(charactersNoChange + getText()); } } } public void setCharactersNoChangeInitial(String charactersNoChange) { isNeedNoChangeSomeCharacters = true; this.charactersNoChange = charactersNoChange; if (!getText().toString().trim().startsWith(charactersNoChange)) { setText(getText()); } } }
para usar:
edt.setCharactersNoChangeInitial("+734 ");