0

非表示にできないアラートダイアログで問題が発生しています。

ユーザーがボタンを押すと、次のコードで作成されたダイアログが表示されます。

new AlertDialog.Builder(this)
            .setTitle(R.string.enterPassword)                
            .setView(textEntryView)          
            .setPositiveButton(R.string.ok, 
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            String password = pwdText.getText().toString();
                            dialog.dismiss();
                            processUserAction(password,targetUri);
                        }
                    })
            .setNegativeButton(R.string.cancel, 
                    new DialogInterface.OnClickListener() {                    
                        public void onClick(DialogInterface dialog, int whichButton) {
                            }                
                        })             
            .
            create();

'processUserAction'メソッドで実行されるいくつかの重い操作があり、その中でProgressDialogを表示するAysncTaskを使用しています。

私が抱えている問題は、パスワードの入力を求めるダイアログが画面に表示されないことです(dismiss()、cancel()で試しました)。onClickメソッドが終了するまでそこにとどまると思います。

だから、私の質問は、そのAlertDialogを閉じる方法です。そうすれば、ProgressDialogを表示できますか?

私が試みてきたもう1つのアプローチは、AlertDialogにDismissListenerを設定し、そこから重い操作を呼び出すことですが、運がありませんでした(呼び出されませんでした)。

編集:AsyncTaskコードを追加する

public class BkgCryptOperations extends AsyncTask<File,Void,Integer>{

    @Override
    protected Integer doInBackground(File... files) {
        if (files!=null && files.length > 0){
            File source = files[0];
            File target = files[1];
            return cryptAction.process(source,password, target);
        }

        return Constants.RetCodeKO;
    }

    CryptAction cryptAction;
    String password;
    ProgressDialog progressDialog;


    public BkgCryptOperations (CryptAction cryptAction,String password,ProgressDialog progressDialog){
        this.cryptAction=cryptAction;
        this.password=password;
        this.progressDialog=progressDialog;
    }

    @Override
    protected void onPreExecute() {
        if (progressDialog!=null){
            progressDialog.show();
        }
    }
    protected void onPostExecute(Integer i) {
        if (progressDialog!=null){
            progressDialog.dismiss();
        }
    }


}

前もって感謝します

4

3 に答える 3

2

これが私がそれを行う方法の例です:

public void daten_remove_on_click(View button) {
        // Nachfragen
        if (spinadapter.getCount() > 0) {
            AlertDialog Result = new AlertDialog.Builder(this)
                    .setIcon(R.drawable.icon)
                    .setTitle(getString(R.string.dialog_data_remove_titel))
                    .setMessage(getString(R.string.dialog_data_remove_text))
                    .setNegativeButton(getString(R.string.dialog_no),
                            new DialogInterface.OnClickListener() {
                                public void onClick(
                                        DialogInterface dialogInterface, int i) {
                                    // Nicht löschen
                                    dialogInterface.cancel();
                                }
                            })
                    .setPositiveButton(getString(R.string.dialog_yes),
                            new DialogInterface.OnClickListener() {
                                public void onClick(
                                        DialogInterface dialogInterface, int i) {
                                    String _quellenName = myCursor.getString(1);
                                    deleteQuellenRecord(_quellenName);
                                    zuletztGelöscht = _quellenName;
                                }
                            }).show();
        } else {
            // Keine Daten mehr vorhanden
            Toast toast = Toast.makeText(Daten.this,
                    getString(R.string.dialog_data_remove_empty),
                    Toast.LENGTH_SHORT);
            toast.show();
        }
    }

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

private void deleteQuellenRecord(String _quellenName) {
        String DialogTitel = getString(R.string.daten_delete_titel);
        String DialogText = getString(R.string.daten_delete_text);
        // Dialogdefinition Prograssbar
        dialog = new ProgressDialog(this) {
            @Override
            public boolean onSearchRequested() {
                return false;
            }
        };
        dialog.setCancelable(false);
        dialog.setTitle(DialogTitel);
        dialog.setIcon(R.drawable.icon);
        dialog.setMessage(DialogText);
        // set the progress to be horizontal
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // reset the bar to the default value of 0
        dialog.setProgress(0);
        // set the maximum value
        dialog.setMax(4);
        // display the progressbar
        increment = 1;
        dialog.show();
        // Thread starten
        new Thread(new MyDeleteDataThread(_quellenName)) {
            @Override
            public void run() {
                try {
                    // Datensatz löschen
                    myDB.execSQL("DELETE ... ');");
                    progressHandler
                            .sendMessage(progressHandler.obtainMessage());
                    myDB.execSQL("DELETE ...);");
                    // active the update handler
                    progressHandler
                            .sendMessage(progressHandler.obtainMessage());
                    myDB.execSQL("DELETE ...;");
                    // active the update handler
                    progressHandler
                            .sendMessage(progressHandler.obtainMessage());
                    // Einstellung speichern
                    try {
                        settings.edit().putString("LetzteQuelle", "-1")
                                .commit();
                    } catch (Exception ex) {
                        settings.edit().putString("LetzteQuelle", "").commit();
                    }

                } catch (Exception ex) {
                    // Wait dialog beenden
                    dialog.dismiss();
                    Log.e("Glutenfrei Viewer",
                            "Error in activity MAIN - remove data", ex); // log
                                                                            // the
                                                                            // error
                }
                // Wait dialog beenden
                dialog.dismiss();

            }
        }.start();
        this.onCreate(null);
    }

Async Task を使用すると、次のようになります。

private class RunningAlternativSearch extends
            AsyncTask<Integer, Integer, Void> {


        final ProgressDialog dialog = new ProgressDialog(SearchResult.this) {
            @Override
            public boolean onSearchRequested() {
                return false;
            }
        };



        @Override
        protected void onPreExecute() {
            alternativeSucheBeendet = false;
            String DialogTitel = getString(R.string.daten_wait_titel);
            DialogText = getString(R.string.dialog_alternativ_text);
            DialogZweiteChance = getString(R.string.dialog_zweite_chance);
            DialogDritteChance = getString(R.string.dialog_dritte_chance);
            sucheNach = getString(R.string.dialog_suche_nach);
            dialog.setCancelable(true);
            dialog.setTitle(DialogTitel);
            dialog.setIcon(R.drawable.icon);
            dialog.setMessage(DialogText);
            dialog.setOnDismissListener(new OnDismissListener() {
                public void onDismiss(DialogInterface arg0) {
                    // TODO Auto-generated method stub
                    cancleBarcodeWorker();
                    if (alternativeSucheBeendet==false){
                        // Activity nur beenden wenn die Suche
                        // nicht beendet wurde, also vom User abgebrochen
                        Toast toast = Toast.makeText(SearchResult.this, SearchResult.this
                                .getString(R.string.toast_suche_abgebrochen),
                                Toast.LENGTH_LONG);
                        toast.show();
                        myDB.close();
                        SearchResult.this.finish();
                    }
                }
            });
            dialog.show();
        }


        ...
于 2012-09-18T21:11:45.353 に答える
1

processUserAction(..) のコードを表示できますか? 解雇を含める必要はありません。私は非常に似たようなことをしましたが、問題はありませんでした...コードは次のとおりです。

AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("Export data.\nContinue?")
            .setCancelable(false)
            .setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            String file = getObra().getNome();
                            d = new ProgressDialog(MenuActivity.this);
                            d.setTitle("Exporting...");
                            d.setMessage("please wait...");
                            d.setIndeterminate(true);
                            d.setCancelable(false);
                            d.show();
                            export(file);
                        }
                    })
            .setNegativeButton("No",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
                    });
    AlertDialog alert = builder.create();
    alert.show();

export(file) で、スレッドを開きます。

private void export(final String file) {


    new Thread() {
        public void run() {
            try {
                ExportData ede = new ExportData(
                        getApplicationContext(), getPmo().getId(),
                        file);
                ede.export();
                handlerMessage("Done!!");
            } catch (Exception e) {
                handlerMessage(e.getMessage());
                System.out.println("ERROR!!!" + e.getMessage());
            }
        }
    }.start();
}

handlerMessage で、progressDialog を閉じて、最終メッセージを表示します。お役に立てば幸いです。

于 2012-09-18T21:04:29.807 に答える
0

AlertDialogの外部にリスナーを作成して、ポジティブボタンのOnClickListener内のロジックを抽象化することができます。そうすれば、リスナーに通知することができ、AlertDialogはすぐに閉じられます。次に、AlertDialogからのユーザー入力の処理は、AlertDialogとは独立して実行できます。これがこれを達成するための最良の方法であるかどうかはわかりませんが、過去にはうまくいきました。

私の知る限り、AsyncTaskコードに明らかな問題は見られません。

public interface IPasswordListener {
    public void onReceivePassword(String password);
}

IPasswordListener m_passwordListener = new IPasswordListener {
    @Override
    public void onReceivePassword(String password) {
        processUserAction(password,targetUri);
    }
}

public void showPasswordDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.enterPassword);
    builder.setView(textEntryView);
    builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            m_passwordListener.onReceivePassword(pwdText.getText().toString());
            dialog.dismiss();
        }
    });
    builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.cancel();
        }
    });
    builder.show();
}
于 2012-09-18T20:37:32.477 に答える