Як змінити поля TextView


82

У мене є TextView, доданий програмно в LinearLayout, і на деяких зовнішніх подіях я хочу зменшити нижнє поле цього TextView до -10, за що я намагався слідувати.

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

Чи правильний спосіб зміни поля віджета, який був доданий до перегляду?
Деякі, як це не працює.

Відповіді:


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

Я зробив це, і це спрацювало чудово. Можливо, коли ви вводите значення у -ve, саме тому ваш код не працює. Ви просто розміщуєте цей код там, де створюєте посилання на подання.


Для цього дзвінка потрібен рівень API 19.
Санджай Кумар

4
@SanjayKumar - Ні, немає обмежень, що для цього потрібен рівень API 19
Дебараті

1
Як це відповідає на запитання ОП? Здається, код однаковий, за винятком надлишкової додаткової лінії налаштування сенсорного прослуховувача, не викликає invalidate () і не виразно вказуючи аргументи в конструкторі до LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT]? Крім того (не те, що це може мати значення), OP просить встановити поля для програмно створеного TextView, хоча відповідь отримує TextView із макета xml через findViewById (). Мені цікаво, чого мені тут не вистачає ...
Melquiades

@Melquiades погоджується з вами, видалений як вибрана відповідь, оскільки він не відповідає на питання, а також, як зазначено на Maybe as you are giving the value in -veполях відповіді, може мати значення -ve.
Користувач7723337

61

У вашому макеті в xml, ймовірно, вже є атрибут layout_margin (Left | Right | тощо), що означає, що вам потрібно отримати доступ до об’єкта, згенерованого цим xml, і змінити його.

Я знайшов це рішення дуже простим:

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

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

break;

Отримайте примірник LayoutParams тексту, перегляньте його до MarginLayoutParams і використовуйте метод setMargins для встановлення полів.


Це дає мені ClassCastException: -> ViewGroup.LayoutParams не може транслювати на ViewGroup.MarginLayoutParams
Harshil Pansare

10

Це складна проблема, я встановив для поля поля textview рядки в макеті таблиці. дивіться нижче:

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

клас, необхідний для імпорту для LayoutParams для використання в рядку таблиці:

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

важливо зазначити, що я додав клас для рядка таблиці. так само багато інших класів доступні для використання LayoutParams, такі як:

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

імпортуйте android.widget. LinearLayout .LayoutParams;

тому використовуйте відповідно.


5

setMargins () встановлює ВНУТРІШНІ поля TextView, а не поля макета. Це те, що ти хочеш робити? Ці два різні поля можуть бути досить складними.

Якщо ви хочете встановити поля макета, змініть LayoutParams TextView (textview.getLayoutParams (), а потім змініть параметри на поверненому об'єкті LayoutParams).

Вам не потрібно нічого змінювати на своєму LinearLayout.

З повагою, Олівере


3

TextView не підтримує setMargins. Документи Android говорять:

Незважаючи на те, що подання може визначати відступ, воно не забезпечує жодної підтримки полів. Однак групи переглядів надають таку підтримку. Для отримання додаткової інформації зверніться до ViewGroup та ViewGroup.MarginLayoutParams.


1

Ось інший підхід ...

Коли я стикався з тією ж проблемою, мені не сподобалися запропоновані тут рішення. Отже, я придумав інший спосіб: я вставив TextView у файл XML між двома полями, які я хотів розділити двома важливими полями:

  1. для видимості встановлено значення "ПІШЛО" (не займає місця ..)
  2. висота встановлюється такою, якою мені потрібно було відокремлення.

    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
    

Тепер я код, все, що мені потрібно було зробити, це просто змінити видимість на невидиму (тобто вона там є, і займає необхідний простір, але це невидимо)

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

Віола ... Я отримав необхідний запас. До речі, це рішення призначено для LinearLayout з вертикальною орієнтацією, але ви можете зробити це за допомогою різних макетів.

Сподіваюся, це допомагає.


0

Ви, мабуть, змінювали поле макета після того, як його було намальовано. mOldTextView.invalidate () марний. вам потрібно було зателефонувати requestLayout () на батьківський для ретрансляції нової конфігурації. Коли ви перенесли код зміни макета до того, як відбувся креслення, все працювало нормально.


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 () текстового перегляду має бути відлито до відповідних параметрів на основі батьківського текстового перегляду в xml .

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

Щоб відтворити однаковий реальний розмір на різних пристроях, використовуйте метод DptoPxConvertion (), який я використовував вище. параметри setMargin (лівий, верхній, правий, нижній) прийматимуть значення в пікселях, а не в dp . Додаткові посилання див. У цій відповіді на посилання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.