Establecer incambiable alguna parte de editText android

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? enter image description here

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

enter image description here

 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 ");