Android OnClickListener更改按钮文本或显示进度

时间:2018-08-15 20:26:45

标签: android button onclicklistener progress settext

在保存文件之前,我试图设置按钮的文本。该文件需要一段时间才能保存。因此,当单击按钮时,似乎没有任何作用。我尝试将按钮设置为“正在保存...”,然后再进入保存文件功能,然后在完成后将其更改回。甚至试图显示进度对话框,但在功能完成后会显示出来。如何在功能启动之前获取要更改的文本或显示进度对话框?

fileExport.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
        progress = new ProgressDialog(activity);
        progress.setTitle(null);
        progress.setMessage("Saving Device...");
        progress.show();

        fileExport.setText("Saving.....");

        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        AlertDialog alert;

        if (delegate.export()) {   //save file
            builder.setCancelable(false);
            builder.setTitle("Export Successful");
            builder.setMessage("Your settings were exported successfully to " + AppDelegate.path + ".");
            builder.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            alert = builder.create();
            alert.show();
        } else {
            builder.setCancelable(false);
            builder.setTitle("Export Unsuccessful");
            builder.setMessage("Error! There was a problem exporting your settings. Please try again.");
            builder.setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });
            alert = builder.create();
            alert.show();
        }
        fileExport.setText("Export to File");
    }
});

1 个答案:

答案 0 :(得分:0)

问题是您将这两个进程都放在了同一线程上。这意味着在文件完成保存之前,它不会更新按钮的文本。查看异步任务http://reference.wolfram.com/language/tutorial/AsynchronousTasks.html, 将其作为AsyncTask来完成(当您需要更新UI时,这可能是一个更好的选择)

在活动中,创建Async类的实例并执行。

SaveData save = new SaveData();
save.execute();

将AsyncTask子类作为活动中的私有类

private class SaveData extends AsyncTask<String, Void, Boolean>{

@Override
protected Boolean doInBackground(String... params) {
    // your background code here. Don't touch any UI components

    if(your code worked...)
        return true;                
    else
        return false;
}

protected void onPostExecute(Boolean result) {
     //This is run on the UI thread so you can do as you wish here
     if(result)
         Toast successful
     else
         Toast unsuccessful
 }
}