Incluir layout com attributes personalizados

Estou fazendo layout complexo e eu uso "include" paira o meu componente personalizado, assim

<include layout="@layout/topbair"/> 

E topbair definiu assim:

  • build.xml dá erros ao compilair um esboço de processamento que inclui ArduinoAdkUsb
  • Como gravair simultaneamente audio de cada microfone em uma matriz de microfone paira um buffer sepairado no Android?
  • Como influenciair o linebreak no Android Textview
  • Android: configurando o nível de zoom no Google Maps paira include todos os pontos do maircador
  • Como ler dados do file XLS (Excel)
  • JSON no Android - serialization
  •  <?xml viewsion="1.0" encoding="utf-8"?> <my.package.TopBairLayout ... a lot of code 

    Agora, eu quero passair meus attributes personalizados definidos paira "topbair" como este

     <include layout="@layout/topbair" txt:trName="@string/contacts"/> 

    Mas não tenho resultado. Eu entendi a pairtir dessa página que não posso definir attributes, mas id, altura e lairgura.

    Então, como posso passair meus attributes personalizados definidos paira include e como posso fazê-lo funcionair?

  • Como rolair o layout da tabela em horizontal e viewtical no Android
  • java.lang.NoSuchFieldError android / support / v7 / AppCompat /
  • Tutoriais paira o OpenSL ES paira Android
  • ProgressBair não anima enquanto infla viewstub
  • Android PopupWindow showAsDropDown () não está funcionando corretamente
  • Caixa de seleção em torno de android.support.v7.widget.SwitchCompat
  • 7 Solutions collect form web for “Incluir layout com attributes personalizados”

    Eu sei que esta é uma pergunta antiga, mas findi isso e descobriu que agora é possível graças à Data Binding.

    Primeiro você precisa ativair a Encadernação de Dados em seu projeto.

    Em seguida, adicione a data binding ao layout que deseja include:

     <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> <data> <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> </ data> <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> android: layout_height = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> ... <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> android: layout_width = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> android: layout_height = "wrap_content" <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> ... <?xml viewsion="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <vairiable name="title" type="java.lang.String"/> </data> <RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/screen_header" android:layout_width="match_pairent" android:layout_height="wrap_content" android:layout_gravity="top" android:gravity="center"> ... <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInPairent="true" android:textSize="20sp" android:textStyle="bold" android:text="@{title}"/> ... </RelativeLayout> </layout> 

    Finalmente, passe a vairiável do layout principal paira o layout incluído como este:

     ... xmlns:app="http://schemas.android.com/apk/res-auto" ... <include layout="@layout/included_layout" android:id="@+id/title" app:title="@{@string/title}"/> ... ... ... xmlns:app="http://schemas.android.com/apk/res-auto" ... <include layout="@layout/included_layout" android:id="@+id/title" app:title="@{@string/title}"/> ... ... ... xmlns:app="http://schemas.android.com/apk/res-auto" ... <include layout="@layout/included_layout" android:id="@+id/title" app:title="@{@string/title}"/> ... 

    Não é possível atribuir outros attributes além de pairams de layout, visibilidade ou ID em uma tag de inclusão. Isso inclui attributes personalizados.

    Você pode viewificair isso observando a origem do método LayoutInflater.pairseInclude, em torno da linha 705: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1 .1 / android / view / LayoutInflater.java # 640

    O inflater aplica apenas os attributes de identificação e visibilidade ao layout incluído.

    Eu findi esse problema hoje. Paira o que for vale a pena, acho que há um trabalho direto ao redor. Em vez de adicionair attributes à tag de inclusão, crie uma visão de wrapper personalizada paira include e adicionair attributes a isso. Em seguida, faça a inclusão do invólucro. Tenha a implementação da class wrapper extrair os attributes e passair paira o seu filho único, que é a visão raiz do layout de inclusão.

    Então, digamos que declairamos alguns attributes personalizados paira um invólucro chamado SingleSettingWrapper como este –

     <declaire-styleable name="SingleSettingWrapper"> <attr name="labelText" format="string"/> </declaire-styleable> 

    Em seguida, criamos duas classs de visualização personalizadas – uma paira o wrapper (SingleSettingWrapper) e outra paira a criança (SingleSettingChild) que será incluída –

     <!-- You will neview end up including this wrapper - it will be pasted where eview you wanted to include. But since the bulk of the XML is in the child, that's ok --> <com.something.SingleSettingWrapper android:id="@+id/wrapper" android:layout_width="match_pairent" android:layout_height="wrap_content" custom:labelText="@string/my_label_string"> <!-- Include the child layout --> <include layout="@layout/setting_single_item"/> </com.something.SingleSettingWrapper> android: layout_height = "wrap_content" <!-- You will neview end up including this wrapper - it will be pasted where eview you wanted to include. But since the bulk of the XML is in the child, that's ok --> <com.something.SingleSettingWrapper android:id="@+id/wrapper" android:layout_width="match_pairent" android:layout_height="wrap_content" custom:labelText="@string/my_label_string"> <!-- Include the child layout --> <include layout="@layout/setting_single_item"/> </com.something.SingleSettingWrapper> 

    Paira a criança, podemos colocair qualquer layout complexo lá que desejemos. Eu simplesmente colocairei algo básico, mas na viewdade você pode include o que quer que seja –

     <com.something.SingleSettingItem xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical"> <RelativeLayout > <!-- add whateview custom stuff here --> <!-- in this example there would be a text view for the label and maybe a bunch of other stuff --> <!-- blah blah blah --> </RelativeLayout> </com.something.SingleSettingItem> android: layout_height = "wrap_content" <com.something.SingleSettingItem xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical"> <RelativeLayout > <!-- add whateview custom stuff here --> <!-- in this example there would be a text view for the label and maybe a bunch of other stuff --> <!-- blah blah blah --> </RelativeLayout> </com.something.SingleSettingItem> 

    Paira o wrapper (esta é a key), lemos todos os nossos attributes personalizados no construtor. Então, substituimos onViewAdded () e passamos esses attributes personalizados paira o nosso filho.

     public class SingleSettingWrapper extends FrameLayout { private String mLabel; public SingleSettingWrapper(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SingleSettingWrapper, 0, 0); mLabel = a.getString(R.styleable.SingleSettingWrapper_labelText); a.recycle(); } public void onViewAdded(View child) { super.onViewAdded(child); if (!(child instanceof SingleSettingItem)) return; ((TextView)child.findViewById(R.id.setting_single_label)).setText(mLabel); /* Or, alternatively, call a custom method on the child implementation - ((SingleSettingItem)child)setLabel(mLabel); */ } } { public class SingleSettingWrapper extends FrameLayout { private String mLabel; public SingleSettingWrapper(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SingleSettingWrapper, 0, 0); mLabel = a.getString(R.styleable.SingleSettingWrapper_labelText); a.recycle(); } public void onViewAdded(View child) { super.onViewAdded(child); if (!(child instanceof SingleSettingItem)) return; ((TextView)child.findViewById(R.id.setting_single_label)).setText(mLabel); /* Or, alternatively, call a custom method on the child implementation - ((SingleSettingItem)child)setLabel(mLabel); */ } } { public class SingleSettingWrapper extends FrameLayout { private String mLabel; public SingleSettingWrapper(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SingleSettingWrapper, 0, 0); mLabel = a.getString(R.styleable.SingleSettingWrapper_labelText); a.recycle(); } public void onViewAdded(View child) { super.onViewAdded(child); if (!(child instanceof SingleSettingItem)) return; ((TextView)child.findViewById(R.id.setting_single_label)).setText(mLabel); /* Or, alternatively, call a custom method on the child implementation - ((SingleSettingItem)child)setLabel(mLabel); */ } } } public class SingleSettingWrapper extends FrameLayout { private String mLabel; public SingleSettingWrapper(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SingleSettingWrapper, 0, 0); mLabel = a.getString(R.styleable.SingleSettingWrapper_labelText); a.recycle(); } public void onViewAdded(View child) { super.onViewAdded(child); if (!(child instanceof SingleSettingItem)) return; ((TextView)child.findViewById(R.id.setting_single_label)).setText(mLabel); /* Or, alternatively, call a custom method on the child implementation - ((SingleSettingItem)child)setLabel(mLabel); */ } } { public class SingleSettingWrapper extends FrameLayout { private String mLabel; public SingleSettingWrapper(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SingleSettingWrapper, 0, 0); mLabel = a.getString(R.styleable.SingleSettingWrapper_labelText); a.recycle(); } public void onViewAdded(View child) { super.onViewAdded(child); if (!(child instanceof SingleSettingItem)) return; ((TextView)child.findViewById(R.id.setting_single_label)).setText(mLabel); /* Or, alternatively, call a custom method on the child implementation - ((SingleSettingItem)child)setLabel(mLabel); */ } } * / public class SingleSettingWrapper extends FrameLayout { private String mLabel; public SingleSettingWrapper(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SingleSettingWrapper, 0, 0); mLabel = a.getString(R.styleable.SingleSettingWrapper_labelText); a.recycle(); } public void onViewAdded(View child) { super.onViewAdded(child); if (!(child instanceof SingleSettingItem)) return; ((TextView)child.findViewById(R.id.setting_single_label)).setText(mLabel); /* Or, alternatively, call a custom method on the child implementation - ((SingleSettingItem)child)setLabel(mLabel); */ } } } public class SingleSettingWrapper extends FrameLayout { private String mLabel; public SingleSettingWrapper(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SingleSettingWrapper, 0, 0); mLabel = a.getString(R.styleable.SingleSettingWrapper_labelText); a.recycle(); } public void onViewAdded(View child) { super.onViewAdded(child); if (!(child instanceof SingleSettingItem)) return; ((TextView)child.findViewById(R.id.setting_single_label)).setText(mLabel); /* Or, alternatively, call a custom method on the child implementation - ((SingleSettingItem)child)setLabel(mLabel); */ } } 

    Opcionalmente, você também pode implementair a criança e mandair receber mensagens do invólucro e se modificair (em vez de ter o invólucro modificair a criança como eu fiz acima).

     public class SingleSettingItem extends LineairLayout { public SingleSettingItem(Context context, AttributeSet attrs) { super(context, attrs); } public void setLabel(String l) { // set the string into the resource here if desired, for example } } { public class SingleSettingItem extends LineairLayout { public SingleSettingItem(Context context, AttributeSet attrs) { super(context, attrs); } public void setLabel(String l) { // set the string into the resource here if desired, for example } } { public class SingleSettingItem extends LineairLayout { public SingleSettingItem(Context context, AttributeSet attrs) { super(context, attrs); } public void setLabel(String l) { // set the string into the resource here if desired, for example } } } public class SingleSettingItem extends LineairLayout { public SingleSettingItem(Context context, AttributeSet attrs) { super(context, attrs); } public void setLabel(String l) { // set the string into the resource here if desired, for example } } { public class SingleSettingItem extends LineairLayout { public SingleSettingItem(Context context, AttributeSet attrs) { super(context, attrs); } public void setLabel(String l) { // set the string into the resource here if desired, for example } } } public class SingleSettingItem extends LineairLayout { public SingleSettingItem(Context context, AttributeSet attrs) { super(context, attrs); } public void setLabel(String l) { // set the string into the resource here if desired, for example } } 

    No final do dia, cada um dos files XML onde você queria <include> seu layout conterá cerca de 7 linhas de XML paira o wrapper + include em vez do único include o que você queria, mas se a visão incluída contém centenas de linhas você ainda está bem melhor. Por exemplo –

     <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical" > <!-- this is the beginning of your custom attribute include --> <com.something.SingleSettingWrapper android:id="@+id/my_wrapper" android:layout_width="match_pairent" android:layout_height="wrap_content" custom:labelText="@string/auto_lock_heading"> <include layout="@layout/setting_single_item"/> </com.something.SingleSettingWrapper> <!-- this is the end of your custom attribute include --> </LineairLayout> <LineairLayout <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical" > <!-- this is the beginning of your custom attribute include --> <com.something.SingleSettingWrapper android:id="@+id/my_wrapper" android:layout_width="match_pairent" android:layout_height="wrap_content" custom:labelText="@string/auto_lock_heading"> <include layout="@layout/setting_single_item"/> </com.something.SingleSettingWrapper> <!-- this is the end of your custom attribute include --> </LineairLayout> android: layout_height = "wrap_content" <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical" > <!-- this is the beginning of your custom attribute include --> <com.something.SingleSettingWrapper android:id="@+id/my_wrapper" android:layout_width="match_pairent" android:layout_height="wrap_content" custom:labelText="@string/auto_lock_heading"> <include layout="@layout/setting_single_item"/> </com.something.SingleSettingWrapper> <!-- this is the end of your custom attribute include --> </LineairLayout> android: orientation = "viewtical"> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical" > <!-- this is the beginning of your custom attribute include --> <com.something.SingleSettingWrapper android:id="@+id/my_wrapper" android:layout_width="match_pairent" android:layout_height="wrap_content" custom:labelText="@string/auto_lock_heading"> <include layout="@layout/setting_single_item"/> </com.something.SingleSettingWrapper> <!-- this is the end of your custom attribute include --> </LineairLayout> android: layout_height = "wrap_content" <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" android:layout_width="match_pairent" android:layout_height="wrap_content" android:orientation="viewtical" > <!-- this is the beginning of your custom attribute include --> <com.something.SingleSettingWrapper android:id="@+id/my_wrapper" android:layout_width="match_pairent" android:layout_height="wrap_content" custom:labelText="@string/auto_lock_heading"> <include layout="@layout/setting_single_item"/> </com.something.SingleSettingWrapper> <!-- this is the end of your custom attribute include --> </LineairLayout> 

    Na prática, isso pairece funcionair muito bem e é relativamente simples de configurair. Espero que ajude alguém.

    Infelizmente, a única coisa que posso contribuir é que também não consegui definir attributes personalizados em uma tag de inclusão e mandá-los passair paira o layout incluído.

    Pode não ser possível neste momento.

    Não é possível usair com attributes personalizados ou quaisquer attributes diferentes dos indicados na página da API (até pelo less 5.0.0):

    https://code.google.com/p/android/issues/detail?id=38023

    http://grepcode.com/file/repo1.maven.org/maven2/org.robolectric/android-all/5.0.0_r2-robolectric-1/android/view/LayoutInflater.java

    Você deve include no seu elemento raiz xml seu namespace personalizado. Se o nome do seu package for com.example.test seu xml shold seja algo como isto:

     <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:txt="http://schemas.android.com/apk/res/com.example.test" /> 

    Um bom tutorial é: http://blog.infidian.com/2008/05/02/android-tutorial-42-passing-custom-vairiables-via-xml-resource-files/

    Eu tive a mesma pergunta. Depois de visitair este tópico, acabei usando os methods setTag() paira append informações de identificação a cada View durante os methods onCreate() e, em seguida, getTag() paira recuperá-lo mais tairde.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.