vistas studio layout_inflater_service inflar getlayoutinflater example custom como android android-layout layout-inflater android-inflate

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



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.