Ich habe das gleiche Problem, aber habe keinen praktischen Weg zu direkt einen Stil programmgesteuert, so weit. Ich möchte meinen Bildschirm mit vielen Widgets eines bestimmten Typs füllen, sagen wir mal Buttons. Es ist unpraktisch, sie alle in der Layoutdatei zu definieren. Ich möchte sie programmatisch erstellen, aber ich möchte auch ihren Stil in einer Style-XML-Datei definieren.
Die Lösung, die ich entwickelt habe, besteht darin, nur eines dieser Widgets in der Layoutdatei zu definieren, alle anderen programmatisch zu erstellen und die Stilinformationen von der ersten zu den anderen zu klonen.
Ein Beispiel folgt.
In der Style-Datei definieren Sie den Stil für Ihre Schaltflächen. Zum Beispiel:
<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>
Dann Unterklasse Klasse "Button", durch Ableiten einer Klasse "NiceButton". Definieren Sie den Konstruktor, der durch die inflater benötigt werden:
public NiceButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
Dann anderen Konstruktor definieren, der Zweck ist es, eine vorhandene Schaltfläche zu klonen:
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
}
In Ihrem Layout-Datei definieren nur die erste von Deine Knöpfe. Nehmen wir zum Beispiel, dass Sie möchten, dass Ihre Tasten in einer Tabelle setzen:
<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>
Beachten Sie, dass der vollständige qualifizierte Name des Widget-Klasse verwendet wird; offensichtlich müssen Sie com.mydomain.mypackage mit dem tatsächlichen Paketnamen ersetzen.
In Ihrer Tätigkeit, können Sie ein Array definieren, die einen Verweis auf alle Tasten halten wird, und einen gemeinsamen Hörer aufgerufen werden, wenn eine der Tasten gedrückt wird:
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!");
}
};
Beachten Sie, wie die Ansichts-ID als Index im Schaltflächen-Array verwendet wird. Sie müssen also Ihre Tasten eine ID von 0 bis n-1 haben.
Schließlich ist hier die Art und Weise Sie Ihre Schaltflächen in der onCreate Methode erstellen:
// 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);
}
Hier ist, wie der Bildschirm erscheint, nachdem Sie einige Tasten gedrückt haben:
Nun, es gibt einige Code beteiligt, aber am Ende können Sie so viele Widgets, wie Sie möchten, programmgesteuert erstellen, und ihre Attribute müssen immer noch als Stil definiert sein.
'AttributeSet' scheint keinen Konstruktor zu haben. Ist es möglich, dies ohne Verwendung von XML zu erstellen? – Casebash
@Casebash AFAIK, Sie können das AttributeSet nicht ohne XML erstellen. Sie können alle Eigenschaften mithilfe der von der Klasse bereitgestellten Funktionen festlegen. – Karan