Подтвердить что ты не робот

Установите марку в стиле и примените этот стиль к TextView программно

В моем приложении я хочу установить верхний и нижний край 8 dip в текстовое представление. Так что, если я делаю это как -

<TextView
android:id="@+id/tv_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/settings_plain_text"/>

он отлично работает там, где содержание стиля -

<style name="settings_plain_text">
    <item name="android:layout_marginTop"> 8dip </item>
    <item name="android:layout_marginBottom"> 8dip </item>
    <item name="android:textSize"> 18sp </item>
</style>

Но когда я применяю тот же стиль к этому текстовому виду программно, как -

textview.setTextAppearance(context, R.style.settings_plain_text);

он не показывает верхнее и нижнее поле, которые я установил в стиле. Пожалуйста, помогите.

4b9b3361

Ответ 1

setTextAppearence(..) устанавливает только атрибуты xml с префиксом android:text_*, но вы все равно можете написать собственный метод, который читает другие атрибуты и устанавливает их программно, зная базовую реализацию LayoutParams.

Обратите внимание, что вы можете использовать ContextThemeWrapper для получения определенных значений темы или передать идентификатор ресурса syle в .obtainStyledAttributes(..)

В качестве примера:

int[] attrs= new int[] {
  android.R.attr.layout_marginTop,     // 0
  android.R.attr.layout_marginLeft,    // 1
  android.R.attr.layout_marginRight,   // 2 (used in example)
  android.R.attr.layout_marginBottom}; // 3
final TypedArray arr = context.obtainStyledAttributes(attrs);
try {
  // ...
  layoutParams.rightMargin = arr.getDimensionPixelSize(2);
  // ...
} finally {
  arr.recycle();
}

Ответ 2

RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(textView.getLayoutParams());
    lp.setMargins(10, 20, 10, 20);
    textView.setLayoutParams(lp);

//в xml мой родительский макет для textView - RelativeLayout.

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@color/colorPrimary">
   <TextView
    android:id="@+id/test"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/bg_gradient_end"
    android:text="zdfhzfdh"/>
</RelativeLayout

Ответ 3

Более упрощенный вариант ответа Джанлуки П..

public void applyTextStyle(TextView v, int styleResId)
{
    int[] attrs= new int[] {
            android.R.attr.layout_marginTop,     // 0
            android.R.attr.layout_marginLeft,    // 1
            android.R.attr.layout_marginBottom,   // 2 
            android.R.attr.layout_marginRight}; // 3 (used in example)
    final TypedArray arr =  this.obtainStyledAttributes(styleResId,attrs);
    try {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
        lp.topMargin = arr.getDimensionPixelSize(0,lp.topMargin);
        lp.leftMargin = arr.getDimensionPixelSize(1,lp.leftMargin);
        lp.bottomMargin = arr.getDimensionPixelSize(2,lp.bottomMargin);
        lp.rightMargin = arr.getDimensionPixelSize(3,lp.rightMargin);

        v.requestLayout();
    } finally {
        arr.recycle();
    }
}

Ответ 4

Вы можете добиться этого, используя этот код.

TextView tv = (TextView)findViewById(R.id.tv_text1);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, 8, 0, 8); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);

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

EDIT:

public final class Values {
    public static final int MARGIN_TOP = 8;
    public static final int MARGIN_BOTTOM = 8;
}

TextView tv = (TextView)findViewById(R.id.tv_text1);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)tv.getLayoutParams();
params.setMargins(0, Values.MARGIN_TOP, 0, Values.MARGIN_BOTTOM); //substitute parameters for left, top, right, bottom
tv.setLayoutParams(params);