So ändern Sie den Rand von TextView

82

Ich habe TextView programmgesteuert zu LinearLayout hinzugefügt und bei einigen externen Ereignissen möchte ich den unteren Rand dieser TextView auf -10 verringern, wofür ich versucht habe, zu folgen.

LinearLayout.LayoutParams lastTxtParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lastTxtParams.setMargins(0, 0, 0, -10);
mOldTextView.setLayoutParams(lastTxtParams);
mOldTextView.invalidate();

Ist der richtige Weg, um den Rand des Widgets zu ändern, der der Ansicht hinzugefügt wurde?
Einige, wie es nicht funktioniert.

User7723337
quelle

Antworten:

187
TextView forgot_pswrd = (TextView) findViewById(R.id.ForgotPasswordText);
forgot_pswrd.setOnTouchListener(this);     
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llp.setMargins(50, 0, 0, 0); // llp.setMargins(left, top, right, bottom);
forgot_pswrd.setLayoutParams(llp);

Ich habe das gemacht und es hat perfekt funktioniert. Vielleicht funktioniert Ihr Code deshalb nicht, wenn Sie den Wert in -ve angeben. Sie fügen diesen Code einfach dort ein, wo Sie die Referenz der Ansicht erstellen.

Debarati
quelle
Dieser Aufruf erfordert API Level 19.
Sanjay Kumar
4
@ SanjayKumar - Nein, es gibt keine Einschränkung, dass es API-Level 19 erfordert
Debarati
1
Wie beantwortet dies die Frage von OP? Es scheint, dass der Code derselbe ist, mit Ausnahme des redundanten Touch-Listeners für zusätzliche Zeileneinstellungen, der nicht invalidate () aufruft und keine Argumente im Konstruktor explizit für LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT] angibt. Darüber hinaus fordert OP (nicht, dass dies von Bedeutung sein könnte) das Festlegen von Rändern für programmgesteuert erstelltes TextView, obwohl die Antwort TextView aus dem Layout-XML über findViewById () erhält. Ich bin gespannt, was mir hier fehlt ...
Melquiades
@ Melquiades stimmen mit Ihnen überein, als ausgewählte Antwort entfernt, da sie die Frage nicht beantwortet, auch wie in den Antworträndern erwähnt, Maybe as you are giving the value in -vekann ein -ve-Wert sein.
User7723337
60

Ihr Layout in XML enthält wahrscheinlich bereits ein Attribut layout_margin (Links | Rechts | usw.). Dies bedeutet, dass Sie auf das von dieser XML generierte Objekt zugreifen und es ändern müssen.

Ich fand diese Lösung sehr einfach:

ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView
        .getLayoutParams();

mlp.setMargins(adjustmentPxs, 0, 0, 0);

break;

Rufen Sie die LayoutParams-Instanz Ihrer Textansicht ab, übertragen Sie sie auf MarginLayoutParams und legen Sie die Ränder mit der setMargins-Methode fest.

Danny Armstrong
quelle
Dies gibt mir ClassCastException: -> ViewGroup.LayoutParams kann nicht in ViewGroup.MarginLayoutParams
Harshil Pansare
10

Dies ist ein kniffliges Problem. Ich habe den Rand auf die Textansicht in einer Zeile eines Tabellenlayouts gesetzt. siehe unten:

TableLayout tl = new TableLayout(this);
tl.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

TableRow tr = new TableRow(this);        
tr.setBackgroundResource(R.color.rowColor);

LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(4, 4, 4, 4);

TextView tv = new TextView(this);
tv.setBackgroundResource(R.color.textviewColor);
tv.setText("hello");
tr.addView(tv, params);

TextView tv2 = new TextView(this);
tv2.setBackgroundResource(R.color.textviewColor);
tv2.setText("hi");
tr.addView(tv2, params);

tl.addView(tr);
setContentView(tl);

Die Klasse, die zum Importieren von LayoutParams zur Verwendung in einer Tabellenzeile benötigt wird, lautet:

import android.widget.**TableRow**.LayoutParams;

wichtig zu beachten, dass ich die Klasse für Tabellenzeile hinzugefügt habe. Ähnlich viele andere Klassen stehen zur Verfügung, um LayoutParams zu verwenden, wie:

import android.widget.**RelativeLayout**.LayoutParams;

android.widget importieren. LinearLayout .LayoutParams;

also entsprechend verwenden.

Schamane Virk
quelle
5

setMargins () legt die INNEREN Ränder der Textansicht fest, nicht die Layoutränder. Wollen Sie das tun? Diese zwei unterschiedlichen Ränder können ziemlich kompliziert sein.

Wenn Sie die Layoutränder festlegen möchten, ändern Sie die LayoutParams der Textansicht (textview.getLayoutParams () und anschließend die Parameter des zurückgegebenen LayoutParams-Objekts).

Sie müssen an Ihrem LinearLayout nichts ändern.

Grüße, Oliver

Oliver
quelle
2

TextView unterstützt setMargins nicht. Android-Dokumente sagen:

Obwohl eine Ansicht eine Auffüllung definieren kann, werden Ränder nicht unterstützt. Ansichtsgruppen bieten jedoch eine solche Unterstützung. Weitere Informationen finden Sie unter ViewGroup und ViewGroup.MarginLayoutParams.

andig
quelle
1

Hier ist ein anderer Ansatz ...

Wenn ich das gleiche Problem habe, hat mir die hier vorgeschlagene Lösung nicht gefallen. Ich habe mir also einen anderen Weg ausgedacht: Ich habe eine Textansicht in die XML-Datei zwischen den beiden Feldern eingefügt, die ich mit zwei wichtigen Feldern trennen wollte:

  1. Sichtbarkeit auf "GONE" gesetzt (nimmt keinen Platz ein ..)
  2. Die Höhe ist auf das eingestellt, was ich für die Trennung brauchte.

    XML:
    ...//some view up here
    <TextView
        android:id="@+id/dialogSeparator"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:visibility="gone"/>
    ...//some view down here

Nun, ich habe den Code, alles was ich brauchte, um es einfach zu machen, ändere die Sichtbarkeit auf unsichtbar (dh es ist da und nimmt den benötigten Platz ein, aber es ist unsichtbar)

    JAVA:

    TextView tvSeparator = (TextView)activity.findViewById(R.id.dialogSeparator);
    tvSeparator.setVisibility(View.INVISIBLE);
    //Inside an activity extended class I can use 'this' instead of 'activity'.

Viola ... Ich habe den nötigen Spielraum. Übrigens, diese Lösung ist für LinearLayout mit vertikaler Ausrichtung, aber Sie können es mit verschiedenen Layouts tun.

Hoffe das hilft.

JamesC
quelle
0

Sie haben wahrscheinlich den Layoutrand geändert, nachdem er gezeichnet wurde. mOldTextView.invalidate () ist nutzlos. Sie mussten requestLayout () auf dem übergeordneten Element aufrufen, um die neue Konfiguration weiterzuleiten. Wenn Sie den Code zum Ändern des Layouts vor dem Zeichnen verschoben haben, hat alles einwandfrei funktioniert.

Radu Simionescu
quelle
0
        TextView tv = (TextView)findViewById(R.id.item_title));
        RelativeLayout.LayoutParams mRelativelp = (RelativeLayout.LayoutParams) tv
                    .getLayoutParams();
        mRelativelp.setMargins(DptoPxConvertion(15), 0, DptoPxConvertion (15), 0);
        tv.setLayoutParams(mRelativelp);

    private int DptoPxConvertion(int dpValue)
    {
       return (int)((dpValue * mContext.getResources().getDisplayMetrics().density) + 0.5);
    }

getLayoutParams () der Textansicht sollte basierend auf dem übergeordneten Element der Textansicht in XML in die entsprechenden Parameter umgewandelt werden .

<RelativeLayout>
   <TextView
    android:id="@+id/item_title">
</RelativeLayout>

Verwenden Sie die oben verwendete DptoPxConvertion () -Methode, um dieselbe reale Größe auf verschiedenen Geräten zu rendern. Die Parameter setMargin (links, oben, rechts, unten) nehmen Werte in Pixel und nicht in dp an . Weitere Informationen finden Sie in dieser Linkantwort

anand krish
quelle