2010-06-01 267 views

回答

4

AttributeSet包含在xml中指定的屬性列表(例如layout_width,layout_height等)。

如果你把它當作空,那麼你應該明確設置的視圖的高度/寬度。

+1

'AttributeSet'似乎沒有構造函數。有沒有可能在不使用xml的情況下進行構建? – Casebash 2010-06-03 03:43:23

+0

@Casebash AFAIK,你不能在不使用xml的情況下構建AttributeSet。您可以使用該課程提供的功能來設置所有的屬性。 – Karan 2010-06-03 04:07:38

13

我有同樣的問題,但還沒有找到任何實際的方式,直接到目前爲止以編程方式設置樣式。我想用很多小部件填充我的屏幕,給定類型,讓我們說按鈕。將它們全部定義在佈局文件中是不切實際的。我想以編程方式創建它們,但我也想在樣式xml文件中定義它們的樣式。

我設計的解決方案包括定義只是在佈局文件中的窗口小部件之一,創建所有其他程序,並克隆從第一個到其他的樣式信息。

下面是一個例子。

在樣式文件中,定義按鈕的樣式。例如:

<style name="niceButton"> 
    <item name="android:layout_width">160dip</item> 
    <item name="android:layout_height">60dip</item> 
    <item name="android:gravity">center</item> 
    <item name="android:textSize">18dip</item> 
    <item name="android:textColor">#000000</item> 
</style> 

然後通過派生類「NiceButton」繼承子類「Button」。定義將由充氣需要構造:

public NiceButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

然後定義另一個構造,其目的是複製現有的按鈕:

public NiceButton(int id, NiceButton origButton) { 
    super(origButton.getContext()); 
    setId(id); 
    setLayoutParams(origButton.getLayoutParams()); 
    setGravity(origButton.getGravity()); 
    setPadding(origButton.getPaddingLeft(), 
        origButton.getPaddingTop(), 
        origButton.getPaddingRight(), 
        origButton.getPaddingBottom()); 
    setTextSize(TypedValue.COMPLEX_UNIT_PX, origButton.getTextSize()); 
    setTextColor(origButton.getTextColors()); 
    // ... also copy whatever other attributes you care about 
} 

在你的佈局文件,僅定義中的第一個你的按鈕。假設例如,你想要把你的按鈕在表中:

<TableLayout android:id="@+id/button_table" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <TableRow android:id="@+id/button_row_0"> 
     <com.mydomain.mypackage.NiceButton 
        style="@style/niceButton" android:id="@+id/button_0" /> 
     <!-- More rows/buttons created programmatically --> 
    </TableRow> 

</TableLayout> 

注意所使用的控件類的全限定名;顯然,您將不得不將com.mydomain.mypackage替換爲實際的軟件包名稱。

在您的活動,當按下任何按鈕,你可能希望定義一個數組,將要舉辦的所有按鈕的參考,並共同聽衆被稱爲:

NiceButton[] mButtonViews = new NiceButton[10]; 

private View.OnClickListener mNiceButtonClickListener = new View.OnClickListener() { 
    public void onClick(View view) { 
     int i = view.getId(); 
     mButtonViews[i].setText("PRESSED!"); 
    } 
}; 

注意視圖ID是如何用作按鈕數組中的索引的。所以你需要你的按鈕有一個從0到n-1的id。

最後,這裏是你可以在onCreate方法創建按鈕的方式:

// Retrieve some elements from the layout 
    TableLayout table = (TableLayout)findViewById(R.id.button_table); 
    TableRow row = (TableRow)findViewById(R.id.button_row_0); 
    NiceButton origButton = (NiceButton)findViewById(R.id.button_0); 

    // Prepare button 0 
    origButton.setId(0); 
    origButton.setText("Button 0"); 
    origButton.setOnClickListener(mNiceButtonClickListener); 
    mButtonViews[0] = origButton; 

    // Create buttons 1 to 10 
    for (int i = 1; i < 10; i++) { 
     if (i % 2 == 0) { 
      row = new TableRow(this); 
      table.addView(row); 
     } 
     NiceButton button = new NiceButton(i, origButton); 
     button.setText("Button " + i); 
     button.setOnClickListener(mNiceButtonClickListener); 
     mButtonViews[i] = button; 
     row.addView(button); 
    } 

下面是你按下幾個按鈕後,屏幕出現: enter image description here

嗯,有一些代碼涉及到,但最終您可以創建儘可能多的窗口小部件,並且仍然將其屬性定義爲樣式。

10

如果你想風格的視圖,你有兩個選擇:最簡單的一種是隻在代碼中指定的所有元素:

button.setTextColor(Color.RED); 
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 

的另一種選擇是在XML中定義的樣式,並將其應用到視圖。在一般情況下,你可以使用一個ContextThemeWrapper此:

ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle); 
button = new Button(newContext); 

要更改一個TextView的文本相關的屬性(或它的子類(例如Button))有一個特殊的方法:

button.setTextAppearance (context,R.style.MyTextStyle);

最後一個不能用於更改所有屬性;例如要更改填充,您需要使用ContextThemeWrapper。但對於文本顏色,大小等,您可以使用setTextAppearance

+0

最好,最簡單的解決方案。謝謝。 – Steelight 2014-05-08 11:28:20

+0

setTextApperance()需要API 23 – PaulrBear 2017-09-20 18:44:40

+1

@PaulrBear,有兩個版本,一個在API 1中添加並在23中棄用,另一個在23中添加 – beetstra 2017-09-20 18:51:23