Установите марку в стиле и примените этот стиль к 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); 

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

Solutions Collecting From Web of "Установите марку в стиле и примените этот стиль к TextView программно"

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

Имейте в виду, что вы можете использовать ContextThemeWrapper для получения определенных значений темы или передать идентификатор ресурса .obtainStyledAttributes(.. в .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(); } 
 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 

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

 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(); } } 

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

 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); 

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

РЕДАКТИРОВАТЬ:

 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);