EditText with not editable / invalid suffix

i created a layout for one of my actions where users can insert a value into some EditText widget. I need some of these EditText to have a suffix (like cm, mm, etc.) which should not be editable. After the user has inserted the value, I will parse the contents of these EditText avoiding the suffix, so I will handle the single entry without the suffix. How to do it?

I already searched and searched here but nothing helped me. I've found answers like this https://stackoverflow.com/a/2403485 / ... that don't help me.

I hope it was clear in my question ... sorry for my english

+8


source to share


6 answers


This is my solution: an EditText class that draws the suffix by text. There are two custom attributes to define the suffix text and fill in the suffixes (in the left corner of the 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();
    }
}

      



Here is the definition of the attributes:

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

      

+11


source


try it



final EditText eTxt = (EditText) findViewById(R.id.edit_text);

eTxt.setText("cm");
Selection.setSelection(eTxt.getText(), eTxt.getText().length());

eTxt.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("cm")){
            eTxt.setText("cm");
            Selection.setSelection(eTxt.getText(), eTxt.getText().length());
        }

    }
});

      

+5


source


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


    }

      

In my opinion use Regular Exp. to check the suffix. it will be more secure and simpler.

SOLUTION: 2

Here's another solution, something tricky;)

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

      

RESULT / OUTPUT

OUTPUT:

REF: StackOverflow

+3


source


I made an extension function for EditText:

fun EditText.addSuffix(suffix: String) {
    val editText = this
    val formattedSuffix = " $suffix"
    var text = ""
    var isSuffixModified = false

    val setCursorPosition: () -> Unit =
        { Selection.setSelection(editableText, editableText.length - formattedSuffix.length) }

    val setEditText: () -> Unit = {
        editText.setText(text)
        setCursorPosition()
    }

    this.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val newText = editable.toString()

            if (isSuffixModified) {
                // user tried to modify suffix
                isSuffixModified = false
                setEditText()
            } else if (text.isNotEmpty() && newText.length < text.length && !newText.contains(formattedSuffix)) {
                // user tried to delete suffix
                setEditText()
            } else if (!newText.contains(formattedSuffix)) {
                // new input, add suffix
                text = "$newText$formattedSuffix"
                setEditText()
            } else {
                text = newText
            }
        }

        override fun beforeTextChanged(charSequence: CharSequence?, start: Int, count: Int, after: Int) {
            charSequence?.let {
                val textLengthWithoutSuffix = it.length - formattedSuffix.length
                if (it.isNotEmpty() && start > textLengthWithoutSuffix) {
                    isSuffixModified = true
                }
            }
        }

        override fun onTextChanged(charSequence: CharSequence?, start: Int, before: Int, count: Int) {
        }
    })
}

      

Then you can use it like:

yourEditTextView.addSuffix("suffix")

      

+3


source


Try the following code for numeric edit text with letter suffix: -

expiry.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 c, int start, int count,
                                  int after) {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable e) {
        String s = e.toString();
        if (s.length() > 0) {
            if (!s.endsWith("days")) {
                if (!s.equals(s + "days")) {
                    s = s.replaceAll("[^\\d.]", "");
                    expiry.setText(s + "days");
                } else {
                    expiry.setSelection(s.length() - "days".length());
                }
            } else {
                expiry.setSelection(s.length() - "days".length());
                if (s.equals("days")) {
                    expiry.setText("");
                }
            }
        }
    }
});

      

0


source


For anyone working with Kotlin:

class EditTextWithSuffix: EditText {
    private val textPaint = TextPaint()
    private var suffix:String = ""
    private var suffixPadding:Float = 0f

    constructor(context: Context): super(context)

    constructor(context: Context, attrs: AttributeSet): super(context, attrs){
        getAttributes(context, attrs)
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        //I do this check so that the suffix is not drawn on top of the hint if any
        if(this.text.isNotEmpty()) {
            //Get the position that the suffix should be
            val suffixXPosition = textPaint.measureText(this.text.toString()) + paddingLeft + suffixPadding

            //Draw the suffix in the view
            canvas?.drawText(
                suffix,
                max(suffixXPosition, suffixPadding),
                baseline.toFloat(),
                textPaint
            )
        }
    }

    /**
     * Sets the properties of the textPaint to the same as
     * the EditText view
     */
    override fun onFinishInflate() {
        super.onFinishInflate()
        textPaint.color = currentTextColor
        textPaint.textSize = textSize
        textPaint.textAlign = Paint.Align.LEFT
    }

    /**
     * Retrieves the attributes from the layout file
     */
    private fun getAttributes(context: Context, attrs: AttributeSet){
        val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.EditTextWithSuffix, 0, 0)

        //Get the suffix attribute
        val theSuffix = typedArray.getString(R.styleable.EditTextWithSuffix_suffix)
        theSuffix?.let {
            suffix = it
        }

        //Get the padding attribute
        suffixPadding = typedArray.getDimension(R.styleable.EditTextWithSuffix_suffixPadding, 0f)

        typedArray.recycle()
    }
}

      

From: fooobar.com/questions/2403472 / ...

0


source







All Articles