2012-01-26 4 views
0

選択したスポーツに予定されているゲームを週単位で表示するページがあります。選択したスポーツと週は、ページの先頭に開かれたXMLファイル内に格納されます。次の週のリンクをクリックすると、このxmlファイルに新しい週の日付の値が格納され、ページがリロードされます。今週のすべてのゲームが表示されるはずです。これらのゲームは、テーブルレイアウトに表示されます。そこでは、.javaページに必要に応じてプログラムで行を作成します。 コードの簡略化したサンプルを示します。「指定された子には既に親があります」エラー

TableLayout tlGames = (TableLayout)findViewById(R.id.table_games); 

for (int i = 0; i < gameCount; i++) 
{ 

TableRow trGameHomeTeam = new TableRow(this); 

TextView tvHomeTeamName = new TextView(this); 

tvHomeTeamName.setText("Home Team Name Here"); 

tvHomeTeamName.setLayoutParams(new LayoutParam (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

TextView tvHomeTeamScore = new TextView(this); 

tvHomeTeamScore.setText("Home Team Score Here"); 

tvHomeTeamScore.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

trGameHomeTeam.addView(tvHomeTeamName); 

trGameHomeTeam.addView(tvHomeTeamScore); 

tlGames.addView(trGameHomeTeam,new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 

}   

最初にアプリを実行すると、現在の日付のゲームが正しく表示されます。その後、次週のリンクをクリックすると、このページを再読み込みし、この新しい週のゲームを表示する必要があります。代わりに、 "指定された子がすでに親を持っています。最初に子の親に対してremoveView()を呼び出す必要があります。"というエラーメッセージが表示されます。私は "tlGames.removeAllViews();"を追加しました。 TableLayoutのtlGames行の直後でしたが、これはエラーを修正しませんでした。

「addView」は、テーブル行またはテキスト行をテーブル行に作成するための場所です。

誰でも私が間違っていることを教えてもらえますか?

おかげ

+1

これは十分な情報ではありません。 onCreateメソッド、来週のリスナー、xmlのすべてを見ることができますか? – ghostbust555

+1

完全なスタックトレースをここに投稿してください。 –

+0

ここに活動コード全体を入れてください。レイアウトも。 – Gangnus

答えて

4

私の推測では、この週のゲームを表示するページのリロードで、あなたは詳細のレイアウトを膨らませるレイアウトインフレータを使用するということですか?

このエラーが発生したと思われるのはレイアウトインフレータだけです。インフルエングメソッドにfalseの3番目の引数を渡します。それ以外の場合はビューのルートを膨張させます。この例外を返す

すなわち

inflater.inflate(R.layout.profile, container, false); 
0

まずあなたがそのエラーを取得したラインでを伝える必要があります。またはスタックトレースを置く。

ここで、エラーが表示されているだけで、同じビューの場所に別のビューを追加しようとしているというエラーメッセージが表示されます。

他のビューを追加する前に、追加したビューを最初に特定の名前で削除します。

Ex。 tl.removeView(blablabla); 次にビューを追加します。

それとも

あなたがループ条件の具体的なビューをロードしたい場合、あなたもこれを試すことができます。

ループ条件に基づいて実行する別のXMLを作成します。 Ex。子として言います..xml

次に、そのレイアウトをループ条件に基づいてメインレイアウトに追加します。そのループ内のそのレイアウトのデータでアクセスすることもできます。

私が行ったこのループを見てください。

for (int i = 0; i<=tempEmployerList.size()-1; i++) { 
      LinearLayout EmpItem = (LinearLayout)LayoutInflater.from  (getApplicationContext()).inflate(R.layout.child, null); 
    // to access with the data use this 

    ((TextView)EmpItem.findViewById(R.id.taxcodeTextView)).setText(TAXCODE); 


    // Finaly add that loopLayout to your layout to your main layout like this 
    myLinearLayout.addView(EmpItem); 
} 

私はそれをテストしたようにあなたを助けてくれるでしょう。

そうでない場合はお知らせください。

それとも

それでもあなたは、独自のコードで何かをしたい場合は、this example

を理解してそれは無愛想なあなたを助けるために行くだろう。

お楽しみください。 :))

+0

これは私の最初のアプリですので、私はこれを理解するために努力しています。エラーが発生した行番号を見つけるにはどうすればよいですか?スタックトレースを(LogCatから)コピーして貼り付けました。編集、スペースの制限のために完全なスタックトレースを貼り付けることができません。 01-27 11:28:58.132:E/AndroidRuntime(16437):java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {com.msasports.scoreboard/com.msasports.scoreboard.Scores}:java.lang.IllegalStateException:指定された子にはすでに親があります。子の親で最初にremoveView()を呼び出す必要があります。 – user1172113

+0

@ user1172113:更新された回答を参照してください。 –

0

私は、すでにいくつかのエラーを修正しました。さらに2つを修正してください。

tvHomeTeamName.setLayoutParams(new TableRow.LayoutParams (LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

... 

    tvHomeTeamScore.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); 

これらの修正では、私のところで動作します。

関連する問題