2015-02-24 2 views
2

Я создал макет для одного из моих действий, в котором пользователи могут вставлять значение в некоторый виджет EditText. Мне нужно, чтобы некоторые из этих EditText имели суффикс (например, cm, mm и т. Д.), Который должен быть недоступен для редактирования. После того, как пользователь вставил значение, я проанализирую содержимое этого EditText, избегая суффикса, поэтому я буду обрабатывать единственный вход без суффикса. Как это сделать?EditText с недопустимым/не подлежащим аннулированию суффиксом

Я уже искал и искал здесь, но ничего не помогло. Я нашел ответы вроде https://stackoverflow.com/a/20794581/2516399, которые мне не помогают.

Я надеюсь, что я был ясно в моем вопросе ... извините за мой английский

ответ

3

Попробуйте

+0

кажется решение, но я забыл сказать, что у меня есть это на моем EditText: '.setFilters (новый InputFilter [] {новый DecimalDigitsInputFilter (2) }); 'чтобы пользователь вставлял только десятичное число с двумя местами. В этом случае, как заставить его работать? В любом случае я использовал '.endsWith' вместо' .startWith', а затем '.setSelection (0);' потому что это суффикс, а не префикс – smartmouse

+0

Не можете ли вы установить 'android: inputType =" number "и' android: maxLength = «2» 'в' xml', а затем поместить префикс в '.class', как я написал в ответ? – Apurva

+0

В моем XML-файле у меня есть только 'android: inputType =" numberDecimal "' и в файле .class я пишу это: http://pastebin.com/b442zUt5 Как я сказал, если я удалю '.setFilters (новый InputFilter [ ] {new DecimalDigitsInputFilter (2)}); он работает; если я сохраню этот код, он не позволяет мне вводить ввод в EditText, кроме суффикса, который уже был там. – smartmouse

2
private static final String mSuffix = "SUFX"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     final EditText et = new EditText(this); 
     et.setText(mSuffix); 

     et.setOnFocusChangeListener(new OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 

       //NO FOCUS 
       if(!hasFocus){ 
        //HAS USER CLEARED THE SUFFIX 
        if(!et.getText().toString().contains(mSuffix)){ 
         //ADDING SUFFIX AGAIN 
         String newText = et.getText().toString(); 
         et.setText(mSuffix+newText); 
        } 
       } 
      } 
     }); 


    } 

На мой взгляд, использовать регулярные Exp. для проверки суффикса. он будет более безопасным и простым.

РЕШЕНИЕ: 2

Вот еще одно решение, что-то сложно;)

<RelativeLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/test_value" 
      android:layout_alignParentLeft="true" 
      android:id="@+id/editText2" 
      android:layout_gravity="center" 
      /> 
    <TextView 
      android:id="@+id/text_hint" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      android:text="@string/hint_test" 
      android:textSize="18sp" 
      android:layout_marginRight="10dp" 
      android:textColor="#808080" 
      /> 
</RelativeLayout> 

РЕЗУЛЬТАТ/OUTPUT

OUTPUT:

REF: StackOverflow

+0

Кажется, я не могу использовать его: '- OnFocusChangeListener не может быть разрешен к типу \t - метод setOnFocusChangeListener (View.OnFocusChangeListener) в типа View не применяется для аргументов (новый OnFocusChangeListener() \t {})' – smartmouse

+1

try (new View.OnFocusChangeListener) {} ... – theapache64

+0

Он работает, и теперь я вижу, что делает OnFocusChange ... но это не то, что я искал. В любом случае, я очень ценю ваш ответ, и я буду использовать его для других целей! Пожалуйста, взгляните на ответ Апурвы и попытайтесь выяснить, как заставить его решение работать в моем случае.Спасибо – smartmouse

5

Это мое решение: класс EditText, который рисует суффикс за текстом. Существует два настраиваемых атрибута для определения текста суффикса и заполнения суффикса (в левом углу EditText).

public class EditTextWithSuffix extends EditText { 
    TextPaint textPaint = new TextPaint(); 
    private String suffix = ""; 
    private float suffixPadding; 

    public EditTextWithSuffix(Context context) { 
     super(context); 
    } 

    public EditTextWithSuffix(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     getAttributes(context, attrs, 0); 
    } 

    public EditTextWithSuffix(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     getAttributes(context, attrs, defStyleAttr); 
    } 

    @Override 
    public void onDraw(Canvas c){ 
     super.onDraw(c); 
     int suffixXPosition = (int) textPaint.measureText(getText().toString()) + getPaddingLeft(); 
     c.drawText(suffix, Math.max(suffixXPosition, suffixPadding), getBaseline(), textPaint); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     textPaint.setColor(getCurrentTextColor()); 
     textPaint.setTextSize(getTextSize()); 
     textPaint.setTextAlign(Paint.Align.LEFT); 
    } 

    private void getAttributes(Context context, AttributeSet attrs, int defStyleAttr) { 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EditTextWithSuffix, defStyleAttr, 0); 
     if(a != null) { 
      suffix = a.getString(R.styleable.EditTextWithSuffix_suffix); 
      if(suffix == null) { 
       suffix = ""; 
      } 
      suffixPadding = a.getDimension(R.styleable.EditTextWithSuffix_suffixPadding, 0); 
     } 
     a.recycle(); 
    } 
} 

здесь является определение атрибутов:

<resources> 
    <declare-styleable name="EditTextWithSuffix"> 
     <attr name="suffix" format="string|reference" /> 
     <attr name="suffixPadding" format="dimension" /> 
    </declare-styleable> 
</resources>