如何在创建文件期间显示进度条?

如何在创建PDF文件期间单击按钮时显示进度条,并在创建文件后隐藏它?

public class TwoFragment extends android.support.v4.app.Fragment { private View v; Intent chooser=null; String myInt=""; String ciao=""; private String string=""; private ProgressBar pdfProgress; ProgressTask task; public TwoFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View rootView = inflater.inflate(R.layout.fragment_two, container, false); Button mButton = (Button) rootView.findViewById(R.id.newbutton); mButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //sendemail(); // pdfProgress.setVisibility(View.GONE); /* pdfProgress.setVisibility(View.VISIBLE); createPDF(); pdfProgress.setVisibility(View.GONE); viewPDF();*/ /*MyAsyncTask myTask = new MyAsyncTask(); myTask.execute(); */ showProgress(); } }); TextView titolo3 = (TextView)rootView.findViewById(R.id.result); TextView titolo2 = (TextView)rootView.findViewById(R.id.result2); TextView titolo4 = (TextView)rootView.findViewById(R.id.resultpizze); pdfProgress = (ProgressBar)rootView.findViewById(R.id.progressbar); pdfProgress.setVisibility(View.GONE); //pdfProgress.setVisibility(View.INVISIBLE); //TextView titolo = (TextView)rootView.findViewById(R.id.quantità3); /* class MyAsyncTask extends AsyncTask { @Override protected Void doInBackground(Void... params) { // This runs in new thread!!! // Always run long operations in another thread, so GUI will never be blocked createPDF(); return null; } @Override protected void onPostExecute(Void v) { // This runs in MAIN thread, after the job's done. // You always have to update gui from main thread pdfProgress.setVisibility(View.GONE); viewPDF(); } } */ Bundle bundle2=getArguments(); if(bundle2 != null){ string = bundle2.getString("scelta2"); titolo3.setText(string); } /* Bundle bundle2=getArguments(); if(bundle2 != null){ // myInt = bundle2.getString("scelta2",myInt); cacca=bundle2.getString("result",null); //cacca=myInt; // Log.d("ciao",cacca); titolo3.setText(cacca); }*/ //titolo3.setText(myInt); /* Bundle bundle3=getArguments(); if(bundle3 != null){ // String myInt3 = bundle3.getString("totalebirre", null); // cazzo2=Integer.parseInt(myInt3); int cazzo2=bundle3.getInt("totalebirre"); titolo2.setText(String.valueOf(cazzo2)); } Bundle bundle=getArguments(); if(bundle != null){ // String myInt2 = bundle2.getString("totalepizze", null); // cazzo=Integer.parseInt(myInt2); //titolo2.setText(myInt2); String string=bundle.getString("scelta3", null); titolo4.setText(string); } */ return rootView; } /* public void sendemail(){ Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("mailto:")); String[] to={"marco_marcoletto@hotmail.it"}; intent.putExtra(Intent.EXTRA_EMAIL,to); intent.putExtra(Intent.EXTRA_SUBJECT, "ciao"); intent.putExtra(Intent.EXTRA_TEXT, "zao"); intent.setType("message/rfc822"); chooser=intent.createChooser(intent,"manda email"); startActivity(chooser); }*/ //@TargetApi(Build.VERSION_CODES.M) public void createPDF() { Document doc = new Document(); try { String path = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/droidText"; File dir = new File(path); if (!dir.exists()) dir.mkdirs(); Log.d("PDFCreator", "PDF Path: " + path); //File file = new File(dir, "sample.pdf"); File file = new File(dir, "salve.pdf"); FileOutputStream fOut = new FileOutputStream(file); PdfWriter.getInstance(doc, fOut); // open the document doc.open(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Bitmap bitmap = BitmapFactory.decodeResource(getContext() .getResources(), R.drawable.androtuto); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); Image myImg = Image.getInstance(stream.toByteArray()); myImg.setAlignment(Image.MIDDLE); // add image to document doc.add(myImg); Paragraph p1 = new Paragraph(string); Font paraFont = new Font(Font.COURIER); p1.setAlignment(Paragraph.ALIGN_CENTER); p1.setFont(paraFont); // add paragraph to document doc.add(p1); Paragraph p2 = new Paragraph("Bonjour Android Tuto"); Font paraFont2 = new Font(Font.COURIER, 14.0f, Color.GREEN); p2.setAlignment(Paragraph.ALIGN_CENTER); p2.setFont(paraFont2); doc.add(p2); stream = new ByteArrayOutputStream(); bitmap = BitmapFactory.decodeResource(getContext() .getResources(), R.drawable.android); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); myImg = Image.getInstance(stream.toByteArray()); myImg.setAlignment(Image.MIDDLE); // add image to document doc.add(myImg); // set footer Phrase footerText = new Phrase("Pied de page "); HeaderFooter pdfFooter = new HeaderFooter(footerText, false); doc.setFooter(pdfFooter); } catch (DocumentException de) { // Log.e("PDFCreator", "DocumentException:" + de); Log.e("PDFCreator", "DocumentException:" + de.getMessage()); } catch (IOException e) { // Log.e("PDFCreator", "ioException:" + e); Log.e("PDFCreator", "DocumentException:" + e.getMessage()); } finally { doc.close(); } } public void viewPDF(){ String path = "/sdcard/droidText/salve.pdf"; File targetFile = new File(path); Uri targetUri = Uri.fromFile(targetFile); Intent intent; intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(targetUri, "application/pdf"); startActivity(intent); } private class ProgressTask extends AsyncTask { protected void onPreExecute() { pdfProgress.setMax(100); // set maximum progress to 100. } protected void onCancelled() { pdfProgress.setMax(0); // stop the progress } protected Void doInBackground(Integer... params) { int start=params[0]; for(int i=start;i<=100;i+=5){ try { boolean cancelled=isCancelled(); if(!cancelled) { publishProgress(i); Log.v("Progress","increment " + i); //onProgressUpdate(i); SystemClock.sleep(1000); } createPDF(); } catch (Exception e) { Log.e("Error", e.toString()); } } return null; } protected void onProgressUpdate(Integer... values) { // increment progress bar by progress value //setProgress(10); } protected void onPostExecute(Void result) { // async task finished Log.v("Progress", "Finished"); viewPDF(); } } public void showProgress() { task = new ProgressTask(); // start progress bar with initial progress 10 ///////////////////task.execute(10,10,null); task.execute(10); } } 

这段代码将使用AsyncTask执行您想要的操作,这是建议的方式!

 private class MakePDF extends AsyncTask { private ProgressDialog processingDialog; Context cnt = null; MakePDF(Context cnt) { this.cnt = cnt; } @Override protected void onPreExecute() { super.onPreExecute(); processingDialog = ProgressDialog.show( this.cnt, "Creating PDF", "Please wait ...", true, false); } @Override protected Void doInBackground(Void... arg0) { createPDF(); return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); processingDialog.dismiss(); viewPDF(); } } 

现在使用上面的AsyncTask调用

 new MakePDF(ActivityName.this).execute(); //here in constructor pass context of an calling activity. 

来自您的活动课程

在Fragment中定义ProgressDialog ,如下所示。 以下代码将添加ProgessDialog ; 要更新它以显示进度条,请阅读此内容 。

 private ProgressDialog processingDialog; 

现在,在你的onClick()

 mButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { processingDialog = ProgressDialog.show(this, "Creating PDF", "Please wait ...", true, false); createPDF(); processingDialog.dismiss(); viewPDF(); } }); 

这应该可以完成任务,但是,我还有一些建议。 由于创建PDF(我假设)将非常耗时,因此在UI线程上执行它可能不是一个好主意。 相反,使用AsyncTaskdoInBackground()生成PDF,显示ProgressDialog ,最后在onPostExecute() dismiss()onPostExecute()