Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

addViewにおけるIleegalStateException

こんにちは、趣味でプログラミングをしているものです。初心者だと思って接していただけると大変うれしいです。

現在一部xmlファイルを使わずに.java内でGUIを設置し、Android Studioにて簡単なボードゲームの作成をしようと試みております。
そこでタイトルにあります問題に遭遇し、解決の糸口が見られずここに質問させていただいた次第であります。
まず以下に私の書きましたプログラムを載せさせていただきます。import文は省略させていただきます。
WindowAクラス内の //? の箇所にエラーが発生してしまいます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public class gameActivity extends Activity {
    gameActivity now = this;
    Field gameField;
    public Button[] buttons;
    public TextView[] fieldT;
    TextView[][] playerT;
    WindowLayout[] layoutWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
        layoutWindow = new WindowLayout[7];
        buttons = new Button[7];
        buttons[0] = (Button) findViewById(R.id.buttonA);
          類似した宣言、省略
        layoutWindow[0] = new WindowA(now, 1,2,0,0);
                        類似した宣言、省略
        for(int i = 0; i<6; i++) {
            final int finalI = i;
            buttons[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    layoutWindow[finalI].setAction(now, gameField);
                    layoutWindow[finalI].showPopupCenter(v);
                }
            });
        }
        buttons[6].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                gameField.changeTurn(now, v);
            }
        });
    }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public class WindowA extends WindowLayout {
    public WindowA(gameActivity now, int buttonNum, int textNum, int editNum, int imageNum) {
        super(now, buttonNum, textNum, editNum, imageNum);
        layout = new LinearLayout(now);
        texts[0].setText(R.string.a);
        texts[1].setText(R.string.b);
        buttons[0].setText(R.string.c);
        layout.addView(texts[0]);
//?    layout.addView(texts[1]);
        layout.addView(buttons[0]);
        setPopup(now);
    }
    @Override
    public void setAction(final gameActivity now, final Field field) {
        buttons[0].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ボタンを押したときのアクションは省略
            }
        });
    }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public abstract class WindowLayout{
    public ViewGroup layout;
    public PopupWindow popup;
    public Button[] buttons;
    public TextView[] texts;
    public EditText[] edits;
    public ImageView[] images;
    public WindowLayout(gameActivity now,int buttonNum, int textNum, int editNum, int imageNum){
        buttons = new Button[buttonNum];
        texts = new TextView[textNum];
        edits = new EditText[editNum];
        images = new ImageView[imageNum];
        Arrays.fill(buttons, new Button(now));
        Arrays.fill(texts, new TextView(now));
        Arrays.fill(edits, new EditText(now));
        Arrays.fill(images, new ImageView(now));
    }
    public abstract void setAction(gameActivity now, Field field);
    public void setPopup(Activity now){
        PopupWindow popupWindow = new PopupWindow(now);
        popupWindow.setWindowLayoutMode(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
        popupWindow.setContentView(layout);
        popupWindow.setOutsideTouchable(true);
        popupWindow.setFocusable(true);
        this.popup = popupWindow;
    }
    public void showPopupCenter(View v){
        popup.showAtLocation(v, Gravity.CENTER, 0, 0);
    }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

以上のようなプログラムでgameActivityにあるボタンを押すとpopupWindowが出現するようにしています。
問題となる//?の部分にはIllegalStateExceptionが出てしまいます。

調べてみたところ親のViewGroupをremoveView()するといいとかなんとか出てきたのですが、
(1)どこで親が設定されているのか理解できない
(2)addView一つだけだとうまくいく。texts[0]とtexts[1]が二個入ると初めてエラーになる(順不問)
(3)一度問題なく動作した。しばらく置いたのち急にエラーを発するようになった
などの点から何が問題なのかわからず困っています。

質問の仕方もあっているかわかりませんが、どなたかお力添えしていただける方がいましたら
ぜひその知恵をお貸しください。よろしくお願いいたします。

1

回答

5636

閲覧

1件の回答

評価

0

IllegalStateExceptionの後ろに出てるメッセージはちゃんと読んでるのかね?
メッセージが出てるなら、例外そのものよりそちらを重視しないとな。

今回はa.addView(x)としたxが既にb.addView(x)としたことがあるものだから、先にb.removeView(x)しろってことだろう。
フレームワークの設計がイマイチな気がするな。
ツリー構造で付け替えが起こる場合、大抵は自動的にremoveするもんだと思うが。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。