2011-09-30 9 views

Trả lời

42

Bạn làm điều đó chỉ đơn giản bằng cách tạo một Thread kéo dài miễn là Toast được hiển thị và sau đó bạn có thể hoàn tất Activity.

public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      // your other stuff 
      Toast.makeText(this,"This is a Toast", Toast.LENGTH_LONG).show(); 
      thread.start(); 
} 

Bây giờ tạo ra một chủ đề mà chờ (LENGTH_LONG = 3,5) hoặc (LENGTH_SHORT = 2) giây

Thread thread = new Thread(){ 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(3500); // As I am using LENGTH_LONG in Toast 
        Your_Activity.this.finish(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      }; 
+2

Tuyệt vời! Thx :) Vì vậy, bạn chỉ có thể thêm Toast.LENGTH_LONG vào phương thức ngủ thay vào đó, để có kết quả khớp chính xác –

+0

RIP cho những người bị bỏ phiếu mà không đề cập đến lý do :) –

9

android.widget.Toast không cung cấp bất kỳ người nghe nào để thông báo khi nào nó kết thúc.

Bạn có thể gọi Toast.getDuration() để biết nó sẽ kéo dài bao lâu và tạo TimerTask của riêng bạn để chạy vào thời điểm Nướng bánh mì biến mất và thực hiện các tác vụ của bạn ở đó.

1

Tôi không chắc bạn có thể làm điều này với bánh mì nướng, tuy nhiên, bạn có thể thay thế bánh mì nướng bằng một hộp thoại đơn giản (và sử dụng lại thiết kế bánh mì nướng nếu bạn muốn), và sau đó bạn có thể sử dụng các phương pháp như onDetachedFromWindow để móc đóng cửa hoạt động vào cửa sổ.

2

Thực tế không có gọi lại khi Toast đang được hoàn thành, nhưng nếu bạn cần biết, khi nào nó sẽ đóng, bạn có thể bắt đầu chuỗi nền sẽ ngủ một số mili giây bằng thời lượng Toast và sau đó thực hiện thao tác cần thiết. Đây chỉ là một cách để giải quyết vấn đề, tôi chắc chắn có nhiều giải pháp hơn. Hi vọng điêu nay co ich.

7

Có, nhưng đây là một cách lừa

Android Toast không có một cách để thiết lập một cuộc gọi lại sau khi nó kết thúc.

Vì vậy, những gì bạn có thể làm là dựa trên thực tế

private static final int LONG_DELAY = 3500; // 3.5 seconds 
private static final int SHORT_DELAY = 2000; // 2 seconds 

bây giờ điều này bạn có thể làm:

  1. Thiết lập các bánh mì nướng
  2. Thiết lập một sợi truy cập dựa trên LENGTH_LONG (3,5 s) hoặc LENGTH_SHORT (2s) để đóng hoạt động.
  3. toast.show() và thread.start();
+0

Đừng làm cho các giả định về sự chậm trễ ! Đây có thể thay đổi trong phiên bản API khác nhau. –

+0

Tôi biết, nhưng đó là cách duy nhất để làm những gì anh ta muốn bây giờ. –

+2

Có thể bạn đã đúng, getDuration chỉ trả về LENGTH_SHORT hoặc LENGTH_LONG, là hằng số 0/1. Không phải thời gian thực trong ms. –

0

Afaik API INotificationManager (được sử dụng dưới mui xe của lớp bánh mì nướng) không có bất kỳ sự hỗ trợ nào để thông báo cho người gọi khi nó đóng bánh mì nướng.

Cũng không có cách nào để kiểm tra xem Bánh mì nướng có đang hiển thị hoặc ẩn mà không sử dụng phản chiếu để chọn lớp bên trong đại diện cho thông báo tạm thời.

0

Bạn gọi bánh mì nướng, kết thúc bằng cách sử dụng Onstop(). Bánh mì nướng của bạn bây giờ sẽ xuất hiện.

0

Mở rộng Lớp bánh mì nướng và sử dụng Gọi lại của riêng bạn.

+0

hmmm .. một số chi tiết khác? – Tima

+0

đừng nghĩ rằng đây là một lựa chọn ... Bánh mì nướng sử dụng INotificationManager, vì vậy không có cách nào để thông báo cho người gọi. –

2

Đây là cách tôi làm điều đó ...

Lưu ý rằng điều này lớp học bao gồm một cuộc gọi để đóng hoạt động gọi nó. Bạn có thể lấy nó ra nếu cần.

Ngoài ra, lưu ý rằng thời gian ngủ theo dõi thời gian bánh mì nướng, nhưng tôi đã thêm một nửa giây nữa để tạo ra một chút lợi nhuận trước khi hoạt động kết thúc.

public class Toaster implements Runnable 
{ 
Context   theContext; 
CharSequence theMessage; 
int    theDuration; 
Activity  theActivity; 

public Toaster(Activity a, Context c, CharSequence s, int i) 
{ 
    theActivity = a; 
    theContext = c; 
    theMessage = s; 
    theDuration = i; 
} 

@Override 
public void run() 
{ 
    Toast toast = Toast.makeText(theContext, theMessage, theDuration); 
    toast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 0); 
    toast.show(); 

    Thread t = new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      try 
      { 
       Thread.sleep(theDuration == Toast.LENGTH_SHORT ? 2500 : 4000); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 

      theActivity.finish(); 
     } 

    }); 
    t.start(); 
} 
} 

Trong hoạt động này, có một đoạn mã mà trông như thế này, gọi nó là:

Context c = getApplicationContext(); 
    CharSequence msg = "Form Data Submitted!"; 
    int duration = Toast.LENGTH_SHORT; 

    runOnUiThread(new Toaster(this, c, msg, duration)); 
0

Tôi không chắc chắn những gì trường hợp sử dụng của bạn, nhưng bạn có thực sự cần phải chờ đợi cho bánh mì nướng để kết thúc hoạt động của bạn?

Trong trường hợp của tôi, tôi có một hoạt động là một điểm vào ứng dụng từ một url (cho phép ứng dụng được mở từ liên kết trong email hoặc trên trang web). Nếu url không vượt qua một kiểm tra xác nhận, tôi thấy một bánh mì nướng và kết thúc hoạt động:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ... 

    if (!validateUrl()) { 
     Toast.makeText(this, R.string.invalid_url, Toast.LENGTH_LONG).show(); 
     finish(); 
     return; 
    } 
    ... 
} 

Điều này cho thấy bánh mì nướng và tôi không cần phải chờ đợi cho đến khi nó không còn hiển thị trước khi gọi kết thúc(). Ban đầu, tôi nghĩ điều này không hiệu quả, nhưng sau đó tôi phát hiện ra đó là vì tôi quên gọi show() trên bánh mì nướng!

11

Trước tiên, màn hình sẽ hiển thị Toast sau 2 giây, nó sẽ hoàn thành activity của bạn.

Toast.makeText(YourActivity.this, "MESSAGE", Toast.LENGTH_SHORT).show(); 

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     YourActivity.this.finish(); 
    } 
}, 2000); 
1

Tôi đã chỉ cần thực hiện một thư viện đơn giản cho rằng "vấn đề" Download:

https://github.com/mkiisoft/Toaster

và sử dụng nó theo cách này:

Toaster.getInstance().makeText(context, "your custom message", Toast.LENGTH_SHORT, new OnToasterFinish() { 
       @Override 
       public void finish() { 
        // Your code over here after the Toast 
       } 
      });