2017-12-22 20 views
-3

テーブルビューに行を動的に追加しようとすると上記のエラーが発生しました 主な動作コード。スタックオーバーフローで利用可能な多くのソリューションを試しました。しかし、私の問題は何も解決されませんでした。エラー "子の親で最初にremoveView()を呼び出す必要があります"

package com.example.bhramaram.myapplication; 

import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.view.ViewGroup; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 

import com.example.bhramaram.myapplication.Dbhelper; 
import com.example.bhramaram.myapplication.R; 

public class jav extends AppCompatActivity { 
    TableLayout tb; 
    TableRow tableRow; 
    Dbhelper dbhelper; 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     int day=0; 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.timetable); 
     getvalues(); 
    } 

    private void getvalues() { 

     tb=(TableLayout)findViewById(R.id.timetble); 
     TextView textView1,textView2,textView3,textView4,textView5,textView0; 
     textView0=new TextView(this);textView1=new TextView(this); 
     textView2=new TextView(this);textView3=new TextView(this); 
     textView4=new TextView(this);textView5=new TextView(this); 
     TableRow.LayoutParams lp = new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT); 
     textView0.setLayoutParams(lp);textView1.setLayoutParams(lp); 
     textView2.setLayoutParams(lp);textView3.setLayoutParams(lp); 
     textView4.setLayoutParams(lp);textView5.setLayoutParams(lp); 
     dbhelper= new Dbhelper(jav.this); 
     Cursor cursor= dbhelper.recieveData(); 

     if(cursor.getCount()==0){ 
      alert("Nothing","Nothing to show"); 
      return;} 
     int i=0; 
     while (cursor.moveToNext()) 
     { 
      tableRow=new TableRow(this); 

      TableLayout.LayoutParams lp1=new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,TableLayout.LayoutParams.MATCH_PARENT); 

      textView0.setText((cursor.getString(0)));textView1.setText((cursor.getString(1))); 
      textView2.setText((cursor.getString(2)));textView3.setText((cursor.getString(3))); 
      textView4.setText((cursor.getString(4)));textView5.setText((cursor.getString(5))); 
      tableRow.setLayoutParams(lp); 
      //Error occurred here 
      tableRow.addView(textView0);tableRow.addView(textView1); 
      tableRow.addView(textView2);tableRow.addView(textView3); 
      tableRow.addView(textView4);tableRow.addView(textView5); 
      tb.addView(tableRow,lp1); 

     } 



    } 

    private void alert(String title, String alert) { 
     AlertDialog.Builder builder=new AlertDialog.Builder(this); 
     builder.setCancelable(true); 
     builder.setTitle(title); 
     builder.setMessage(alert); 
    } 


} 

対応するレイアウト

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TableLayout 
     android:id="@+id/timetble" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:layout_editor_absoluteX="8dp" 
     tools:layout_editor_absoluteY="8dp" 
     tools:ignore="MissingConstraints"> 
    </TableLayout> 
</android.support.constraint.ConstraintLayout> 

エラーの詳細

プロセス:com.example.bhramaram.myapplication、PID:14266 java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {com.example.bhramaram.myapplication/com.example.bhramaram.myapplication.jav}: 'java.lang.IllegalStateException:指定された子にはすでに親があります。最初に子の親に対してremoveView()を呼び出す必要があります。アンドロイドでandroid.app.ActivityThread.-wrap12(ActivityThread.java) でandroid.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) でandroid.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) で.app.ActivityThread $ H.handleMessage(ActivityThread.java:1460) とandroid.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) とandroidで.App.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.mai n(ZygoteInit.java:755) 発生原因:java.lang.IllegalStateException:指定された子にはすでに親があります。子の親で最初にremoveView()を呼び出す必要があります。 android.view.ViewGroup.addViewでandroid.view.ViewGroup.addView(ViewGroup.java:4301) でandroid.view.ViewGroup.addViewInner(ViewGroup.java:4460) (ViewGroup.java:4241) ででandroid.view.ViewGroup.addView(ViewGroup.java:4214) com.example.bhramaram.myapplication.jav.getvalues(jav.java:60) at com.example.bhramaram.myapplication.jav.onCreate(jav。 java:29) android.app.Activity.performCreate(Activity.java:6705) (and instrument.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java: 2599)

なぜこのエラーが発生しますか?

また、私はAndroid開発者コミュニティの新人です。このプロジェクトは、ローカルのSQLiteデータベースを使用してタイムテーブルを保存および表示するアプリケーションに関するものです。私は結果を表に示すためにウェブから見つけた方法に従います。このコードスニペットでより効率的な方法を提案できれば助かります。これらのTextViewがすでに追加されましたので

tableRow.addView(textView0);tableRow.addView(textView1); 
tableRow.addView(textView2);tableRow.addView(textView3); 
tableRow.addView(textView4);tableRow.addView(textView5); 
tb.addView(tableRow,lp1); 

:ここ

+0

''java.lang.IllegalStateException:指定された子がすでに親を持っています。最初に子の親に対してremoveView()を呼び出さなければなりません。それは明確ではありませんか? –

答えて

2

、テキストビューの作成:次に

TextView textView1,textView2,textView3,textView4,textView5,textView0; 
textView0=new TextView(this);textView1=new TextView(this); 
textView2=new TextView(this);textView3=new TextView(this); 
textView4=new TextView(this);textView5=new TextView(this); 

を、ループ内で、あなたはTableRow数回に同じTextViewを追加します前の行には、すでに親ビューがあり、あなたが言及したエラーを引き起こします。

修正するには、new TextView()の部分をループに移動する必要があります。

while (cursor.moveToNext()) { 
    tableRow=new TableRow(this); 

    TableLayout.LayoutParams lp1=new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,TableLayout.LayoutParams.MATCH_PARENT); 

    // Create new objects before adding them 
    textView0=new TextView(this);textView1=new TextView(this); 
    textView2=new TextView(this);textView3=new TextView(this); 
    textView4=new TextView(this);textView5=new TextView(this); 

    textView0.setText((cursor.getString(0)));textView1.setText((cursor.getString(1))); 
    textView2.setText((cursor.getString(2)));textView3.setText((cursor.getString(3))); 
    textView4.setText((cursor.getString(4)));textView5.setText((cursor.getString(5))); 
    tableRow.setLayoutParams(lp); 

    tableRow.addView(textView0);tableRow.addView(textView1); 
    tableRow.addView(textView2);tableRow.addView(textView3); 
    tableRow.addView(textView4);tableRow.addView(textView5); 
    tb.addView(tableRow,lp1); 
} 
関連する問題