0

我有一个 Android 应用程序,它使用 Material 设计主题,并通过AppCompat.

在我的应用程序中有多个Textview's和。EditText's我希望将相同的属性应用于所有这些TextView's以及EditText's整个应用程序。为了实现这一点,我定义了一个自定义样式,如下所示:

<!-- Base application theme. -->
    <style name="ParentTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="ArabicTheme" parent="ParentTheme">
        <item name="android:editTextStyle">@style/arabicEditText</item>
        <item name="android:textViewStyle">@style/arabicTextView</item>
    </style>

    <style name="arabicEditText" parent="@android:style/Widget.EditText">
        <item name="android:gravity">right</item>
        <item name="android:ellipsize">end</item>
    </style>

    <style name="arabicTextView" parent="@android:style/Widget.TextView">
        <item name="android:gravity">right</item>
    </style>

在我AndroidManifest.xml的标签下的文件中<Application>,我设置了android:theme="@style/ArabicTheme".

以下是活动的输出: 在此处输入图像描述

如上面的输出所示,样式TextView仅应用于。但是,这同样不适用于EditText.

以防万一,如果我在相应的 Activitivy 的 xml 中为 EditText 明确指定这些属性,如下所示:

<EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:hint="Name"
        android:ellipsize="end"
        android:gravity="right"
        android:ems="10"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="16dp"
        android:id="@+id/editText" />

即我已明确添加android:ellipsize="end"andandroid:gravity="right"<EditText>, 只有这样输出才符合预期:

在此处输入图像描述

就像我说的,我有多个 TextView 和 EditText,我无法将这些属性显式添加到所有这些属性中。那么,有没有一种方法可以使用 Styles 或任何其他方法来实现呢?我在这里做错了吗?

4

2 回答 2

2

你的方法是正确的。只需android:从editText的属性名称中删除:

    <item name="editTextStyle">@style/arabicEditText</item>

我无法解释这一点。我猜 appCompat 的东西不会重用 android 属性,而是添加另一个具有相似名称的属性。colorPrimary和其他人也是如此srcCompat

于 2017-05-04T12:46:30.813 回答
0

我一直在这样做

public class LightEditText extends android.widget.EditText{

    public LightEditText(Context context) {
        super(context);
        setFont();

    }

    public LightEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFont();
    }

    public LightEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setFont();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public LightEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        setFont();
    }

    /**
     * This method is used to set the given font to the TextView.
     */
    private void setFont() {
        Typeface typeface = TypefaceCache.get(getContext().getAssets(), "fonts/Roboto-Light.ttf");
        setTypeface(typeface);
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
}

然后在你的 xml 文件中

<com.packagename.LightEditText
 android:id="@+id/edtTaskName"
 android:layout_height="wrap_content"
 android:layout_width="match_parent"/> 

执行上述方法将常用属性(fontType,style..etc)设置为editext

于 2017-05-04T11:25:46.143 回答