2010-06-01 4 views
14

Andere questions sagen, dass der Stil nicht programmatisch festgelegt werden kann, sondern ein View mit einem Stil initialisiert werden kann, wie beispielsweise, wenn es von XML geladen wird.eine Android-Ansicht mit einem bestimmten Stil Erstellen programmatisch

Wie kann ich eine View mit einem bestimmten Stil programmatisch initialisieren (nicht in XML)? Ich habe versucht, View(Context context, AttributeSet attrs, int defStyle), aber ich weiß nicht, was für das zweite Argument zu analysieren. Wenn null übergeben wird, wird View nicht angezeigt.

Antwort

4

AttributeSet enthält die Liste der in xml angegebenen Attribute (z. B. layout_width, layout_height usw.).

Wenn Sie es als null übergeben, sollten Sie explizit die Höhe/Breite der Ansicht festlegen.

+1

'AttributeSet' scheint keinen Konstruktor zu haben. Ist es möglich, dies ohne Verwendung von XML zu erstellen? – Casebash

+0

@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

13

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: enter image description here

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.

10

Wenn Sie eine Ansicht stylen möchten, müssen Sie zwei Möglichkeiten: die einfachste ist, einfach alle Elemente in Code angeben:

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

Die andere Option ist der Stil in XML zu definieren, und wenden Sie es zur Aussicht. Im allgemeinen Fall können Sie ein ContextThemeWrapper für diesen Einsatz:

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

die textbezogene Attribute auf einem Textview ändern (oder ihre Unterklassen wie Taste) gibt es eine spezielle Methode ist:

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

Dieser letzte kann nicht verwendet werden, um alle Attribute zu ändern; Um beispielsweise das Padding zu ändern, müssen Sie eine ContextThemeWrapper verwenden. Aber für Textfarbe, Größe, etc. können Sie setTextAppearance verwenden.

+0

Die beste, einfachste Lösung. Vielen Dank. – Steelight

+0

setTextAppearance() erfordert API 23 – PaulrBear

+1

@PaulrBear, gibt es zwei Versionen, eine wurde in API 1 hinzugefügt und veraltet in 23, die andere in 23 hinzugefügt – beetstra

Verwandte Themen