2010-05-09 40 views
35

Tôi đang cố tạo ProgressDialog cho Ứng dụng Android (chỉ đơn giản là hiển thị cho người dùng biết nội dung đang diễn ra, không có nút hoặc bất kỳ thứ gì) nhưng tôi không thể làm đúng. Tôi đã thông qua các diễn đàn và hướng dẫn cũng như Mẫu mã đi kèm với SDK nhưng không có kết quả.Android: ProgressDialog không hiển thị

Đây là những gì tôi nhận:

btnSubmit.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
     (...) 
      ProgressDialog pd = new ProgressDialog(MyApp.this); 
      pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pd.setMessage("Working..."); 
      pd.setIndeterminate(true); 
      pd.setCancelable(false); 

      // now fetch the results 
      (...long time calculations here...) 

      // remove progress dialog 
      pd.dismiss(); 

Tôi cũng đã thử thêm pd.show(); và sai lầm xung quanh với các tham số trong new ProgressDialog kết quả là không có gì cả (trừ lỗi mà các tham số lựa chọn sẽ không làm việc), có nghĩa là: ProgressDialog sẽ không bao giờ xuất hiện. Ứng dụng chỉ tiếp tục chạy như thể tôi chưa bao giờ thêm hộp thoại.

Tôi không biết liệu tôi có đang tạo hộp thoại ở đúng vị trí hay không, tôi đã di chuyển nó một chút nhưng điều đó cũng không giúp được gì. Có lẽ tôi đang ở trong bối cảnh sai? Mã trên nằm bên trong private ViewGroup _createInputForm() trong MyApp.

Bất kỳ gợi ý nào được đánh giá cao,

Trả lời

39

bạn phải gọi pd.show trước khi bắt đầu tính toán dài và sau đó tính toán phải chạy trong một chuỗi riêng biệt. Một khi thread này kết thúc, bạn phải gọi pd.dismiss() để đóng hộp thoại prgoress.

đây bạn có thể thấy một ví dụ:

các progressdialog được tạo ra và hiển thị và một sợi được gọi là để chạy một tính nặng:

@Override 
    public void onClick(View v) { 
     pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false); 
     Search search = new Search( ... ); 
     SearchThread searchThread = new SearchThread(search); 
     searchThread.start(); 
    } 

và đây thread:

private class SearchThread extends Thread { 

     private Search search; 

     public SearchThread(Search search) { 
      this.search = search; 
     } 

     @Override 
     public void run() {   
      search.search(); 
      handler.sendEmptyMessage(0); 
     } 

     private Handler handler = new Handler() { 

      @Override 
      public void handleMessage(Message msg) { 
       displaySearchResults(search); 
       pd.dismiss(); 
      } 
     }; 
    } 
+0

Tôi đã xây dựng lại ứng dụng của mình để hoàn thành công việc này :) Các hướng dẫn tôi đọc có vẻ như có thể không có chuỗi khác, nhưng bạn không bao giờ ngừng học. Tôi không làm hoàn toàn: bây giờ ProgressDialog không cho thấy nơi nó nên (ít nhất là nó cho thấy!), Nhưng chỉ "nhấp nháy" ngay trước khi kết quả đi vào, nhưng bây giờ tôi nghĩ rằng tôi có thể làm phần còn lại của riêng tôi;) Cảm ơn sự giúp đỡ của bạn! – Select0r

+2

Chỉ cần hoàn thành điều này, trong trường hợp ai đó quan tâm: "nhấp nháy" của ProgressDialog là cái gì đó chỉ xảy ra trong trình mô phỏng, nó không xảy ra trên thiết bị thực tế. Dường như giả lập mất vài giây trước khi yêu cầu (onClick) thực sự được xử lý và ứng dụng bị đóng băng cho đến khi điều đó xảy ra. Trên thiết bị, mọi thứ đều ổn. – Select0r

+2

tại sao chúng ta không sử dụng pd = new ProgressDialog (điều này); pd.show() ;? – Emerald214

24

Tôi đang cung cấp cho bạn một giải pháp cho nó, Hãy thử điều này .... Đầu tiên xác định Hộp thoại tiến trình trong hoạt động trước khi onCreate() phương pháp.

riêng tiến trình ProgressDialogDialog;

Bây giờ trong phương pháp oncreate, bạn có thể có nút Bất kỳ nhấp vào đó u sẽ thay đổi Activit trên bất kỳ hành động nào. Chỉ cần đặt Thanh tiến trình ở đó.

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading..."); 

Bây giờ Sử dụng thread để Hamndle ProgressBar để hiển thị và ẩn

new Thread() 
{ 
    public void run() 
    { 

    try 
     { 
     sleep(1500); 

    // do the background process or any work that takes time to see progreaa dialog 

     } 
    catch (Exception e) 
    { 
     Log.e("tag",e.getMessage()); 
    } 
// dismiss the progressdialog 
    progressDialog.dismiss(); 
} 
}.start(); 

Thats tất cả!

+0

Hiển thị tiến trình của nóDialog hoàn hảo. Nhưng bối cảnh của tôi hơi khác. Tôi muốn hiển thị progressDialog khi chuyển từ ứng dụng này sang ứng dụng khác và muốn tránh bị xóa. Có thể không? – YuDroid

3

Điều này cũng có thể bằng cách sử dụng AsyncTask. Lớp này tạo ra một chủ đề cho bạn. Bạn nên phân lớp và điền vào phương thức doInBackground(...).

4

Hộp thoại tiến trình không hiển thị vì bạn phải sử dụng một chuỗi được phân tách. Các phương pháp hay nhất trong Android là sử dụng AsyncTask (được khuyến nghị). Xem thêm điều này answer.

Các vấn đề liên quan