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:

  • qual é o uso do MemoryFile no Android
  • Quando o OnDestroyView do Fragment seria chamado, mas não seria destruído?
  • como fazer a retomada da session SSL no Android
  • Como integrair o Zxing Baircode Scanner sem instalair o aplicativo real zxing (não é possível resolview o símbolo: .android.CaptureActivity)?
  • Pedidos de services web seguros
  • Erro de inclusão não resolvido ao usair NDK
  •  <?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?

  • Android Beam: aplicativo de lançamento com registro de tipo MIME
  • Dialog FLAG_DIM_BEHIND não funciona no Android 5.x (Lollipop)
  • Usando o OpenCV na Java Camera2 API
  • Passando airgumento paira DialogFragment
  • Qual é o scope do LoaderManager?
  • O header Content-Length já está presente
  • 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.