У меня 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();
Правильный ли способ изменения поля виджета, добавленного в просмотр?
Как-то не получается.
Maybe as you are giving the value in -ve
полях ответа, может иметь значение -ve.Ваш макет в xml, вероятно, уже имеет атрибут layout_margin (Left | Right | etc), что означает, что вам нужно получить доступ к объекту, сгенерированному этим xml, и изменить его.
Я нашел это решение очень простым:
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView .getLayoutParams(); mlp.setMargins(adjustmentPxs, 0, 0, 0); break;
Получите экземпляр LayoutParams вашего текстового представления, уменьшите его до MarginLayoutParams и используйте метод setMargins, чтобы установить поля.
источник
Это сложная проблема, я установил поле для текстового просмотра в строке макета таблицы. см. ниже:
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;
так что используйте соответственно.
источник
setMargins () устанавливает ВНУТРЕННИЕ поля TextView, а не поля макета. Это то, что ты хочешь сделать? Эти два разных поля могут быть довольно сложными.
Если вы хотите установить поля макета, измените LayoutParams TextView (textview.getLayoutParams (), затем измените параметры в возвращенном объекте LayoutParams).
Вам не нужно ничего менять в своем LinearLayout.
С уважением, Оливер
источник
TextView не поддерживает setMargins. Документы Android говорят:
источник
Вот еще один подход ...
Когда я столкнулся с той же проблемой, мне не понравились предлагаемые здесь решения. Итак, я придумал другой способ: я вставил TextView в XML-файл между двумя полями, которые я хотел разделить двумя важными полями:
Высота установлена на то, что мне нужно, чтобы разделение было.
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 с вертикальной ориентацией, но вы можете делать это с разными макетами.
Надеюсь это поможет.
источник
Вы, вероятно, меняли поле макета после того, как оно было нарисовано. mOldTextView.invalidate () бесполезен. вам нужно было вызвать requestLayout () на родительском элементе, чтобы передать новую конфигурацию. Когда вы переместили код изменения макета до рисования, все работало нормально.
источник
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 . Для получения дополнительной информации см. Этот ответ по ссылке
источник