2012-09-08 125 views
0

嗨我需要通過複製和粘貼ViewGroup的某種方式獲取ViewGroup的副本,但不是具有完全相同的位置。所以,我想做到這一點,這就是結果:將一個ViewGroup的內容複製到另一個

public void ViewGroupCopy(ViewGroup source,int sourceOffset,ViewGroup destination,int destinationOffset){ 
    for(int i=sourceOffset;i<source.getChildCount();i++){ 
     View view = source.getChildAt(i); 
     source.removeView(view); 
     destination.addView(view, destinationOffset+i, view.getLayoutParams()); 
    } 

我在這個代碼塊中使用的方法:

  Activity host = (Activity) this.getContext(); 
      View contentView = host.findViewById(android.R.id.content).getRootView(); 
    ViewGroup children = (ViewGroup) contentView; 
    ViewGroup oldChildren = (ViewGroup) contentView; 
    children.removeAllViews(); 
    children.addView(new Preview(context)); 
    ViewGroupCopy(oldChildren,0,children,1); 

爲了您的其他信息,此類擴展視圖。

嗯,當我嘗試使用它時,我在LogCat中獲得了這個。

09-08 16:34:30.212:E/AndroidRuntime(10992):java.lang.RuntimeException:無法啓動活動ComponentInfo {com.example.worknwalk/com.example.worknwalk.Text}:java.lang .IndexOutOfBoundsException:index = 1 count = 0

有人能幫我嗎?謝謝。

回答

0

嘗試使用相同的索引從源組中獲取視圖。每次從源代碼移除視圖時,您都將在該索引處獲得新視圖。另外當sourceOffset> 0時,destinationOffset + i可能存在一個bug。這裏可能沒有錯誤,但是我不完全確定例如將具有索引10的項目添加到具有6個項目的列表中時的行爲。它可能會或可能不會崩潰。不管怎樣,試試這個:

public void ViewGroupCopy(ViewGroup source, int sourceOffset, 
     ViewGroup destination, int destinationOffset) { 

    int limit = source.getChildCount() - sourceOffset; 

    for (int i = 0; i < limit; i++) { 
     View view = source.getChildAt(sourceOffset); 
     source.removeView(view); 
     destination.addView(view, destinationOffset + i, 
       view.getLayoutParams()); 
    } 
} 
+0

我已經試過了,我得到這個錯誤: 09-08 18:02:04.189:E/AndroidRuntime(702):了java.lang.RuntimeException:無法開始活動ComponentInfo {com.example.worknwalk/com.example.worknwalk.Text}:java.lang.IllegalStateException:指定的子項已經有父項。您必須先調用子對象的父對象的removeView()。 –

+0

然後我建議像view.setParent(null)或使用迭代器而不是for-loop – Kostas

+0

我得到你的想法,但我沒有看到任何這樣的方法,因爲我認爲ViewGroup(LinearLayout)是父。 –

相關問題