我有一个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"
。
如上面的输出所示,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>
,然后输出才符合预期:
就像我说的,我有多个TextView和EditText,我无法明确地将这些属性添加到所有这些属性中。那么,有没有办法可以使用样式或任何其他方法实现这一目标?我在这里做错了吗?
答案 0 :(得分:1)
你的方法是正确的。只需从editText的属性名称中删除android:
:
<item name="editTextStyle">@style/arabicEditText</item>
我无法解释这一点。我想appCompat的东西不会重用android属性,而是添加其他类似名称的东西。与colorPrimary
,srcCompat
和其他人一样。
答案 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