应用程序中所有编辑文本的自定义样式
Custom style for all Edit Texts in the application
我有一个 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"
.
下面是 activity 的输出:
如以上输出所示,样式仅应用于 TextView
。但是,EditText
.
没有应用同样的方法
Incase,如果我在相应的Activity的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,但我无法将这些属性显式添加到所有这些属性。那么,有没有一种方法可以使用 Styles 或任何其他方法来实现这一点?我是不是做错了什么?
我一直在做这个
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"/>
按照上面的方法设置editext的常用属性(fontType,style..etc)
你的做法是正确的。只需从 editText 的属性名称中删除 android:
:
<item name="editTextStyle">@style/arabicEditText</item>
虽然我无法解释这一点。我猜 appCompat 东西不会重用 android 属性,而是添加另一个具有相似名称的属性。 colorPrimary
、srcCompat
和其他人也是如此。
我有一个 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"
.
下面是 activity 的输出:
如以上输出所示,样式仅应用于 TextView
。但是,EditText
.
Incase,如果我在相应的Activity的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,但我无法将这些属性显式添加到所有这些属性。那么,有没有一种方法可以使用 Styles 或任何其他方法来实现这一点?我是不是做错了什么?
我一直在做这个
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"/>
按照上面的方法设置editext的常用属性(fontType,style..etc)
你的做法是正确的。只需从 editText 的属性名称中删除 android:
:
<item name="editTextStyle">@style/arabicEditText</item>
虽然我无法解释这一点。我猜 appCompat 东西不会重用 android 属性,而是添加另一个具有相似名称的属性。 colorPrimary
、srcCompat
和其他人也是如此。