其他questions說,風格不能以編程方式設置,但View
可以初始化有風格,當它從XML加載等。創建Android設備上查看與特定的編程風格
我怎麼能初始化一個View
具有特定風格programmaticly(不是在XML)?我嘗試使用View(Context context, AttributeSet attrs, int defStyle),但我不知道要解析第二個參數。傳入null
結果View
不顯示
其他questions說,風格不能以編程方式設置,但View
可以初始化有風格,當它從XML加載等。創建Android設備上查看與特定的編程風格
我怎麼能初始化一個View
具有特定風格programmaticly(不是在XML)?我嘗試使用View(Context context, AttributeSet attrs, int defStyle),但我不知道要解析第二個參數。傳入null
結果View
不顯示
AttributeSet包含在xml中指定的屬性列表(例如layout_width,layout_height等)。
如果你把它當作空,那麼你應該明確設置的視圖的高度/寬度。
我有同樣的問題,但還沒有找到任何實際的方式,直接到目前爲止以編程方式設置樣式。我想用很多小部件填充我的屏幕,給定類型,讓我們說按鈕。將它們全部定義在佈局文件中是不切實際的。我想以編程方式創建它們,但我也想在樣式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);
}
下面是你按下幾個按鈕後,屏幕出現:
嗯,有一些代碼涉及到,但最終您可以創建儘可能多的窗口小部件,並且仍然將其屬性定義爲樣式。
如果你想風格的視圖,你有兩個選擇:最簡單的一種是隻在代碼中指定的所有元素:
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
。
'AttributeSet'似乎沒有構造函數。有沒有可能在不使用xml的情況下進行構建? – Casebash 2010-06-03 03:43:23
@Casebash AFAIK,你不能在不使用xml的情況下構建AttributeSet。您可以使用該課程提供的功能來設置所有的屬性。 – Karan 2010-06-03 04:07:38