2015-10-16 58 views
4

我已經創建了一個自定義佈局類(擴展了RelativeLayout),並將TextView作爲佈局的一部分。在我的自定義視圖中閱讀Android屬性

我想將XML中聲明的屬性應用到我的TextView中,是否有我可以讀取android屬性(不是我的自定義屬性,該部分已被照顧)。

舉例來說,在我的XML我也會有這樣的:

<my.custom.MyLayout 
    android:layout_width="100dp" 
    android:layout_height="20dp" 
    android:text="SomeText" /> 

我想讀的文本屬性並將其應用到我的TextView(目前它被應用到RelativeLayout的),而不是創造我自己屬性並閱讀它。

我的自定義佈局是這樣的:

public class MyLayout extends RelativeLayout { 

    private TextView textView; 
    public void MyLayout(final Context context, final AttributeSet attrs) { 
     /**Read android attributes and apply it to TextView **/ 
     ?? 
    } 

我目前的解決方案是創建自定義屬性和閱讀他們,但我覺得這不是一個很好的解決方案,我會重複申報TextView的每個屬性。

有關我當前的解決方案的更多信息。

我有一個名爲myText的自定義屬性,我使用它將XML中聲明的文本應用於我的TextView。

在我的佈局XML:

myNameSpace:myText="SomeText" 

在我的Java類閱讀:

String text= a.getString(R.styleable.MyStyleable_myText); 
textView.setText(text); 

我在尋找擺脫我的自定義屬性和讀 「機器人」 的屬性。

+0

如果'MyLayout'是你的自定義組件,那麼你可以寫吸氣得到我想要讀取XML屬性的任何屬性或任何 – Apurva

+0

,例如'機器人:文本=「SomeText」則會'作爲ATTRS的一部分傳遞給每個View的構造函數的值。我不能使用getters。 – AkasH

回答

6

首先,我不確定是否可以設置android:text來延伸視圖RelativeLayout。如果能夠做到像在TextView實現:

final Resources.Theme theme = context.getTheme(); 
a = theme.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes); 
text = a.getText(attr); 

所以基本上這是你得到你的自定義屬性的方式相同,但不同的設置樣式。

如果它不工作,我會考慮另一種方法。我爲我的一個自定義視圖做了它。由於您的自定義視圖中有TextView,因此您可以使用XML創建它,然後在自定義視圖中獲取對該子項的引用。

<YourCustomView> 
    <TextView android:text="someText"/> 
<YourCustomView/> 
+0

啊,謝謝,那種可愛的風格就是我一直在尋找的東西。而文本只是一個例子,我想複製其他屬性,如寬度和高度。 – AkasH

+1

什麼是attr? – Eido95

+0

@ Eido95這是一個屬性索引。我從TextView源代碼中複製出來,所以最好如果你看看那裏。你可以從IDE或這裏查看http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/widget/TextView.java#784 –