0

これを機能させるのに少し苦労しましたが、これは私の理解の一部です...

「The [item] is [color]」というテキストを含むスピナー アイテムがあり、これを選択すると、... テーブル行またはそのようなもの (または単に相対レイアウト) を設定したいと思います... [item] と [color] の 2 つのボタンが重なり合っています。

public void onItemSelected(AdapterView<?> parentview, View arg1, int position, long id) 
{

    final TableLayout t1 = (TableLayout)findViewById(R.id.button_items);
    final TableRow tr = new TableRow(t1.getContext());
ArrayList<String> words = Create_ArrayList(R.raw.titles);  

// Create_ArrayList は、[item] や [color] アイテムなどの既知の単語を解析し、それらを配列に入れます... 後で列挙する目的で使用します。

String sentence = (String) spin.getSelectedItem();

    if(sentence.contains("[item]"))
    {
        String line = words.get(1);
        ArrayList<String> x = getParts(line);  

//この時点では、arraylist は [item] と [color] だけである必要があります...

        Toast.makeText(getBaseContext(), Integer.toString(x.size()), Toast.LENGTH_SHORT).show();
    for(int i = 0; i<x.size(); i++)
    {
              Toast.makeText(getBaseContext(), x.get(i), Toast.LENGTH_LONG).show();

            Button btn = new Button(tr.getContext());
       btn.setText(x.get(i));
       btn.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
       tr.addView(btn);
       t1.addView(tr, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    }   
}
}

しかし、私は取得し続けます...

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

ボタンが表示されず...アプリがクラッシュするだけです...山に。

助けていただければ幸いです...ありがとうございました!

4

2 に答える 2

1

これは、同じテーブル行に同じボタンを何度も追加しているためです。ボタンの配列を使用できます

btns = new Button[]{button1, button2, etc...} 

そして次のように言います。

for(int i = 0; i < x.size() ; i++ ){
     btn[i] = new Button(tr.getContext());
     btn[i].setText(x.get(i));
     tr.addView(btn[i]);
}
于 2012-05-07T04:51:49.047 に答える
1

最初のコード ブロックで

final TableLayout t1 = (TableLayout)findViewById(R.id.button_items);

既に t1 のビューがありますが、3 番目のコード ブロックでビューを追加しています。

tr.addView(btn);
       t1.addView(tr, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

それがあなたの例外の理由です。

View がすでに使用されている場合 (たとえば、findViewById で取得した場合は、addView を使用しないでください)。ビューを追加する場合は、NEW ビューで addView を使用します。これらの新しいビューのいくつかを 1 つのビューに追加できますが、その 1 つのビューを複数回追加することはできません。

これは私が他の投稿で見つけたものです

于 2012-05-07T06:10:26.720 に答える