2
我想要擴展一個android.widget.Button並向我的自定義小部件添加一個可修改的屬性,該應用程序應該保存對res/values/strings.xml中值的引用。在一個可修改的屬性中引用一個字符串值
<resources>
<attr name="infoText" format="reference" />
<declare-styleable name="FooButton">
<attr name="infoText" />
</declare-styleable>
</resources
在我的佈局,我有這樣的事情:
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="horizontal">
<com.example.FooButton
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/fooButton"
infoText="@string/fooButtonInfoText" />
</LinearText>
我RES /價值/ strings.xml中看起來是這樣的:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="fooButtonInfoText">BAR</string>
</resources>
在屬性值的提取我定製FooButton看起來像這樣:
TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.FooButton);
Integer infoTextId = typedArray.getResourceId(R.styleable.FooButton_infoText, 0);
if (infoTextId > 0) {
infoText = context.getResources().getString(infoTextId);
}
typedArray.recycle();
我有這三個構造函數來實現:
public FooButton(Context context) {
super(context);
}
public FooButton(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
setInfoText(context, attributeSet);
}
public FooButton(Context context, AttributeSet attributeSet, int defStyle) {
super(context, attributeSet, defStyle);
setInfoText(context, attributeSet);
}
的方法FooButton.setInfoText(上下文的AttributeSet)被稱爲每次有FooButton時間宣佈。
我打這個問題的時間太長了,讀了幾十個Stackoverflow的問題......爲什麼這不起作用?
澄清:其中xmlns:app =「http://schemas.android.com/apk/res/auto」將是xmlns:app =「http:// schemas。 android.com/apk/res/com.example「,以防Android應用程序名稱空間在AndroidManifest.xml中聲明爲com.example。謝謝! –
實際上,'res/auto'的確如此:自動映射應用程序的名稱空間。 :-) –