2016-01-31 11 views
10

Sto cercando di creare una vista composta, in base alla quale posso impostare gli attributi in XML e farli passare ai bambini nella vista composta. Nel codice qui sotto, voglio impostare lo e farlo passare allo EditText.Passaggio degli attributi alla vista figlio nelle viste composte

È possibile ciò senza dover impostare ogni attributo come attributo personalizzato?

Activity.xml:

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"/> 
     <com.app.CustomLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="child_view_text" /> 
</FrameLayout> 

custom_view.xml:

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

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/textInputLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <EditText 
      android:id="@+id/editText" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    </android.support.design.widget.TextInputLayout> 
</merge> 

CustomView.java:

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

private void init(Context context, AttributeSet attrs) { 
    View v = inflate(context, R.layout.custom_view, this); 

    mEditText = (EditText) v.findViewById(R.id.editText); 
    mTextInputLayout = (TextInputLayout) findViewById(R.id.textInputLayout); 
} 

risposta

0

Penso che probabilmente puoi inserire il testo personalizzato (ad esempio, child_view_text) in un tema, quindi utilizzare il tema nel layout o nella visualizzazione principale. Con ciò, tutte le viste secondarie avranno l'attributo android: il testo trasmesso con il testo personalizzato.

Nel tuo caso, potrebbe assomigliare:

<string name="child_view_text">Child View Text</string> 

<style name="CustomTheme" parent="Theme.AppCompat"> 
    <item name="android:text">@string/child_view_text</item> 
</style> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/CustomTheme"/> 
    <com.app.CustomLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</FrameLayout> 
+0

Questo non risolve il problema. In alcuni casi ho bisogno di passare diversi attributi personalizzati, ad esempio "app: box_checked = true". – soundsofpolaris

0

com.app.CustomLayout estende un layout, che significa che non può prendere Android: il testo come un attributo. Dovrai creare un attributo personalizzato per la tua classe CustomLayout e in detta classe CustomLayout, gonfiare la tua custom_view (come fai sopra), analizzare gli attrs per la tua stringa di testo personalizzata, quindi chiamare mEditText.setText (customLayoutText).

0

Invece di avere l'EditText all'interno CustomLayout.xml è possibile creare un'istanza in CustomView.java passando l'AttributeSet:

public class ValidationTextInputLayout extends LinearLayout 
{ 
    public ValidationTextInputLayout(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attrs) 
    { 
     View v = inflate(context, R.layout.custom_view, this); 

     mTextInputLayout = (TextInputLayout)findViewById(R.id.textInputLayout); 

     mEditText = new EditText(context, attrs); 
     mTextInputLayout.AddView(mEditText); 
    } 

    /* Properties etc... */ 
} 

Per chiunque continui ad avere questo problema.

+0

In che lingua è scritto? – azizbekian

+0

L'ho scritto in java ma io stesso uso C# e Xamarin quindi non ho avuto il tempo di controllarlo. Ho modificato il mio esempio per correggere un errore di sintassi. –

Problemi correlati