0

AlertDialogを継承したクラスを作成しました。このクラスは、インターネット経由で値をチェックするスレッドを開始します (長い操作時間)。ダイアログには単一のボタン (POSITIVE_BUTTON) があります。このボタンは、スレッドが終了するまで無効にする必要があります。しかし、スレッドからこのボタンを有効にする方法がわかりません。

私のコード:

public MyDialog(Context context) {
    super(context);
    View view = getLayoutInflater().inflate(R.layout.dialog, null);
    setView(view);

    getButton(BUTTON_POSITIVE).setEnabled(false);

    new Thread(new Runnable() {
        public void run() {
            // Long operation time code
            getButton(BUTTON_POSITIVE).setEnabled(true); // CRASH!!!
        }
    }).start();    
}

エラーは、別のスレッドからビューを変更したことを示しています。そしてrunOnUIThread、AlertDialogに存在しないため、メソッドを使用できません。私は何をすべきか?

4

3 に答える 3

1

Activityコンストラクターでan を渡すことができる場合は、次のようにします。

public class MyDialog extends AlertDialog {

    public MyDialog(Activity act) {
        super(act);
        View view = getLayoutInflater().inflate(R.layout.layout_launch, null);
        setView(view);

        getButton(BUTTON_POSITIVE).setEnabled(false);

        act.runOnUiThread(new Runnable() {
            public void run() {
                // Long operation time
                getButton(BUTTON_POSITIVE).setEnabled(true); // CRASH!!!
            }
        });  
    }

}
于 2013-06-14T16:40:15.687 に答える
0

UI スレッドとは異なるスレッドから UI 要素を管理することはできません

 public MyDialog(Context context) {
    super(context);
    final View view = getLayoutInflater().inflate(R.layout.dialog, null);
    setView(view);

    getButton(BUTTON_POSITIVE).setEnabled(false);

    new Thread(new Runnable() {
        public void run() {
            // Long operation time code
           view.post(new Runnable() {
              public void run() {
                 View button = getButton(BUTTON_POSITIVE);
                  if (button != null)
                     button.setEnabled(true); // CRASH!!!
              }
           }
        }
    }).start();    
}

また、getButton()

于 2013-06-14T17:05:28.243 に答える
-1

渡すコンテキストが呼び出し元のアクティビティであると仮定すると、次のようになります。

public MyDialog(Context context) {
    super(context);
    View view = getLayoutInflater().inflate(R.layout.activity_main, null);
    setView(view);

    getButton(BUTTON_POSITIVE).setEnabled(false);

    ((Activity) context).runOnUiThread(
    new Thread(new Runnable() {
        public void run() {
            // Long operation time
            getButton(BUTTON_POSITIVE).setEnabled(true); // CRASH!!!
        }
    }));
}
于 2013-06-14T16:40:52.153 に答える