Có ai biết, nếu có khả năng làm điều gì đó (trong trường hợp của tôi kết thúc hoạt động) trên tin nhắn bánh mì nướng sẽ được đóng lại?Kết thúc hoạt động sau khi thông báo bánh mì nướng biến mất?
Trả lời
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();
}
}
};
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 ở đó.
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ổ.
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.
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:
- Thiết lập các bánh mì nướng
- 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.
- toast.show() và thread.start();
Đừ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. –
Tôi biết, nhưng đó là cách duy nhất để làm những gì anh ta muốn bây giờ. –
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. –
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.
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.
Mở rộng Lớp bánh mì nướng và sử dụng Gọi lại của riêng bạn.
hmmm .. một số chi tiết khác? – Tima
đừ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. –
Đâ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));
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!
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);
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
}
});
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 –
RIP cho những người bị bỏ phiếu mà không đề cập đến lý do :) –