3

私はこのコードを使用しています:

public void Close() {
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            switch(which) {
            case DialogInterface.BUTTON_POSITIVE:
                dialog.dismiss();
                MainActivity.this.finish();
                break;
            case DialogInterface.BUTTON_NEGATIVE:
                dialog.cancel();
                break;
            }
        }
    };
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Thanks");
    builder.setPositiveButton("Quit", dialogClickListener);
    builder.setNegativeButton("Stay", dialogClickListener);
    MainActivity.this.runOnUiThread(new Runnable() {
        public void run() {
            builder.show();

        }
    });
}

ユーザーが終了を選択すると、Close() が呼び出されます。アラートボックス「ビルダー」を開きます。ビルダーで「終了」を選択すると、次のエラーが発生します。

06-23 18:32:25.230: E/WindowManager(532): アクティビティ com.amateurprogs.championpkg.MainActivity が、最初にここに追加されたウィンドウ com.android.internal.policy.impl.PhoneWindow$DecorView@41768940 をリークしました
06-23 18:32:25.230: E/WindowManager(532): android.view.WindowLeaked: アクティビティ com.amateurprogs.championpkg.MainActivity がウィンドウ com.android.internal.policy.impl.PhoneWindow$DecorView@41768940 をリークしました。最初にここに追加されました
06-23 18:32:25.230: E/WindowManager(532): android.view.ViewRootImpl.(ViewRootImpl.java:344) で
06-23 18:32:25.230: E/WindowManager(532): android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267) で
06-23 18:32:25.230: E/WindowManager(532): android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) で
06-23 18:32:25.230: E/WindowManager(532): android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) で
06-23 18:32:25.230: E/WindowManager(532): android.view.Window$LocalWindowManager.addView(Window.java:537) で
06-23 18:32:25.230: E/WindowManager(532): android.app.Dialog.show(Dialog.java:278) で
06-23 18:32:25.230: E/WindowManager(532): android.app.AlertDialog$Builder.show(AlertDialog.java:932) で
06-23 18:32:25.230: E/WindowManager(532): com.amateurprogs.championpkg.MainActivity$2.run(MainActivity.java:42) で

MainActivity.java の 42 行目は builder.show() を参照しています。

「終了」ボタンを選択すると、dialog.dismiss() を実行してから、Activity.finish() を実行します。それでも窓から漏れます。

dialog.dismiss() でもこのエラーが発生するのはなぜですか。

4

3 に答える 3

0

したがって、最初はコードが汚いです。close()リスナーをメソッドにラップする理由はありませんOnClickListener。通常のメソッドを宣言するように宣言するだけです。 第二に、電話を

かける理由もありません。ユーザーが をクリックしたときだけ、 を呼び出します。 私が意味したことを変えてください。dialog.show()runOnUiThreadQuit Buttondialog.show()


更新:これが実際の例です:

package com.sajmon.test; // sajmon is my old nick

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class TestActivity extends Activity implements View.OnClickListener {

    protected static final int CREATE_CLOSE_DIALOG = 1245;
    protected Button someBtn;
    protected AlertDialog diag;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        someBtn = (Button) findViewById(R.id.btn);
        someBtn.setOnClickListener(this);

    }


    public void onClick(View view) {
        if (view.getId() == R.id.btn) {
            diag = createDialog(CREATE_CLOSE_DIALOG);
            diag.show();
        }
    }

    private AlertDialog createDialog(int type) {
        AlertDialog dialog = null;
        switch (type) {
        case CREATE_CLOSE_DIALOG:
            dialog = new AlertDialog.Builder(TestActivity.this)
                .setTitle("Closing")
            .setMessage("Do you want to quit?")
            .setPositiveButton("Yes", dialogListener)
            .setNegativeButton("no", dialogListener)
            .create();
            break;
        }
        return dialog;
    }


    final DialogInterface.OnClickListener dialogListener = new OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                case DialogInterface.BUTTON_POSITIVE:
                    dialog.dismiss();
                    finish();
                break;
                case DialogInterface.BUTTON_NEGATIVE:
                    dialog.dismiss();
                break;  
            }
        }
    };
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button 
        android:id="@+id/btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Quit!"
        android:layout_marginTop="20dp"
        />

</LinearLayout>
于 2012-06-23T13:35:14.337 に答える
0

私の質問に答えてくれてありがとう。実際には、非アクティビティ クラスから Close() を呼び出しているため、runOnUiThread() を呼び出しています。activity.finish() が呼び出される前に、dialog.dismiss() が機能することを期待していました。とにかく、dialog.builder.create() を使用して解決策を試します。

于 2012-06-24T08:11:47.997 に答える