Как раздуть новые копии объекта ImageView на макете?

Что я пытаюсь сделать, так это создать N (в данном случае 9) копий объекта ImageView R.id.tile, разместить каждую из них в разных координатах макета и присвоить каждой свой уникальный идентификатор.

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]);
    }
    ...

Однако я продолжаю получать ошибки "Источник не найден" в последней строке: layout.addView(tiles[i]);..

Есть идеи, почему?

(Дополнительный вопрос: RelativeLayout лучше, чем AbsoluteLayout, если вы работаете с координатами?)


person LanguidLegend    schedule 30.03.2013    source источник


Ответы (1)


Изменить:

Сначала создайте макет с одним ImageView с нужными вам свойствами.

Пример:

создать файл в 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"/>

А затем надуйте ImageView, чтобы получить его копии вот так

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]);
}

Вы установили здесь значение от id до i

tiles[i].setId(i);  

Но вы (неправильно) пытаетесь получить его с другого вашего ресурса (того, который вы хотели «клонировать»):

layout.addView(tiles[i] = (ImageView) findViewById(R.id.tile)); // INCORRECT

Вместо этого установите id вручную, как указано выше, а затем:

layout.addView(tiles[i]);

И не надо звонить findViewById()

person Pragnani    schedule 31.03.2013
comment
Тот же результат... останавливается на строке layout.addView(tiles[i]); и пишет Источник не найден. - person LanguidLegend; 02.04.2013
comment
@LanguidLegend Я знаю, что ... вы получите исключение, у которого указанный ребенок уже имеет родителя. Итак, дали процедуру, как это сделать.. сделайте именно так.. Это точно сработает.. Проверьте мое редактирование - person Pragnani; 02.04.2013
comment
так будет ли R.layout.singleimage именем файла XML, содержащего ImageView, или просто самым внутренним родительским слоем в файле макета XML? Если есть несколько родительских слоев, влияет ли это на код Java? Кстати, все еще дает мне ошибку источника. Я обновил свой код до текущего. - person LanguidLegend; 03.04.2013
comment
R.layout.singleimage - это макет с одним изображением... Это должно работать, если вы возьмете новый макет с одним изображением, как я показал в ответе. - person Pragnani; 04.04.2013
comment
так в строке tiles[i] = (ImageView) inflater.inflate(R.layout.board_layout, null); почему корень установлен в null? Может быть что-нибудь еще? - person LanguidLegend; 14.04.2013
comment
@LanguidLegend Потому что он не сгруппирован ни под каким макетом. - person Pragnani; 14.04.2013