Search code examples
androidandroid-edittextandroid-custom-view

Custom EditText settext does not set the text


I am using a custom edittext but the problem is that I am unable to set a text for my custom edittext. Here is what all I tried from the available answers on SO,

setText not working for a Custom Edittext

This did not work still. I did not get any error,so no clued why it did not work.

Custom TextView - setText() called before constructor

This also did not work.

XML FILE

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:background="#FFFFFF"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <com.random.practiceproject.LinedEditText
        android:layout_width="301dp"
        android:inputType="text"
        android:layout_height="match_parent" />  


</LinearLayout>

MainActivity

LinedEditText lt;
    EditText et; //Normal edittext works

    String s = "This is a sample string";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lt = new LinedEditText(this);
        et = (EditText) findViewById(R.id.newt);
        lt.setCursorVisible(true);
        lt.setTextColor(Color.BLACK);
        lt.setText(s,TextView.BufferType.EDITABLE);
        et.setText(s, TextView.BufferType.EDITABLE);
 }

Here is the code,

public class LinedEditText extends EditText {

    private static Paint linePaint;

    static {
        linePaint = new Paint();
        linePaint.setColor(Color.BLACK);
        linePaint.setStyle(Paint.Style.STROKE);
    }

    public LinedEditText(Context context)
    {

        super(context);

    }

    public LinedEditText(Context context, AttributeSet attributes) {
        super(context, attributes);
    }



    @Override
    protected void onDraw(Canvas canvas) {
        Rect bounds = new Rect();
        int firstLineY = getLineBounds(0, bounds);

        /*int firstLineY=0;

        for(int i =0;i<getLineCount();i++)
        {
            firstLineY = (i + 1) * getLineHeight();
        }*/

        int lineHeight = getLineHeight();
        int totalLines = Math.max(getLineCount(), getHeight() / lineHeight);


        for (int i = 0; i < totalLines; i++) {
            int lineY = firstLineY + i * lineHeight;
            canvas.drawLine(bounds.left, lineY, bounds.right, lineY, linePaint);
        }

        super.onDraw(canvas);
    }


}

Solution

  • The problem is that you create new instance of LineEditText in onCreate and working with it, but not adding to layout. In the layout there is another instance of LineEditText, that you don't use.

    So you must either replace:

    lt = new LinedEditText(this);
    

    with:

    lt = (LinedEditText) findViewById(/*provide your id*/)
    

    or you need to add lt to layout through ViewGroup.addView(), but I think you need to use first variant.