【问题标题】:issue: The specified child already has a parent. You must call removeView() on the child's parent first问题:指定的孩子已经有一个父母。您必须先在孩子的父母上调用 removeView()
【发布时间】:2013-03-16 06:11:03
【问题描述】:

我正在开发应用程序,将动态数据添加到多个表视图。结构如下。

我在 onPostExecute 中的代码是:

    protected void onPostExecute(List<String> results){
int ind,i = 0;
ScrollView sv=null;
TableLayout tl=null;
TableRow tr = null;
int mjsonlength=results.size();
if(results!=null){

 TableLayout indextl=(TableLayout)findViewById(R.id.indextablelayout);
    TableRow indextr=new TableRow(SubProducts.this);
    //indext1.moveToFirst();
    LinearLayout llt=(LinearLayout)findViewById(R.id.alltablell);
    //for(int f=0;f<mjsonlength;f++){

        for( ind=0;ind<indextitle.size();ind++)
        {

            TextView indextv=new TextView(SubProducts.this);
            indextv.setBackgroundResource(R.drawable.greenbg);
            indextv.setHeight(25);
            indextv.setWidth(50);
            indextv.setId(6);
            indextv.setTextColor(Color.WHITE);
            indextv.setText(indextitle.get(ind));
            indextv.setPadding(20,10,6,3);
            indextr.addView(indextv);

            indextl.addView(indextr,6);

            sv=new ScrollView(SubProducts.this);
             tl=new TableLayout(SubProducts.this);
             for( i=0;i<mjsonlength;i++){
                    tr=new TableRow(SubProducts.this);

                    if(ind==i)  {

                        RelativeLayout rl=new RelativeLayout(SubProducts.this);
                        Resources res = getResources(); //resource handle
                          rl.setBackgroundResource(R.drawable.prd_box);

                         RelativeLayout.LayoutParams newParams1 = new RelativeLayout.LayoutParams(
                                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                                    RelativeLayout.LayoutParams.WRAP_CONTENT);

                            image=new ImageView(SubProducts.this);
                            image.setLayoutParams(newParams1);
                            image.setId(1);
                            image.setImageBitmap(bmp);
                            image.setPadding(5, 20, 5, 5);
                            rl.addView(image,1);



                          RelativeLayout.LayoutParams lprams = new RelativeLayout.LayoutParams(
                                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                                    RelativeLayout.LayoutParams.WRAP_CONTENT);
                            lprams.addRule(RelativeLayout.RIGHT_OF, 1);

                          TextView tv1=new TextView(SubProducts.this);
                        Spanned marked_up = Html.fromHtml(description.get(i));
                        tv1.setText((marked_up.toString()).substring(1, 170).replaceAll("&nbsp;",""));
                        tv1.setLayoutParams(lprams);
                        tv1.setId(2);
                        tv1.setHeight(150);
                        tv1.setWidth(130);
                        tv1.setPadding(20, 10, 0, 10);
                        rl.addView(tv1,2);


                         RelativeLayout.LayoutParams newParams = new RelativeLayout.LayoutParams(
                                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                                    RelativeLayout.LayoutParams.WRAP_CONTENT);
                         newParams.addRule(RelativeLayout.BELOW, 2);
                        TextView tv=new TextView(SubProducts.this);
                        tv.setText(productname.get(i));
                        tv.setLayoutParams(newParams);
                        tv.setTextColor(Color.WHITE);
                        tv.setId(3);
                        tv.setPadding(10, 0, 0, 10);
                        rl.addView(tv,3);


                        tr.addView(rl);
                        tr.setPadding(5, 10, 5, 10);


                    }
                    tl.addView(tr);

            }

             sv.addView(tl);

                llt.addView(sv);

        }

    }

}

我收到如下错误:

     03-16 06:27:07.452: E/AndroidRuntime(7233): FATAL EXCEPTION: main
      03-16 06:27:07.452: E/AndroidRuntime(7233): java.lang.IllegalStateException: The 03-16 06:27:07.452: E/AndroidRuntime(7233): FATAL EXCEPTION: main
03-16 06:27:07.452: E/AndroidRuntime(7233): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.view.ViewGroup.addViewInner(ViewGroup.java:3339)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.view.ViewGroup.addView(ViewGroup.java:3210)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.widget.TableLayout.addView(TableLayout.java:429)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.view.ViewGroup.addView(ViewGroup.java:3155)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.widget.TableLayout.addView(TableLayout.java:411)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.view.ViewGroup.addView(ViewGroup.java:3131)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.widget.TableLayout.addView(TableLayout.java:402)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at com.example.nutritionplusapp.SubProducts$LongRunningGetIO1.onPostExecute(SubProducts.java:227)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at com.example.nutritionplusapp.SubProducts$LongRunningGetIO1.onPostExecute(SubProducts.java:1)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.os.AsyncTask.finish(AsyncTask.java:631)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.os.Looper.loop(Looper.java:137)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at android.app.ActivityThread.main(ActivityThread.java:5041)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at java.lang.reflect.Method.invokeNative(Native Method)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at java.lang.reflect.Method.invoke(Method.java:511)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-16 06:27:07.452: E/AndroidRuntime(7233):     at dalvik.system.NativeStart.main(Native Method)
03-16 06:32:07.586: I/Process(7233): Sending signal. PID: 7233 SIG: 9
03-16 06:32:08.522: E/Trace(7355): error opening trace file: No such file or directory (2)

两个循环的循环变量值应该相同才能获得相应产品的子产品。我正在与上述错误作斗争。任何有想法的人。请建议我提供适当的解决方案。提前致谢。

编辑:

ArrayList<String> productname=new ArrayList<String>();
ArrayList<String> description=new ArrayList<String>();
ArrayList<String> indextitle=new ArrayList<String>();
 ArrayList<String> mStrings = new ArrayList<String>();

在doINBackground下:

 JSONObject json = array.getJSONObject(i);

     manJson = json.getJSONObject("product");
     mStrings.add(manJson.getString("productimage"));
     productname.add(manJson.getString("productname"));
    indextitle.add(manJson.getString("subcategoryid"));
    description.add(manJson.getString("description"));

【问题讨论】:

  • 你可以在 for 循环中发布 indextitle 集合的声明和定义
  • Thanq Dinesh。我已经编辑了我的问题,请看一下。
  • 你能发布你的json字符串格式吗?
  • thanq Dinesh..data 是:[{"product":{"productimage":"img.jpg","subcategoryid":"prod1","productname":"name","description ":"description"}},{"product":continues.....}}]

标签: android android-layout


【解决方案1】:

好的,第二个潜在问题也是: indextl.addView(indextr);

indextr 每次循环迭代都会添加,但它是相同的视图。您只能向层次结构添加一次视图。您可能希望每次循环迭代都有一个新实例。我不能肯定,但这很可能是问题所在。

【讨论】:

  • thanq James Baca 它解决了我的问题。但它只显示一个产品,我的意思是它只显示 product1 的 1 个子产品。我的循环中的任何问题。如果你有任何想法,请通过它。
  • 我的猜测是这一行:if(ind==i) 这对于子产品只能发生一次...
  • 你能给我建议任何替代逻辑吗?
【解决方案2】:

试试这个....

ViewGroup parent = (ViewGroup) mViewParent.getParent();
int index = parent.indexOfChild(mViewParent);
parent.removeView(mViewParent);

parent.addView(mNewView_U_want_to_add);

【讨论】:

    【解决方案3】:

    在带有活动的 onCreate 或带有片段的 onCreateView 中。

    if (view != null) {
    ViewGroup parent = (ViewGroup) view.getParent();
    if (parent != null) {
        parent.removeView(view);
    }
    }try {
    view = inflater.inflate(R.layout.fragment_main, container, false);
    } catch (InflateException e) {}
    

    【讨论】:

      【解决方案4】:

      该异常实际上看起来是由以下原因引起的:

      indextl.addView(indextr,6);

      问题似乎是您试图在第 6 个索引处添加视图,但没有任何项目存在:

      java.lang.IndexOutOfBoundsException:           index=6 count=0
      

      【讨论】:

      • thanq James Baca。我已经解决了。但现在我得到另一个错误,即 03-16 06:27:07.452: E/AndroidRuntime(7233): java.lang.IllegalStateException: The specified child已经有了父母。您必须先在孩子的父母上调用 removeView()。
      • James Baca 我已经更新了我有问题的日志文件,看看。thanq
      猜你喜欢
      • 2013-10-18
      • 2015-09-06
      • 2020-02-16
      • 2014-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多