3

プライベート属性として 2 つのダイアログ (1 つのダイアログと 1 つの ProgressDialog) を持つオーバーレイ拡張があります。MapView でオーバーレイをクリックすると、Dialog オブジェクトが表示されます。ユーザーがダイアログ内のボタンをクリックすると、ボタンが消えて ProgressDialog が表示されます。同時に、実行中のサービスに通知することでバックグラウンド タスクが開始されます。タスクが完了すると、Overlay オブジェクトのメソッド (buildingLoaded) が呼び出されてビューが切り替わり、ProgressDialog が閉じられます。ビューが切り替えられ、コードが実行されています (デバッガーで確認しました) が、ProgressDialog は閉じられません。hide() メソッドと cancel() メソッドも試しましたが、何も機能しません。誰か助けてくれませんか?Android のバージョンは 2.2 です

コードは次のとおりです。

public class LODOverlay extends Overlay implements OnClickListener {



private Dialog overlayDialog;

private ProgressDialog progressDialog;

       ..............


@Override
public void onClick(View view) {

                   .......

        final Context ctx = view.getContext();
        this.progressDialog = new ProgressDialog(ctx);
        ListView lv = new ListView(ctx);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(ctx, R.layout.layerlist, names);
        lv.setAdapter(adapter);
        final LODOverlay obj = this;
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
                String name = ((TextView) view).getText().toString();
        Intent getFloorIntent = new Intent(Map.RENDERER);
        getFloorIntent.putExtra("type", "onGetBuildingLayer");
        getFloorIntent.putExtra("id", name);
        view.getContext().sendBroadcast(getFloorIntent);
        overlayDialog.dismiss();

        obj.waitingForLayer = name;

        progressDialog.show(ctx, "Loading...", "Wait!!!");


            }
        });

    .......
}


public void buildingLoaded(String id) {
    if (null != this.progressDialog) {
        if (id.equals(this.waitingForLayer)) {
            this.progressDialog.hide();
            this.progressDialog.dismiss();

    ............

            Map.flipper.showNext();  // changes the view
        }
    }
}

}

4

2 に答える 2

7

これが問題の原因であるかどうかはわかりませんが、呼び出しているメソッドはですがProgressDialogstaticクラスのインスタンスで呼び出しています。メソッドの定義は次のとおりです。

public static ProgressDialog show (Context context, CharSequence title, CharSequence message)

ご覧のとおり、メソッドはを返しますが、クラスのインスタンスに対して操作をProgressDialog実行しません。show次のいずれかを使用するようにコードを更新します。

progressDialog.setTitle("Loading...");
progressDialog.setMessage("Wait!!!");
progressDialog.show();

また

progressDialog = ProgressDialog.show(ctx, "Loading...", "Wait!!!");
于 2011-01-06T20:51:46.650 に答える
2

ProgressDialog.show(...)メソッドは、実際には、ダイアログを返す前にダイアログに対してshow()を実行します。Android.jarのソースは次のとおりです。

public static ProgressDialog show(Context context, CharSequence title,
        CharSequence message, boolean indeterminate,
        boolean cancelable, OnCancelListener cancelListener) {
    ProgressDialog dialog = new ProgressDialog(context);
    dialog.setTitle(title);
    dialog.setMessage(message);
    dialog.setIndeterminate(indeterminate);
    dialog.setCancelable(cancelable);
    dialog.setOnCancelListener(cancelListener);
    dialog.show();
    return dialog;
}

このメソッドのすべてのオーバーロードは、これを参照します。

于 2012-02-24T00:19:31.593 に答える