Как изменить маржу TextView

У меня 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(); 

Правильный способ изменения маржи виджета, который был добавлен в View?
Некоторые, как это не работает.

Solutions Collecting From Web of "Как изменить маржу TextView"

  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, поэтому ваш код не работает. Вы просто помещаете этот код, где вы создаете ссылку на представление.

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

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

 ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) mTextView .getLayoutParams(); mlp.setMargins(adjustmentPxs, 0, 0, 0); break; 

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

Это сложная проблема, я устанавливаю поле 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, например:

Импортировать android.widget. RelativeLayout .LayoutParams;

Импортировать android.widget. LinearLayout .LayoutParams;

Поэтому используйте соответственно.

С Уважением,

Ахмад Шаман

SetMargins () устанавливает поля INNER для TextView, а не поля макета. Это то, что вы хотите сделать? Эти два разных поля могут быть довольно сложными.

Если вы хотите установить поля макета, измените LayoutParams в TextView (textview.getLayoutParams (), а затем измените параметры на возвращаемом объекте LayoutParams).

Вам не нужно ничего менять на вашем LinearLayout.

С уважением, Оливер

TextView не поддерживает setMargins. Android-документы говорят:

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

Вероятно, вы изменили маркер макета после его рисования. MOldTextView.invalidate () бесполезен. Вам нужно было вызвать requestLayout () для родителя для передачи новой конфигурации. Когда вы перемещали код смены макета до того, как был сделан чертеж, все работало нормально.

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

Когда я столкнулся с той же проблемой, мне здесь не понравились предлагаемые решения. Итак, я придумал другой способ: я вставил 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'. 

Виола … У меня есть необходимый запас. BTW, это решение для LinearLayout с вертикальной ориентацией, но вы можете сделать это с разными макетами.

Надеюсь это поможет.