Cómo inflar una vista con un diseño
-
22-09-2019 - |
Pregunta
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.
Solución
No estoy seguro de que han seguido sus pregunta- ¿Estás tratando de adjuntar un niño, vista a la RelativeLayout? Si lo que desea hacer algo a lo largo de las líneas de:
RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);
Otros consejos
inflar un recurso XML. Vea la LayoutInflater doc .
Si su diseño es en un mylayout.xml , que haría 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);
A pesar de la respuesta tardía, pero me gustaría añadir que una manera de conseguir esto
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.mylayout, item );
donde item
es la disposición de los padres en la que desea agregar una distribución niño.
Es útil para añadir a esto, a pesar de que es una entrada antigua, que si el punto de vista del niño que está siendo inflado de XML es que se añade a una ViewGroup diseño, es necesario inflar llamada con una pista de qué tipo de ViewGroup que va a ser añadido a. Como:
View child = getLayoutInflater().inflate(R.layout.child, item, false);
El método de inflado es muy sobrecargado y describe esta parte del uso en la documentación. He tenido un problema en una sola vista inflada de XML no se alinea en la matriz adecuadamente hasta que hice este tipo de cambio.
manera aún más sencilla es utilizar
View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item
inflación diseño
View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);
Si no estás en una actividad que se puede utilizar el método from()
estática de la clase LayoutInflater
para obtener una LayoutInflater
, o solicitar el servicio desde el getSystemService()
método contexto 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 casi 4 años, pero todavía vale la pena mencionar)
Si desea agregar una vista única varias veces, debe 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 arrojará una excepción de todas las vistas ya agregadas.
AttachToRoot Set True
Sólo pensamos que especificamos un botón en un archivo de diseño de XML con su anchura y la altura de diseño diseño de conjunto de 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 esta botones Haga clic Evento podemos establecer siguiente código para inflar diseño de esta actividad.
LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);
La esperanza esta solución funciona para usted.!
tuve el momento más difícil con este error, debido a mis circunstancias únicas, pero finalmente encontré una solución.
Mi situación: Estoy utilizando una vista separada (XML) que tiene una WebView
, a continuación, se abre en una AlertDialog
al hacer clic en un botón en mi opinión, la principal actividad. Pero de alguna manera u otra la WebView
pertenecía a la vista principal de la actividad (probablemente porque me tire el recurso de aquí), por lo que justo antes de que asigné a mi AlertDialog
(como una vista), que tenía que conseguir que el padre de mi WebView
, ponerlo en un ViewGroup
, a continuación, eliminar todos los puntos de vista sobre que ViewGroup
. Esto funcionó, y mi error fue.
// 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 que he cargado 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();
Si estás tratando de adjuntar un niño, vista a la RelativeLayout? se puede hacer siguiendo
RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);
Prueba este código:
- Si lo que desea es para inflar su diseño:
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);
- Si desea inflar su diseño en un recipiente (disposición de los padres):
LinearLayout parent = findViewById(R.id.container); //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false);
RelativeLayout item = view.findViewById(R.id.item); //initialize layout & By this you can also perform any event.
parent.addView(view); //adding your inflated layout in parent layout.
Con Kotlin, puede utilizar:
val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)
[your_main_layout].apply {
//..
addView(content)
}
Había utilizado a continuación fragmento de código para esto y que trabajó para mí.
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
No se necesita ninguna complejidad que sólo simple como
setContentView(R.layout.your_layout);