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