2016-09-28 11 views
1

Ich benutze einen benutzerdefinierten Edittext, aber das Problem ist, dass ich keinen Text für meinen benutzerdefinierten Editiertext festlegen kann. Hier ist, was alles, was ich von den zur Verfügung stehenden Antworten anprobiert SO,Benutzerdefinierter EditText settext setzt den Text nicht

setText not working for a Custom Edittext

Das ist nicht immer noch nicht funktioniert. Ich habe keinen Fehler bekommen, also habe ich nicht geklärt, warum es nicht funktioniert hat.

Custom TextView - setText() called before constructor

Diese arbeiten auch nicht.

XML-Datei

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

Hier ist der 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); 
    } 


} 
+0

Funktionieren die einfachen et.setText (s) nicht? – abbath

+0

@abbath Nope hat das entweder versucht. –

Antwort

2

Das Problem ist, dass Sie eine neue Instanz von LineEditText in onCreate erstellen und damit arbeiten, aber nicht zum Layout hinzufügen. Im Layout gibt es eine weitere Instanz von LineEditText, die Sie nicht verwenden.

So müssen Sie entweder ersetzen:

mit:

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

oder Sie brauchen lt hinzufügen durch ViewGroup.addView() Layout, aber ich denke, Sie erste Variante verwenden müssen.

+0

Fangen gerade an, dasselbe zu schreiben :) – abbath

+0

Ich dachte, seit ich instanziiere, würde genug sein. –

+0

@ WeirdNerd Nr. Der Hauptpunkt ist, dass die Aktivität am Anfang ihres Lebenszyklus nichts über das Layout weiß. Aber Sie können dabei helfen, indem Sie 'setContentView' aufrufen. Sie können ein XML-Layout oder Ihre benutzerdefinierte ViewGroup übergeben. Dann arbeite ich damit. In Ihrem Fall ist es XML-Datei mit LinearLayout und geerbtem LinedEditText. Dann müssen Sie Ihre Ansichten nehmen und mit ihnen durch 'findViewById' Methode arbeiten. Aber stattdessen erstellen Sie eine separate Instanz von LinedEditText –

Verwandte Themen