android - studio - Cómo inflar una vista con un diseño
layout_inflater_service (14)
Tengo un diseño definido en XML. Contiene también:
<RelativeLayout
android:id="@+id/item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
Me gustaría inflar este RelativeView con otro archivo de diseño XML. Puedo usar diferentes diseños dependiendo de la situación. ¿Cómo debería hacerlo? Estaba probando diferentes variaciones de
RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)
Pero ninguno de ellos funcionó bien.
¿Si está tratando de adjuntar una vista secundaria a RelativeLayout? puedes hacerlo siguiendo
RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);
Aún más simple es usar
View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
Aunque es una respuesta tardía, pero me gustaría agregar esa forma de obtener esto.
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.mylayout, item );
donde item
es el diseño principal donde desea agregar un diseño secundario.
Con Kotlin, puedes usar:
val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)
[your_main_layout].apply {
//..
addView(content)
}
Es útil agregar a esto, a pesar de que es una publicación antigua, que si la vista secundaria que se está inflando desde xml se agrega a un diseño de grupo de vista, debe llamar a inflar con una pista de qué tipo de grupo de vista se va para ser añadido a. Me gusta:
View child = getLayoutInflater().inflate(R.layout.child, item, false);
El método de inflado está bastante sobrecargado y describe esta parte del uso en los documentos. Tuve un problema en el que una única vista inflada desde xml no se alineaba correctamente en el padre hasta que hice este tipo de cambio.
Infla un recurso XML. Ver el documento de LayoutInflater .
Si tu diseño está en un mylayout.xml , harías algo como:
View view;
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.mylayout, null);
RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);
Lo pasé muy mal con este error, debido a mis circunstancias únicas, pero finalmente encontré una solución.
Mi situación: estoy usando una vista separada (XML) que contiene una vista WebView
y luego se abre en un AlertDialog
cuando hago clic en un botón en mi vista de actividad principal. Pero de alguna manera u otra, el WebView
pertenecía a la vista de actividad principal (probablemente porque extrajo el recurso de aquí), así que justo antes de asignarlo a mi AlertDialog
(como una vista), tuve que obtener el elemento primario de mi WebView
. en un grupo de ViewGroup
, luego elimine todas las vistas en ese grupo de ViewGroup
. Esto funcionó, y mi error desapareció.
// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);
// more code...
.... más tarde, después de cargar mi WebView
....
// first, remove the parent of WebView from it''s old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();
// put WebView in Dialog box
alert.setView(webView);
alert.show();
No estoy seguro de haber seguido su pregunta: ¿está intentando adjuntar una vista secundaria al RelativeLayout? Si es así quieres hacer algo como:
RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
Revisa este enlace. Tiene la respuesta-> possiblemobile.com/2013/05/layout-inflation-as-intended
Si desea agregar una sola vista varias veces, entonces tiene que usar
layoutInflaterForButton = getActivity().getLayoutInflater();
for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
btnContainer.addView(btnView);
}
Si te gusta
layoutInflaterForButton = getActivity().getLayoutInflater();
FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
y
for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
btnContainer.addView(btnView);
}
entonces lanzará la excepción de todas las vistas agregadas listas.
Si no está en una actividad, puede usar el método static from()
de la clase LayoutInflater
para obtener un LayoutInflater
, o solicitar el servicio del método de contexto getSystemService()
también:
LayoutInflater i;
Context x; //Assuming here that x is a valid context, not null
i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);
(Sé que es hace casi 4 años, pero aún vale la pena mencionar)
Usé el siguiente fragmento de código para esto y funcionó para mí.
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
inflación de diseño
View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
AttachToRoot establecido en True
Solo piense que especificamos un botón en un archivo de diseño XML con su ancho de diseño y la altura de diseño configurada para match_parent.
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>
En este botón, haga clic en Evento. Podemos configurar el siguiente código para inflar el diseño de esta actividad.
LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);
Espero que esta solución funcione para usted.