0

我發現這個解決方案的新行問題,但我似乎無法得到它的工作,我一直在檢查每一個評論,我似乎無法找到任何人有同樣的問題我。 Android - multi-line linear layout 我一直在試圖找到StackOverFlow類似的線程,但無法找到任何。Android:linearLayout。新行和指定的孩子已經有父母

我的代碼:

E/AndroidRuntime(10872): FATAL EXCEPTION: main 
E/AndroidRuntime(10872): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.xiloandroid/activities.DetailedOpenCasesActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
E/AndroidRuntime(10872): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2265) 
E/AndroidRuntime(10872): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2315) 
E/AndroidRuntime(10872): at android.app.ActivityThread.access$600(ActivityThread.java:149) 
E/AndroidRuntime(10872): at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1297) 
E/AndroidRuntime(10872): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(10872): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(10872): at android.app.ActivityThread.main(ActivityThread.java:5235) 
E/AndroidRuntime(10872): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(10872): at java.lang.reflect.Method.invoke(Method.java:525)    E/AndroidRuntime(10872): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:742) 
E/AndroidRuntime(10872): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
E/AndroidRuntime(10872): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(10872): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
E/AndroidRuntime(10872): at android.view.ViewGroup.addViewInner(ViewGroup.java:3509) 
E/AndroidRuntime(10872): at android.view.ViewGroup.addView(ViewGroup.java:3380) 
E/AndroidRuntime(10872): at android.view.ViewGroup.addView(ViewGroup.java:3325) 
E/AndroidRuntime(10872): at android.view.ViewGroup.addView(ViewGroup.java:3301) 
E/AndroidRuntime(10872): at activities.DetailedOpenCasesActivity.setUpListToLinearLayout(DetailedOpenCasesActivity.java:287) 
E/AndroidRuntime(10872): at activities.DetailedOpenCasesActivity.update(DetailedOpenCasesActivity.java:242) 
E/AndroidRuntime(10872): at activities.DetailedOpenCasesActivity.onCreate(DetailedOpenCasesActivity.java:98) 
E/AndroidRuntime(10872): at android.app.Activity.performCreate(Activity.java:5133) 
E/AndroidRuntime(10872): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
E/AndroidRuntime(10872): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2229) 

我想這可能是因爲該行的:

l1.addView(l1Also); 

我一直停留在

public void setUpListToLinearLayout(LinearLayout l1, ArrayList collection, String header){ 

    Display display = getWindowManager().getDefaultDisplay(); 
    int maxWidth = display.getWidth() - 10; 

    if (collection.size()>0){ 
     LinearLayout l1Also = new LinearLayout(this); 
     l1Also.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
     l1Also.setOrientation(LinearLayout.HORIZONTAL); 

     TextView txtSample = new TextView(this); 
     txtSample.setText(header); 

     l1Also.addView(txtSample); 
     txtSample.measure(0, 0); 

     int widthSoFar = txtSample.getMeasuredWidth(); 

     for (int i = 0; i < collection.size(); i ++){ 

      TextView txtSamItem = new TextView(this); 
      txtSamItem.setText(collection.get(i).toString()); 
      txtSamItem.setPadding(10, 0, 10, 0); 
      txtSamItem.setTag(collection.get(i)); 
      txtSamItem.measure(0, 0); 
      widthSoFar += txtSamItem.getMeasuredWidth(); 

      if (widthSoFar>=maxWidth){ 
       l1.addView(l1Also); 
       l1Also.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
       l1Also.setOrientation(LinearLayout.HORIZONTAL); 

       l1Also.addView(txtSamItem); 
       widthSoFar = txtSamItem.getMeasuredWidth(); 


      } else { 
       l1Also.addView(txtSamItem); 
      } 

     } 
     l1.addView(l1Also); 

    } 
} 

林在logcat中得到這這個問題半天,我真的很感謝一些幫助。

回答

0

你不應該在一個循環中一次又一次地添加到父佈局同樣的觀點。導致錯誤:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

取而代之的是你應該採取新的線性佈局l2Also在一個循環中,並補充說,在主要佈局:

看到這個片斷:

for (int i = 0; i < collection.size(); i ++){ 

    LinearLayout l2Also = new LinearLayout(this); 
    l2Also.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
    l2Also.setOrientation(LinearLayout.HORIZONTAL); 
    TextView txtSamItem = new TextView(this); 
    txtSamItem.setText(collection.get(i).toString()); 
    txtSamItem.setPadding(10, 0, 10, 0); 
    txtSamItem.setTag(collection.get(i)); 
    txtSamItem.measure(0, 0); 
    widthSoFar += txtSamItem.getMeasuredWidth(); 

    if (widthSoFar>=maxWidth){ 

     l2Also.addView(txtSamItem); //in a new linear layout, your text will be saved. 
     widthSoFar = txtSamItem.getMeasuredWidth(); 
    } else { 
     l2Also.addView(txtSamItem); 
    } 
    l1Also.addView(l2Also); // that new layout will be added in l1Also at each iteration 
} 
l1.addView(l1Also); // finally add l1Also in parent layout. 

PS:您需要將佈局l1Also的方向更改爲VERTICAL,以便在新行中添加新佈局l2Also

希望這會有所幫助。

0

您已撥打l1.addView(l1Also);兩次。在if()中一次並結束一次。 因此,刪除並再次添加。

所以在最後調用它。

l1.removeView(l1Also); 

然後

l1.addView(l1Also); 
+0

With: l1.removeView(l1Alos); 我沒有得到下一行的下一個視圖,所以我不能真正刪除視圖。 有其他想法嗎? :) – 2014-09-11 07:26:42

+0

然後刪除l1.addView(l1Also);來自if()條件。 – 2014-09-11 07:29:08

+0

它仍然不是答案,因爲它仍然只是把它可以放在第一行,然後什麼都不做。但數組中的其餘部分仍然需要位於linearLayout中,只是在一條新線上,而不是以這種方式發生。 – 2014-09-11 07:38:35

相關問題