2013-08-24 62 views
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的問題......爲什麼這不起作用?

回答

1

您必須聲明自定義屬性的名稱空間。它應該看起來像這樣:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res/auto" 
    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" 
     app:infoText="@string/fooButtonInfoText" /> 
</LinearText> 
+0

澄清:其中xmlns:app =「http://schemas.android.com/apk/res/auto」將是xmlns:app =「http:// schemas。 android.com/apk/res/com.example「,以防Android應用程序名稱空間在AndroidManifest.xml中聲明爲com.example。謝謝! –

+0

實際上,'res/auto'的確如此:自動映射應用程序的名稱空間。 :-) –

相關問題