0

私は.xmlスタイルを持っていると仮定します。カスタムビューの属性でスタイルを渡すときにテキストが太字にならないのはなぜですか?

<style name="MaterialPreviewDetailsTextSmall"> 
    <item name="android:layout_marginLeft">@dimen/material_margin</item> 
    <item name="android:textColor">@color/material_preview_backgroud</item> 
    <item name="android:textSize">@dimen/material_normal_smal_text</item> 
    <item name="android:textStyle">bold</item> 
</style> 

私は、属性によってカスタムビューに渡したい:

カスタムビュー内
<pl.valueadd.ledoc.view.ViewPreviewRow        
    ... 
    app:view_title="@string/equipment_overview_id_label"   
    app:view_title_style="@style/MaterialPreviewDetailsTextSmall"/> 

私はスタイル属性を取得し、TextViewに適用:

public class ViewPreviewRow extends RelativeLayout { 
    TextView tvTitle; 

    public ViewPreviewRow(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attrs) { 
     initView(context); 
     obtainStyledAttributes(context, attrs); 
    } 

    private void obtainStyledAttributes(Context context, AttributeSet attrs) { 
     TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.ViewPreviewRow); 
     CharSequence text = attributes.getString(R.styleable.ViewPreviewRow_view_title); 
     if (text != null) { 
      tvTitle.setText(text); 
     } else { 
      throw new NullPointerException("Attribute view_title cannot be null"); 
     } 
     int appearance = attributes.getResourceId(R.styleable.ViewPreviewRow_view_title_style, 0); 
     if (appearance != 0) { 
      setTextViewAppearance(tvTitle, appearance); 
      tvTitle.requestLayout(); 
     } 
     ... 
     attributes.recycle(); 
    } 

質問です:

なぜテキストに適切な色、サイズ、marginLeftがあるのですか?太字ではありませんか?

答えて

0

私は答えを見つけました。

予想されるスタイル属性は、一つ一つを適用することができます。

int appearance = attributes.getResourceId(R.styleable.ViewPreviewRow_view_title_style, 0); 
applyBold(context, attrs, appearance, tvTitle); 
applyTextSize(context, attrs, appearance, tvTitle); 
applyTextColor(context, attrs, appearance, tvTitle); 


private void applyBold(Context context, AttributeSet attrs, int style, TextView textView) { 
    int[] textStyleAttr = new int[]{android.R.attr.textStyle}; 
    int indexOfAttrTextStyle = 0; 
    TypedArray a = context.obtainStyledAttributes(style, textStyleAttr); 
    int styleIndex = a.getInt(indexOfAttrTextStyle, -1); 
    a.recycle(); 
    setTypefaceFromAttrs(textView, styleIndex); 
} 

private void applyTextSize(Context context, AttributeSet attrs, int style, TextView textView) { 
    int[] textStyleAttr = new int[]{android.R.attr.textSize}; 
    int indexOfAttrTextStyle = 0; 
    TypedArray a = context.obtainStyledAttributes(style, textStyleAttr); 
    int size = a.getDimensionPixelSize(indexOfAttrTextStyle, -1); 
    a.recycle(); 
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); 
} 

private void applyTextColor(Context context, AttributeSet attrs, int style, TextView textView) { 
    int[] textStyleAttr = new int[]{android.R.attr.textColor}; 
    int indexOfAttrTextStyle = 0; 
    TypedArray a = context.obtainStyledAttributes(style, textStyleAttr); 
    ColorStateList color = a.getColorStateList(indexOfAttrTextStyle); 
    if (color == null) { 
     color = ColorStateList.valueOf(a.getColor(indexOfAttrTextStyle, -1)); 
    } 
    a.recycle(); 
    textView.setTextColor(color); 
} 

private void setTypefaceFromAttrs(TextView textView, int styleIndex) { 
    textView.setTypeface(Typeface.DEFAULT); 
    if (styleIndex == 1) { 
     textView.setTypeface(null, Typeface.BOLD); 
    } else { 
     textView.setTypeface(null, Typeface.NORMAL); 
    } 
} 

しかし、このソリューションは非常に非効率的です。予想されるすべての属性に対して、TypedArrayの初期化が必要です(初期化は非常にメモリの時間です)。しかし...それは動作します。

関連する問題