2013-03-30 65 views
2

我想要做的是創建N(在這種情況下爲9)ImageView對象R.id.tile的副本,將它們中的每一個放置在佈局上的不同座標處,並給出每個它自己的唯一標識符。如何在佈局上充填ImageView對象的新副本?

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更好,如果你使用的座標工作?)

回答

3

編輯:

首先一個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]); 
} 

您已設置idi值這裏

tiles[i].setId(i); 

但你是(不正確)試圖從你的其他資源(你想'克隆'):

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

相反,如上面手工設置id,然後:

layout.addView(tiles[i]); 

而且也沒有必要呼籲findViewById()

+0

同樣的結果......在'layout.addView停止(瓷磚[我]);'線,並說**來源未找到。** – LanguidLegend

+0

@LanguidLegend我知道,你會得到例外,指定的孩子已經是父母。因此,已經給出了一個過程如何做到這一點..做到完全一樣..它的工作肯定..檢查我的編輯 – Pragnani

+0

所以將R.layout.singleimage是包含ImageView的XML文件的名稱,或只是最內層XML佈局文件中的父層?如果有多個父層,那麼這對java代碼有什麼影響嗎? BTW仍然給我源錯誤..我已經更新我的代碼到當前。 – LanguidLegend