设置不可更改的editText android的一部分

我有一些手机号码input的EditText。 应用必须为每个国家添加独特的文字。 例如亚美尼亚必须加上+374 ,用户必须填写其他数字。 另外+374必须是不可更改的,用户不能更改或删除它。 那么是否有某种方法可以做到这一点? 在这里输入图像说明

编辑:

我不想在这个文本中使用textView或者其他视图,并把它放在ediText的左边。 我想用更less的操作find一些方法。 我需要冻结文本,而不是检查每个文本的变化,或添加丢失的文本,当用户将删除其中的一部分。

Solutions Collecting From Web of "设置不可更改的editText android的一部分"

创build一个自定义的绘图类,将有助于将文本转换为绘制。

 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; } } 

然后将drawable设置为edittext的左边

 EditText et = (EditText)findViewById(R.id.editText1); String code = "+374"; et.setCompoundDrawablesWithIntrinsicBounds(new TextDrawable(code), null, null, null); et.setCompoundDrawablePadding(code.length()*10); 

edittext在布局文件中被定义为

 <EditText android:id="@+id/editText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="16sp" android:ems="10" > <requestFocus /> </EditText> 

最终输出看起来像

在这里输入图像说明

 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()); } } }); } } 

使用文本监视器,当用户input+3时,它以+374结束,它比较前四个字符,如果相同,则禁用软键盘的后退button,以便它不会改变文本并进入附加的另一个数字从textwatcher使用的文本

你可以创build类扩展AppCompatEditText或EditText。

公共类CEditTextMaster扩展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()); } } } 

用来:

 edt.setCharactersNoChangeInitial("+734 ");