studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android imageview coordinates inflate absolutelayout

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