Как изменить поле 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();

Правильный ли способ изменения поля виджета, добавленного в просмотр?
Как-то не получается.

Пользователь7723337
источник

Ответы:

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
Как это отвечает на вопрос OP? Кажется, что код такой же, за исключением избыточной дополнительной настройки сенсорного прослушивателя строки, не вызывающей invalidate () и не указывающих явно аргументы в конструкторе для LinearLayout.LayoutParams [LayoutParams.WRAP_CONTENT vs LinearLayout.LayoutParams.WRAP_CONTENT]? Вдобавок (не то чтобы это могло иметь значение) OP просит установить поля для программно созданного TextView, хотя ответ получает TextView из макета xml через findViewById (). Мне любопытно, что мне здесь не хватает ...
Мелькиадес
@Melquiades согласен с вами, удален как выбранный ответ, поскольку он не отвечает на вопрос, а также, как указано в Maybe as you are giving the value in -veполях ответа, может иметь значение -ve.
User7723337
61

Ваш макет в xml, вероятно, уже имеет атрибут layout_margin (Left | Right | etc), что означает, что вам нужно получить доступ к объекту, сгенерированному этим xml, и изменить его.

Я нашел это решение очень простым:

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

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

break;

Получите экземпляр LayoutParams вашего текстового представления, уменьшите его до MarginLayoutParams и используйте метод setMargins, чтобы установить поля.

Дэнни Армстронг
источник
Это дает мне ClassCastException: -> ViewGroup.LayoutParams не может приводить к ViewGroup.MarginLayoutParams
Харшил Пансаре
10

Это сложная проблема, я установил поле для текстового просмотра в строке макета таблицы. см. ниже:

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 для получения дополнительной информации.

Andig
источник
1

Вот еще один подход ...

Когда я столкнулся с той же проблемой, мне не понравились предлагаемые здесь решения. Итак, я придумал другой способ: я вставил TextView в XML-файл между двумя полями, которые я хотел разделить двумя важными полями:

  1. видимость установлена ​​на "GONE" (не занимает места ..)
  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 (left, top, right, bottom) будут принимать значения в пикселях, а не в dp . Для получения дополнительной информации см. Этот ответ по ссылке

Ананд Криш
источник