7

そのため、クリックすると警告ダイアログが表示されるボタンがあります。アクティビティの onCreate メソッドでアラート ダイアログのビューを作成します。そのためのコードは次のとおりです。

    LayoutInflater factory = LayoutInflater.from(this);
    view = factory.inflate(R.layout.grade_result, null);

ボタンを初めて押すと、ダイアログは希望どおりに表示されますが、もう一度押すと、この例外がスローされます。

11-28 00:35:58.066: E/AndroidRuntime(30348): 原因: java.lang.IllegalStateException: 指定された子には既に親があります。最初に子の親で removeView() を呼び出す必要があります。

ボタンが押されたときに AlertDialog を表示するメソッドのコードは次のとおりです。

public void details(View v){
    final AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setView(view);
    alert.setMessage("Details About Your Grades")
    .setCancelable(false)
    .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id){
            dialog.cancel();

        }
    });
    alert.show();

どんな助けでも大歓迎です!ありがとうございました!

4

7 に答える 7

5

AlertDialog の Builder 内で設定する必要があるビューを膨らませると、うまくいきました。

Button mButton = (Button) findViewById(R.id.my_button);
mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // inflating view out of the onClick() method does not work
            LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final ViewGroup viewGroup= (ViewGroup) mInflater.inflate(R.layout.my_view, null);

            Dialog alertDialog = new AlertDialog.Builder(getActivity())
                    .setTitle(R.string.my_title)
                    .setView(viewGroup)
                    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    }).create();
            alertDialog.show();
        }
}
于 2015-09-18T13:50:46.707 に答える
1

アラートダイアログでも同様の問題がありました。初めてビューを膨らませ、2回目にメッセージを表示したいと思いました。警告ダイアログを一度表示すると、ビューが膨張し、ダイアログがキャッシュされます。2 回目に表示すると、エラー IllegalStateException:"call removeView() on child's parent first" が表示されます。

最初のクリックで膨らませたビューを削除し、2 回目のクリックでメッセージを表示することで、この問題を解決しました。-メッセージを膨らませたり作成したりする前に、毎回ビューまたはメッセージを削除します。

alertDialogBuilder.setView(null).setMessage(null);
alertDialogBuilder.setView(yourView).setMessage(yourMessage);

あなたのコードを修正しましたが、問題なく動作します。

LayoutInflater factory = LayoutInflater.from(this);
mView = factory.inflate(R.layout.grade_result, null);

public void details(View v){
    final AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setView(null).setMessage(null);
    alert.setView(mView);
    alert.setMessage("Details About Your Grades")
    .setCancelable(false)
    .setPositiveButton("Continue", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id){
            dialog.cancel();

        }
    });
    alert.show(); }
于 2014-01-09T13:18:21.077 に答える
0

あなたの「ビュー」が親に接続されたことが示されています。.setView(view) を呼び出したときに発生しました。私が正しければ - alertDialog クラスはあなたのビューの親を与えます。androidの基本です。ViewGroup には多くの子ビューがある場合があります。同様の問題がありました。したがって、これをonClick内で試すことができます:

ViewGroup vGroup = view.getParent();
vGroup.removeView(view);
// And right after that - close dialog
dialog.dismiss();

それは私を助けました、私はそれがあなたを助けることを願っています!

于 2015-08-20T09:20:40.717 に答える
-1

alert.create(); を使用します。次に、alertd.dismiss(); ダイアログを破壊する

 final AlertDialog.Builder alert = new AlertDialog.Builder(this);
        final AlertDialog alertd = alert.create();

        alert.setTitle("Title");
        alert.setMessage("Messaage");

        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog, int whichButton) {
            // Canceled.
              dialog.cancel();
              alertd.dismiss();
          }
        });
于 2012-11-28T08:45:23.020 に答える
-2

ダイアログでビューを設定する前に、View を null に設定できます。
ちょうどこのような:

alert.setView(null);
alert.setView(view);

ビューを再度設定する前に、常にビューを null に設定します。

于 2014-04-07T08:46:07.367 に答える