Mam TextView dodany programowo do LinearLayout i przy niektórych zdarzeniach zewnętrznych chcę zmniejszyć dolny margines tego TextView do -10, w tym celu próbowałem wykonać.
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();
Czy właściwy sposób modyfikowania marginesu widżetu, który został dodany do widoku?
Jakoś to nie działa.
Maybe as you are giving the value in -ve
marginesach odpowiedzi, może mieć wartość -ve.Twój układ w XML prawdopodobnie ma już atrybut layout_margin (Left | Right | etc), co oznacza, że musisz uzyskać dostęp do obiektu wygenerowanego przez ten XML i zmodyfikować go.
Uważam, że to rozwiązanie jest bardzo proste:
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView .getLayoutParams(); mlp.setMargins(adjustmentPxs, 0, 0, 0); break;
Pobierz wystąpienie LayoutParams swojego textview, prześlij je do MarginLayoutParams i użyj metody setMargins, aby ustawić marginesy.
źródło
Jest to trudny problem, ustawiam margines na widok tekstu w wierszu układu tabeli. zobacz poniżej:
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);
klasa potrzebna do zaimportowania dla LayoutParams do użycia w wierszu tabeli to:
import android.widget.**TableRow**.LayoutParams;
Należy zauważyć, że dodałem klasę dla wiersza tabeli. podobnie wiele innych klas jest dostępnych do używania LayoutParams, takich jak:
import android.widget.**RelativeLayout**.LayoutParams;
import android.widget. LinearLayout .LayoutParams;
więc używaj odpowiednio.
źródło
setMargins () ustawia WEWNĘTRZNE marginesy TextView, a nie layout-margins. Czy to jest to, co chcesz zrobić? Te dwa różne marginesy mogą być dość skomplikowane.
Jeśli chcesz ustawić marginesy układu, zmień LayoutParams TextView (textview.getLayoutParams (), a następnie zmień parametry w zwróconym obiekcie LayoutParams).
Nie musisz niczego zmieniać w swoim LinearLayout.
Pozdrawiam, Oliver
źródło
TextView nie obsługuje setMargins. Dokumenty Androida mówią:
źródło
Oto inne podejście ...
Kiedy mam ten sam problem, nie podobały mi się sugerowane tutaj rozwiązania. Więc wymyśliłem inny sposób: wstawiłem TextView w pliku XML między dwa pola, które chciałem oddzielić dwoma ważnymi polami:
wysokość jest ustawiona na taką, jaką potrzebowałem, aby była separacja.
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
Teraz mam kod, wszystko, czego potrzebowałem, aby to zrobić po prostu zmienić widoczność na niewidoczną (czyli jest tam i zajmuje potrzebne miejsce, ale jest niewidoczne)
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 ... mam potrzebny margines. BTW, to rozwiązanie jest przeznaczone dla LinearLayout z orientacją pionową, ale możesz to zrobić z różnymi układami.
Mam nadzieję że to pomoże.
źródło
Prawdopodobnie zmieniałeś margines układu po jego narysowaniu. mOldTextView.invalidate () jest bezużyteczna. trzeba było wywołać requestLayout () na rodzicu, aby przekazać nową konfigurację. Po przeniesieniu kodu zmieniającego układ przed rysowaniem wszystko działało dobrze.
źródło
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); }
Funkcja getLayoutParams () z textview powinna być rzutowana na odpowiednie Params w oparciu o element nadrzędny textview w xml .
<RelativeLayout> <TextView android:id="@+id/item_title"> </RelativeLayout>
Aby renderować ten sam rzeczywisty rozmiar na różnych urządzeniach, użyj metody DptoPxConvertion (), której użyłem powyżej. Parametry setMargin (left, top, right, bottom) przyjmą wartości w pikselach, a nie w dp . Więcej informacji można znaleźć w tej odpowiedzi dotyczącej łącza
źródło