studio programacion móviles desarrollo curso aplicaciones android view android-inflate

móviles - manual de programacion android pdf



Inflar un diseño xml en una clase de vista personalizada (5)

Está agregando una vista en blanco de la actividad del hogar. Porque en la clase View1 solo tiene una vista inflada pero no agrega nada.

Tengo una clase View1 que extiende View . Quiero inflar R.layout.test2.xml en esta clase View1 . He puesto un siguiente código en esta clase

public class View1 extends View { View view; String[] countries = new String[] {"India", "USA", "Canada"}; public View1( Context context) { super(context); LayoutInflater mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view=mInflater.inflate(R.layout.test2, null, false); } }

Desde otra clase de Home Quiero que esta vista inflada esté ahí por algunas circunstancias, En la clase de Home escribí el siguiente código:

public class Home extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home); CreateView(); } public void CreateView() { LinearLayout lv=(LinearLayout)findViewById(R.id.linearlayout); View1 view = new View1(Home.this); lv.addView(view); } }

Pero mientras ejecuto mi proyecto, la actividad no me muestra nada.


No puede agregar vistas a la clase View , sino que debe usar ViewGroup o una de sus subclases (como Linearlayout , RelativeLayout , etc.). Entonces tu código será así:

public class View1 extends LinearLayout { View view; String[] countries = new String[] {"India", "USA", "Canada"}; public View1( Context context) { super(context); LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater.inflate(R.layout.test2, this, true);}}

También la línea:

mInflater.inflate(R.layout.test2, null, false)

no agrega nada a la vista actual (debido al parámetro false ), solo infla una View desde un diseño xml.


Tienes que usar un ViewGroup como FrameLayout y hacer:

public class View1 extends FrameLayout { public View1(Context context) { super(context); inflate(context, R.layout.view1, this); } }

En el diseño XML, use la etiqueta <merge para no solo agregar su diseño view1 diseño raíz, lo que significa que tenemos un FrameLayout vacío y su vista definida una al lado de la otra.

<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="content" /> </merge>

Consulte http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/


Use el siguiente código para inflar su diseño, luego puede usar esa vista para cualquier propósito. Esto le dará el diseño más parental de su archivo XML. Escriba cast y úselo en consecuencia.

View headerView = View.inflate(this, R.layout.layout_name, null);


Utilizar esta

LayoutInflater li = (LayoutInflater)getContext().getSystemService(infService); li.inflate(R.layout.test2, **this**, true);

Debe utilizar this , no nulo, y cambiar el parámetro false (AttachToRoot booleano) a true