0

必要なTableLayoutの数としてJavaでレイアウトを作成することは、デザインタイムとは呼ばれません。

電話をかけると、別の親に割り当てる前に(現在の親から)IllegalStateException削除するように指示されますViewcreatePlayerTables()

ImageViewのリストから最初のTableRowにImageViewを追加しようとすると、このループの最初の行で例外がスローされます。

for (int i = 0; i < 3; i++) {
    tableRowsLst.get(0).addView((ImageView) imageViewsLst.get(i));
    tableRowsLst.get(1).addView((ImageView) imageViewsLst.get(i+3));
}

エラーは、ImageViewがすでにViewGroupに追加されていることを示していますが、以下のコードを見て、新しいImageViewを作成し、エラーが発生した行のViewGroupにのみ追加しているため、失敗する理由がわかりません。 。

// List<ImageView> imageViewsLst = new ...
// List<TableRow> tableRowsLst = new ...

/**
* Initialises the TableLayouts, one per player
*/ 
private TableLayout createPlayerTables(int playerNum) {
    ...

    for (int i = 0; i < 6; i++) {
        imageViewsLst.add(new ImageView(this));
        ...
    }

    for (int i = 0; i < 3; i++) {
        tableRowsLst.add(new TableRow(this));
        ...
    }

    for (int i = 0; i < 3; i++) {
        tableRowsLst.get(0).addView((ImageView) imageViewsLst.get(i));
        tableRowsLst.get(1).addView((ImageView) imageViewsLst.get(i+3));
    }

    ...
}
4

3 に答える 3

4

このループでは:

for (int i = 0; i < 3; i++){
   tableRowsLst.add(new TableRow(this));
   tableRowsLst.get(i).setLayoutParams(
       new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, dipToPixels(55)));
   tableRowsLst.get(i).setOrientation(LinearLayout.HORIZONTAL);
}

TableRowsにnewを追加し続けtableRowsLstますが、常に最初の3つの要素のみを使用します。

ループの前にリストをクリアします。

tableRowsLst.clear();
于 2010-11-11T17:28:32.193 に答える
2

この例ではそうではありませんが、この問題のもう1つの一般的な原因は、とを正しく利用onCreateDialog()していないことonPrepareDialog()です。はonCreateDialog()一度だけ呼び出され、ここで行われたことはすべて持続します。動的コンテンツをレイアウトに追加する場合は、作成後、各表示の前に行われるもの(Dialog)を使用することをお勧めします。AndroidのドキュメントonPrepareDialog()から引用するには:

ダイアログが表示される前に、AndroidはオプションのコールバックメソッドonPrepareDialog(int、Dialog)も呼び出します。ダイアログを開くたびにダイアログのプロパティを変更する場合は、このメソッドを定義します。このメソッドは、ダイアログが開かれるたびに呼び出されますが、onCreateDialog(int)は、ダイアログが最初に開かれたときにのみ呼び出されます。onPrepareDialog()を定義しない場合、ダイアログは前回開いたときと同じままになります。このメソッドには、onCreateDialog()で作成したDialogオブジェクトとともに、ダイアログのIDも渡されます。

于 2011-05-02T05:46:47.210 に答える
1

あはは!さて、いくつかの誤った開始の後、ここに問題があります。

imageViewsListメンバー変数です。createPlayerTablesを呼び出すたびに6つのビューを追加し、その後、毎回最初の6つを使用します。最初のパス(プレーヤー0)、問題ありません。2番目のパス(プレーヤー1):ブーム。

オプション1)それらを保存しないでください。与えられたコードはそれらを必要としませんが、それはすべてのベースを一気にカバーするわけではありません。あなたはそれらをテーブルの列から掘り出し、ピンチでそれらをキャストすることができます。

オプション2)imageViewsListへのアクセスをplayerNum * 6(最初に呼び出され== imageViewsList.size()たときに)オフセットしますcreatePlayerTables()

フレンドリーなアドバイス:いくつかの異なる方法で問題を見つけることができたでしょう:

  • TableRow.add()を呼び出す前にオブジェクトIDを指定したLog.d()は、例外の直後の2番目のパスで使用されたものと同じオブジェクトIDを明らかにします。
  • HandyDandyDebuggerでコードをステップスルーします。はい、それはこの場合に何が起こっているのかを理解するためにステップスルーする多くのコードです。いくつかの異なるブレークポイントにより、createPlayerTables()のどの呼び出しがスローされているかを簡単に確認でき、スローするときにのみcpt()にステップインできます。

バグを見つけるたびに「これを捕まえるために何ができたのか」と自問することで、デバッグスキルが向上します。

于 2010-11-11T17:27:09.940 に答える