在应用程序中我可以简单地将attr.xml
定义为values
并将其用于设计布局。但我不能将这个属性编程设置为小部件,例如我有这个属性:
<declare-styleable name="ButtonTextStyle">
<attr name="font_button">
<enum name="consolas" value="0" />
<enum name="times" value="1" />
</attr>
</declare-styleable>
我可以通过以下方式将此属性用于xml:
<com.sample.app.Widgets.ButtonTextStyle
android:id="@+id/btn_way_bill_click"
android:layout_width="fill_parent"
app:font_button="consolas">
现在我将一些Button programical定义为项目,我希望使用consolas
字体定义到font_button
中:
button.setTextAppearance(context, R.attr.font_button);
但我收到此代码的错误,我无法解决问题,我从Button定义自定义类扩展,如下所示:
public class ButtonTextStyle extends Button {
private Context mContext;
public ButtonTextStyle(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
init(attrs, defStyle);
}
public ButtonTextStyle(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init(attrs,-1);
}
public ButtonTextStyle(Context context) {
super(context);
mContext = context;
init(null,-1);
}
private void init(AttributeSet attrs,int defStyle) {
if (!isInEditMode()) {
TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.ButtonTextStyle, defStyle, 0);
String str = a.getString(R.styleable.ButtonTextStyle_font_button);
switch (Integer.parseInt(str)) {
case 0:
str = "fonts/consolas.ttf";
break;
case 1:
str = "fonts/times.ttf";
break;
}
setTypeface(FontManager.getInstance(getContext()).loadFont(str));
}
}
}
问题:
Expected resource of type style
我不能将例如enum设置为与set times
font
如何设置这个自定义类的程序,其属性定义为attr.xml
更新: 我的类添加按钮是下面的方法。我想以编程方式设置字体:
private void addButton(final CDialog owner, final Dialog dialog, final DialogButton dlgBtn) {
LinearLayout linearLayout = (LinearLayout) dialog.findViewById(R.id.tsw__layerButton);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 70);
//layoutParams.setMargins(11, 0, 8, 0);
Button button = new Button(context);
if (buttonTheme != -1) {
button.setBackgroundResource(buttonTheme);
}
button.setPadding(0,2,0,0);
button.setGravity(Gravity.CENTER);
button.setText(buttonMsg[dlgBtn.ordinal()]);
button.setTextSize(14);
button.setTextColor(G.context.getResources().getColor(R.color.white_text));
button.setWidth(dpToPx(buttonWidth));
//button.setHeight(dpToPx(32));
button.setLayoutParams(layoutParams);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
if (dialogListener != null) {
dialogListener.onCloseDialog(owner, dlgBtn);
}
}
});
linearLayout.addView(button);
}
答案 0 :(得分:2)
也许这篇文章会帮助你Android: Set Custom Attributes Programmatically and Via XML。请注意,应该在某处为R.attr.font_button
属性指定一种样式(例如,在&#34; AppTheme&#34;中)。因为它只是一个属性,而拥有对值的引用。
如果您在&#34; AppTheme&#34;:
中分配了一种风格ButtonTextStyle button = (TextView) findViewById(R.id.btn_way_bill_click);
Resources.Theme themes = getTheme();
TypedValue storedValueInTheme = new TypedValue();
if (themes.resolveAttribute(R.attr.font_button, storedValueInTheme, true))
button.setTextAppearance(storedValueInTheme.data);
或者如果您宣布自己的主题。它可以声明如下
<resources>
<style name="ConsolasBtn" parent="@android:style/Widget">
<item name="font_button">consolas</item>
</style>
</resources>
然后您需要将此主题应用于您的按钮。尝试
ButtonTextStyle button = (TextView) findViewById(R.id.btn_way_bill_click);
button.setTextAppearance(this, R.style.ConsolasBtn); // *this* refers to Context
或尝试将R.style.ConsolasBtn
作为ButtonTextStyle(Context context, AttributeSet attrs, int defStyle)
参数传递给构造函数defStyle
。
答案 1 :(得分:2)
我认为实现你想要做的事情的正确方法是先声明一个枚举属性......
<declare-styleable name="ButtonTextStyle">
<attr name="font_button" format="enum">
<enum name="consolas" value="0" />
<enum name="times" value="1" />
</attr>
</declare-styleable>
仅从原始代码更改format
属性。然后你可以声明这些自定义样式属性如下...
<com.sample.app.Widgets.ButtonTextStyle
android:id="@+id/btn_way_bill_click"
android:layout_width="fill_parent"
app:font_button="consolas">
但是,不要忘记在父布局中声明子窗口小部件所属的命名空间,否则您将无法引用app
别名
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.sample.app.Widgets">
最后,您的init
方法看起来像这样......
private void init(AttributeSet attrs,int defStyle) {
if (!isInEditMode()) {
int i = -1;
TypedArray a = mContext.obtainStyledAttributes(attrs,R.styleable.ButtonTextStyle, defStyle, 0);
try{
a.getInt(R.styleable.ButtonTextStyle_font_button, -1);
}
finally{
a.recycle();
}
switch (i) {
case 0:
str = "fonts/consolas.ttf";
break;
case 1:
str = "fonts/times.ttf";
break;
}
setTypeface(FontManager.getInstance(getContext()).loadFont(str));
}
}
要以编程方式设置该属性,您需要公开一个采用整数值的“setter”方法,然后根据该值更改类型face。为了让您的自定义窗口小部件的使用者更容易,您还可以在类中定义两个常量...
public static final int CONSOLAS = 0;
public static final int TIMES = 1;
然后定义setter方法......
public void setFontButton(int fontButton) {
if (fontButton != CONSOLAS && fontButton != TIMES) {
throw new IllegalArgumentException(
"fontButton must be one of CONSOLAS or TIMES");
}
//load the font and set it here, the same way you did in "init"
}
你所要做的就是调用setter方法并传入一个指定的常量...
buttonTextStyle1.setFontButton(ButtonTextStyle.CONSOLAS);
而不是......
Button button = new Button(context);
...做
ButtonTextStyle button = new ButtonTextStyle(context);
并确保导入正确的类,以便可以在代码中使用...
import com.sample.app.Widgets.ButtonTextStyle;