2014-11-03 4 views
11

Ich bin eine benutzerdefinierte Verbindung Ansicht mit dem folgende LayoutReuse ein Standard-Android-Attribut auf meiner benutzerdefinierten Ansicht

<merge xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/label" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <EditText 
     android:id="@+id/edit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="text" 
     android:singleLine="true"/> 

</merge> 

Wie Sie sehen können, ist es einfach ein TextView und ein EditText zu schaffen. Ich möchte in der Lage sein Attribute meiner benutzerdefinierten Ansicht zu schaffen, die entweder an die TextView oder EditText weitergeleitet werden. Zum Beispiel

<codeguru.labelededittext.LabeledEditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:label="@string/label" 
    app:hint="@string/hint"/> 

Ich habe herausgefunden, wie diese Zeichenfolge weiterleiten an die TextView und EditText Attribute repsectively:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.LabeledEditText, 
      0, 0); 

    try { 
     label.setText(a.getString(R.styleable.LabeledEditText_label)); 
     edit.setHint(a.getString(R.styleable.LabeledEditText_hint)); 
    } finally { 
     a.recycle(); 
    } 

nun auch stelle ich die inputType des EditText wollen. Wenn ich einen <attr name="inputType" format="flag"> Tag erstellen, werde ich es mit allen möglichen Flagwerten füllen müssen? Gibt es eine Möglichkeit, die bereits von EditText deklarierten Werte wiederzuverwenden?

+0

Ihre Beschreibung ist unklar. Wollen Sie sagen, dass das gleiche Attribut-Tag in allen Komponenten verwendet werden soll? Kein – prashantwosti

+0

@prashantwosti, ich möchte ein 'label' Attribut, das die' Android setzt: Text' des 'TextView' und' hint' Attribut, das die 'Android setzt: hint' des' EditText'. Diese sind einfach, weil sie nur Zeichenfolgen sind. Ich möchte aber auch einen 'inputType', der den' android: inputType' für 'EditText' festlegt. Aber ich möchte den Code nicht für alle möglichen Werte schreiben. –

+0

Ich werde eine richtige SSCCE erstellen, um besser zu veranschaulichen. –

Antwort

1

Sie können dies mit bekommen:

int[] values = new int[]{android.R.attr.inputType}; 
TypedArray standardAttrArray = getContext().obtainStyledAttributes(attrs, values); 
try { 
    mInputType = standardAttrArray.getInt(0, EditorInfo.TYPE_NULL); 
} finally { 
    standardAttrArray.recycle(); 
} 
+1

Das scheint nahe, was ich will. Es stellt jedoch nicht den 'inputType' des' EditText' fest, der in meiner benutzerdefinierten Ansicht eingekapselt ist. Außerdem würde ich eher weiterleiten nur die alle Attribute sagte 'EditText' und lassen Sie es sie selbst extrahiert, anstatt alle Zeilen Code zu schreiben jeden zu extrahieren Attribut mir. –