Как изменить маржу 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?
Некоторые, как он не работает.

Ответ 1

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

Ответ 2

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

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

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

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

break;

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

Ответ 3

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

import android.widget. LinearLayout.LayoutParams;

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

Ответ 4

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

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

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

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

Ответ 5

TextView не поддерживает setMargins. Android docs говорят:

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

Ответ 6

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

Ответ 7

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

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

  • видимость установлена ​​на "GONE" (не занимает какое-либо место..)
  • height установлен для того, что мне нужно для разделения.

    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 с вертикальной ориентацией, но вы можете сделать это с различными макетами.

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

Ответ 8

        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() textview должен быть отправлен в соответствующие Params на основе Родитель textview в xml.

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

Для отображения одного и того же реального размера на разных устройствах используется метод DptoPxConvertion(), который я использовал выше. Параметры setMargin (слева, сверху, справа, снизу) будут принимать значения в пикселях не в dp. Для получения дополнительной информации см. Этот Ответ на связь