0

このトピックには非常に多くのスレッドがあり、すべての提案が問題を解決するわけではありません。バックグラウンド サービスが AlertDialog にグラフ化されたデータをフィードしているため、この状況はより複雑になります。サービスは、LocalBroadcastManager を使用して、onCreateDialog コールバックを含むメイン アクティビティに Intent を渡します。データは非常に迅速に届きます。

onPause() で removeDialog を呼び出してみました。コンテキストを null に設定して、スレッドが null のときに呼び出しないようにし、onStart で新しいコンテキストをブロードキャスト レシーバーに通知するスレッドに渡します。ログ メッセージは、呼び出されるダイアログの削除を示します。画面の向きが変更された後、showDialog() メソッドが onCreateDialog() コールバックをトリガーするようになりました。そのコールバックが通知されると、ダイアログが(おそらく)削除されているため、findViewById()は期待どおりにnullを返しますが、それでも恐ろしいエラーが発生します

" java.lang.IllegalStateException: 指定された子にはすでに親があります。最初に子の親で removeView() を呼び出す必要があります。 "

(AlertDialog で 'removeView' を呼び出す方法も、私が答えを見つけることができないものであり、このフォーラムの他の誰もそれに対する答えを見つけていません!)

私が考えることができる唯一のことは、間違ったコンテキストを持つ Broadcast イベントがキューに入れられているということです。おそらく、ブロードキャスト レシーバーに向かうすべてのインテントをクリアする方法はありますか?

onCreateDialog のコードは次のとおりです。グラフィック ビューは「waveForm.get(id)」にあります。それはうまく機能し、グラフを表示します(私が望むように継続的ではありません)が、向きが変わると死にます!

protected Dialog onCreateDialog(int id)
{
    Log.d(TAG, "Alert Dialog 'onCreateDialog' method has been called with id " + id);
    if(this.findViewById(id) != null)
    {
        Log.d(TAG, "Alert Dialog view exists!");
        return null;
    }

    switch(id)
    {
        case 0:
        Builder bldr = new AlertDialog.Builder(this);
        Dialog alert = bldr.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id, 
                new DialogInterface.OnClickListener()
                {
                    public void onClick(DialogInterface dialog, int id)
                    {
                        dialog.cancel();
                    } 
                }).create();

        alert.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight());
        return alert;

        case 1:
        Builder bldr1 = new AlertDialog.Builder(this);
        Dialog alert1 = bldr1.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id, 
                new DialogInterface.OnClickListener()
                {
                    public void onClick(DialogInterface dialog, int id)
                    {
                        dialog.cancel();
                    } 
                }).create();

        alert1.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight());
        return alert1;

        case 2:
        Builder bldr2 = new AlertDialog.Builder(this);
        Dialog alert2 = bldr2.setView(waveForm.get(id)).setNegativeButton("Dismiss " + id, 
                new DialogInterface.OnClickListener()
                {
                    public void onClick(DialogInterface dialog, int id)
                    {
                        dialog.cancel();
                    } 
                }).create();

        alert2.getWindow().setLayout(LayoutParams.WRAP_CONTENT, waveForm.get(id).getCurrentHeight());
        return alert2;

    }

    return null;
}
4

1 に答える 1

0

コードを投稿していただけますか?おそらく、ダイアログ自体ではなく、ダイアログにアタッチしているビューです。ビューを現在の親から削除する前に、ビューをダイアログに追加しないでください。

于 2012-05-09T19:09:48.963 に答える