应用程序中所有编辑文本的自定义样式

时间:2017-05-04 11:02:53

标签: android android-edittext android-textinputedittext

我有一个Android应用程序,它使用Material设计主题,通过AppCompat向后兼容。

我的应用中有多个Textview'sEditText's。我希望在整个应用程序中将相同的属性应用于所有这些TextView'sEditText'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"

以下是活动的输出: enter image description here

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

如果我在相应的Actitivy的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"android:gravity="right"明确添加到<EditText>,然后输出才符合预期:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

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

我无法解释这一点。我想appCompat的东西不会重用android属性,而是添加其他类似名称的东西。与colorPrimarysrcCompat和其他人一样。

答案 1 :(得分: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