简体   繁体   English

如何在AlertDialog之后显示ProgressDialog

[英]How to show ProgressDialog after AlertDialog

I am having trouble with an alert dialog that I cannot hide. 我遇到了一个无法隐藏的警告对话框。

when the user press a button I show a dialog that is created with this code : 当用户按下按钮时,我会显示使用此代码创建的对话框:

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();

There are some heavy operations performed in the 'processUserAction' method, and inside it I am using an AysncTask that displays a ProgressDialog. 在'processUserAction'方法中执行了一些繁重的操作,在其中我使用显示ProgressDialog的AysncTask。

The problem I am having is that the dialog prompting for the password never goes of the screen (I have tried with dismiss(), cancel()). 我遇到的问题是提示输入密码的对话框永远不会出现在屏幕上(我尝试过dismiss(),cancel())。 I guess it stays there until the onClick method is finished. 我猜它一直待在onClick方法完成之前。

So, my question is how to close that AlertDialog, so I can show the ProgressDialog? 所以,我的问题是如何关闭AlertDialog,所以我可以显示ProgressDialog?

Another approach I have been trying is to set a DismissListener in the AlertDialog and calling the heavy operations from there, but I have had no luck ( it didn't get called ). 我一直在尝试的另一种方法是在AlertDialog中设置DismissListener并从那里调用繁重的操作,但我没有运气(它没有被调用)。

EDIT : Adding AsyncTask code 编辑 :添加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();
        }
    }


}

Thanks in advance 提前致谢

Can you show the code for processUserAction(..)? 你能展示processUserAction(..)的代码吗? There is no need to include the dismiss. 没有必要包括解雇。 I did something very similar and had no problems... Here's the code: 我做了一些非常相似的事情并且没有问题......这是代码:

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();

In export(file) I open the thread: 在导出(文件)中我打开线程:

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();
}

In handlerMessage I dismiss the progressDialog and show the final message. 在handlerMessage中,我解除progressDialog并显示最终消息。 Hope it helps you. 希望它能帮到你。

Here is a excample how I do it: 以下是我如何做的例子:

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();
        }
    }

Here is the code of deleteQuellenRecord: 这是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);
    }

Wiht Async Task I do it this way: 与异步任务我这样做:

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();
        }


        ...

You could create a listener outside of the AlertDialog, to abstract out the logic within the OnClickListener for the positive button. 您可以在AlertDialog之外创建一个侦听器,以在OnClickListener中为正向按钮抽象出逻辑。 That way, the listener can be notified, and the AlertDialog will be dismissed immediately. 这样,可以通知监听器,并立即解除AlertDialog。 Then, whatever processing of the user's input from the AlertDialog can take place independently of the AlertDialog. 然后,无论处理来自AlertDialog的用户输入的任何处理都可以独立于AlertDialog进行。 I'm not sure if this is the best way to accomplish this or not, but it's worked well for me in the past. 我不确定这是否是实现这一目标的最佳方式,但它在过去对我有用。

As far as I can tell, I don't see any obvious problems with your AsyncTask code. 据我所知,我没有看到你的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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM