2016-01-31 6 views
10

Próbuję utworzyć widok złożony, dzięki czemu można ustawić atrybuty w kodzie XML i przekazać je do elementów podrzędnych w widoku złożonym. W poniższym kodzie chcę ustawić android:text i przekazać go do EditText.Przekazywanie atrybutów do widoku podrzędnego w widokach złożonych

Czy jest to możliwe bez konieczności ustawiania każdego atrybutu jako atrybutu niestandardowego?

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); 
} 

Odpowiedz

0

Myślę, że prawdopodobnie możesz umieścić niestandardowy tekst (np. Child_view_text) w motywie, a następnie użyć motywu w układzie lub widoku rodzica. Dzięki temu wszystkie widoki podrzędne będą miały atrybut android: tekst przekazywany z niestandardowym tekstem.

W twoim przypadku, to może wyglądać następująco:

<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

To nie rozwiąże problemu. W niektórych przypadkach muszę przekazać różne niestandardowe atrybuty, np. "App: box_checked = true". – soundsofpolaris

0

com.app.CustomLayout rozciąga się układ, co oznacza, że ​​nie może wziąć android: tekst jako atrybutu. Musisz utworzyć niestandardowy atrybut dla swojej klasy CustomLayout i we wspomnianej klasie CustomLayout, nadmuchać swoją custom_view (tak jak robisz powyżej), przeanalizować attrs dla niestandardowego ciągu tekstowego, a następnie wywołać mEditText.setText (customLayoutText).

0

Zamiast się EditText wewnątrz CustomLayout.xml można oznacz ją w CustomView.java minięciu 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... */ 
} 

Dla ktoś nadal ma ten problem.

+0

W jakim języku to jest napisane? – azizbekian

+0

Napisałem to w Javie, ale ja sam używam C# i Xamarin, więc nie miałem czasu sprawdzić, czy kompiluje. Zmontowałem mój przykład, aby naprawić błąd składni. –