para - manual de programacion android pdf
¿Cómo inflar nuevas copias de un objeto ImageView en un diseño? (1)
Lo que trato de hacer es crear N (en este caso 9) copias del objeto ImageView R.id.tile
, colocar cada una de ellas en diferentes coordenadas en el diseño, y darle a cada una su propio identificador único.
board_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/backgroundcolor"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/topbar"
... >
<ImageButton
android:id="@+id/imagebutton"
... />
</LinearLayout>
<RelativeLayout
android:id="@+id/board"
android:layout_width="match_parent"
android:layout_height="345dp"
android:layout_centerVertical="true"
android:background="@drawable/wwfboard" >
<view class="languid.legend.xsolver.DrawView"
android:id="@+id/myView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<ImageView
android:id="@+id/tile"
android:layout_width="21dp"
android:layout_height="21dp"
android:src="@drawable/tile" />
</RelativeLayout>
</RelativeLayout>
BoardLayout.class:
@Override
protected void onCreate(Bundle savedInstance)
{ super.onCreate(savedInstance);
setContentView(R.layout.board_layout);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View[] tiles = new ImageView[9];
entire_layout = (RelativeLayout)findViewById(R.layout.board_layout);
for(int i = 0; i<tiles.length; i++){
tiles[i] = (ImageView) inflater.inflate(R.layout.board_layout, null);
tiles[i].setId(1000+i);
params = new RelativeLayout.LayoutParams(-1, 345);
params.leftMargin = 32*2*i;
params.topMargin = 34*2*i;
entire_layout.addView(tiles[i]);
}
...
Sin embargo, sigo obteniendo errores de "Fuente no encontrada" en la última línea: layout.addView(tiles[i]);
..
¿Alguna idea de por qué?
(Pregunta complementaria: ¿RelativeLayout es mejor que AbsoluteLayout si está trabajando con coordenadas?)
Editar:
Primero crea un diseño con un ImageView con las propiedades que te gustan
Ejemplo:
crear archivo en res / layout / singleimage.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/image2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/ic_launcher"
android:contentDescription="Sample"/>
Y luego infle ImageView
para obtener copias de este modo
View[] tiles = new ImageView[9];
// get reference to LayoutInflater
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for(int i = 0; i<tiles.length; i++) {
//Creating copy of imageview by inflating it
ImageView image = (ImageView) inflater.inflate(R.layout.singleimage, null);
tiles[i] = image;
tiles[i].setId(i);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(-1, 345);
params.leftMargin = 32*2*3;
params.topMargin = 34*2*3;
layout.addView(tiles[i]);
}
Has establecido id
para valor aquí
tiles[i].setId(i);
Pero estás (incorrectamente) tratando de obtenerlo de tu otro recurso (el que querías ''clonar''):
layout.addView(tiles[i] = (ImageView) findViewById(R.id.tile)); // INCORRECT
En su lugar, configure el id
manualmente como se indica arriba, y luego:
layout.addView(tiles[i]);
Y no hay necesidad de llamar a findViewById()