Làm cách nào để hiển thị Toast thư từ một chuỗi?Android: Bánh mì nướng trong một chủ đề
Trả lời
Bạn có thể làm điều đó bằng cách gọi một runOnUiThread
phương pháp Activity
's từ chủ đề của bạn:
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
}
});
rất hữu ích thx – Joel
Tôi không chắc mình hiểu cách thực hiện điều này. Tôi đã có khoảng trống công khai hiện tại của tôi(). Tôi đã thử đặt mã này ở đó. Tôi biết điều đó không đúng vì nó không hoạt động, nhưng tôi thực sự bị mắc kẹt. – SwimBikeRun
Có phải "hoạt động" được chuyển tới luồng không phải là ui trong hàm khởi tạo của nó không? Cách đúng để lấy đối tượng hoạt động mà bạn đang sử dụng từ bên trong chuỗi riêng biệt là gì? – snapfractalpop
Giống như this hoặc this, với Runnable
hiển thị số Toast
. Cụ thể,
Activity activity = // reference to an Activity
// or
View view = // reference to a View
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
showToast(activity);
}
});
// or
view.post(new Runnable() {
@Override
public void run() {
showToast(view.getContext());
}
});
private void showToast(Context ctx) {
Toast.makeText(ctx, "Hi!", Toast.LENGTH_SHORT).show();
}
Tôi muốn có một phương pháp trong hoạt động của tôi gọi showToast
mà tôi có thể gọi từ bất cứ nơi nào ...
public void showToast(final String toast)
{
runOnUiThread(new Runnable() {
public void run()
{
Toast.makeText(MyActivity.this, toast, Toast.LENGTH_SHORT).show();
}
});
}
Sau đó tôi thường gọi nó từ bên trong MyActivity
trên bất kỳ chủ đề nào như thế này ...
showToast(getString(R.string.MyMessage));
Cảm ơn, tôi đang thêm hoạt động này nhiều nhất hiện nay. –
Đối với TOAST, luôn sử dụng Ngữ cảnh ứng dụng chứ không phải ngữ cảnh hoạt động! –
@YoushaAleayoub tại sao? – OneWorld
Bạn có thể sử dụng Looper
để gửi tin nhắn Toast
. Đi qua số này link để biết thêm chi tiết.
public void showToastInThread(final Context context,final String str){
Looper.prepare();
MessageQueue queue = Looper.myQueue();
queue.addIdleHandler(new IdleHandler() {
int mReqCount = 0;
@Override
public boolean queueIdle() {
if (++mReqCount == 2) {
Looper.myLooper().quit();
return false;
} else
return true;
}
});
Toast.makeText(context, str,Toast.LENGTH_LONG).show();
Looper.loop();
}
và nó được gọi trong chủ đề của bạn. Bối cảnh có thể là Activity.getContext()
nhận được từ Activity
bạn phải hiển thị bánh mì nướng.
Điều này tương tự như các câu trả lời khác, tuy nhiên được cập nhật cho apis mới có sẵn và sạch hơn nhiều. Ngoài ra, không cho rằng bạn đang ở trong một bối cảnh hoạt động.
public class MyService extends AnyContextSubclass {
public void postToastMessage(final String message) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show();
}
});
}
}
- Nhận dụ UI Chủ đề Handler và sử dụng
handler.sendMessage();
- Gọi
post()
phương pháphandler.post();
runOnUiThread()
view.post()
Một cách tiếp cận mà làm việc từ bất cứ đâu, kể cả từ những nơi nơi bạn don 'T có một Activity
hoặc View
, là để lấy một Handler
đến các chủ đề chính và hiển thị các bánh mì nướng:
public void toast(final Context context, final String text) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
Toast.makeText(context, text, Toast.DURATION_LONG).show();
}
})
}
Ưu điểm của phương pháp này là nó hoạt động với bất kỳ Context
, bao gồm Service
và Application
.
Đôi khi, bạn phải gửi thư từ một số khác Thread
đến chuỗi giao diện người dùng. Loại kịch bản này xảy ra khi bạn không thể thực thi các hoạt động Mạng/IO trên luồng giao diện người dùng.
Dưới đây ví dụ xử lý trường hợp đó.
- Bạn có UI Chủ đề
- Bạn phải bắt đầu hoạt động IO và vì thế bạn không thể chạy
Runnable
trên thread UI.Vì vậy, hãy đăng sốRunnable
của bạn để xử lý trênHandlerThread
- Lấy kết quả từ
Runnable
và gửi lại cho chuỗi giao diện người dùng và hiển thị thông báoToast
.
Giải pháp:
- Tạo một HandlerThread và bắt đầu nó
- Tạo một Handler với Looper từ
HandlerThread
:requestHandler
- Tạo một Handler với Looper từ chủ đề chính:
responseHandler
và ghi đèhandleMessage
phương pháp post
một nhiệm vụRunnable
vàorequestHandler
- Bên
Runnable
nhiệm vụ, hãy gọisendMessage
trênresponseHandler
- này gọi
sendMessage
kết quả củahandleMessage
trongresponseHandler
. - Nhận thuộc tính từ
Message
và xử lý nó, cập nhật giao diện người dùng
Mẫu mã:
/* Handler thread */
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler requestHandler = new Handler(handlerThread.getLooper());
final Handler responseHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
//txtView.setText((String) msg.obj);
Toast.makeText(MainActivity.this,
"Runnable on HandlerThread is completed and got result:"+(String)msg.obj,
Toast.LENGTH_LONG)
.show();
}
};
for (int i=0; i<5; i++) {
Runnable myRunnable = new Runnable() {
@Override
public void run() {
try {
/* Add your business logic here and construct the
Messgae which should be handled in UI thread. For
example sake, just sending a simple Text here*/
String text = "" + (++rId);
Message msg = new Message();
msg.obj = text.toString();
responseHandler.sendMessage(msg);
System.out.println(text.toString());
} catch (Exception err) {
err.printStackTrace();
}
}
};
requestHandler.post(myRunnable);
}
bài viết hữu ích:
handlerthreads-and-why-you-should-be-using-them-in-your-android-apps
tôi ma theo phương pháp này dựa trên câu trả lời của mjaggard:
public static void toastAnywhere(final String text) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
public void run() {
Toast.makeText(SuperApplication.getInstance().getApplicationContext(), text,
Toast.LENGTH_LONG).show();
}
});
}
Làm việc tốt cho tôi.
- 1. Cách đặt kiểu bánh mì nướng làm chủ đề?
- 2. Android Rung trên bánh mì nướng (Homer: Mmmm rung trên bánh mì nướng)
- 3. Android: Thông báo bánh mì nướng tùy chỉnh Thừa kế bánh mì nướng mặc định
- 4. Văn bản trung tâm trong bánh mì nướng trong Android
- 5. Android giống như bánh mì nướng trong Swing
- 6. Cách tùy chỉnh bánh mì nướng trong Android
- 7. Thông báo bánh mì nướng của Android quá nhỏ trong Bánh kem Sandwich
- 8. Phát hiện tin nhắn bánh mì nướng
- 9. Thay đổi Phông chữ Bánh mì nướng
- 10. Thêm hình ảnh vào Bánh mì nướng?
- 11. lỗi khi hiển thị bánh mì nướng
- 12. Bánh mì nướng Android sẽ không biến mất
- 13. Nền bánh mì nướng thay đổi để khớp với Chủ đề của Hoạt động
- 14. Bắt sự kiện bánh mì nướng (từ bất kỳ ứng dụng nào) và nhận tin nhắn bánh mì nướng
- 15. Cách hiển thị thông báo bánh mì nướng từ chủ đề nền
- 16. Kích thước bánh mì nướng trên Galaxy Nexus
- 17. Cách hiển thị bánh mì nướng trong AsyncTask tại doInBackground
- 18. Tạo thông báo "bánh mì nướng" như StackOverflow
- 19. Khung bánh mì trong suốt
- 20. Hiển thị bánh mì nướng phức tạp từ BroadcastReceiver
- 21. Đặt Bánh mì nướng Xuất hiện Chiều dài
- 22. Thời lượng của Bánh mì nướng LENGTH_LONG và LENGTH_SHORT
- 23. Cách tốt nhất để tránh tích lũy bánh mì nướng trong Android
- 24. Làm thế nào để thay đổi vị trí của bánh mì nướng trong Android?
- 25. Android: Hiển thị bánh mì nướng sau khi hoàn thành ứng dụng/hoạt động
- 26. Android: Cách thích hợp để sử dụng onBackPressed() với Bánh mì nướng
- 27. WP7: Làm thế nào để hiển thị một bánh mì nướng?
- 28. Android: Có cách nào tốt để tạo hộp thoại giống như bánh mì nướng không?
- 29. Bánh mì nướng Android bắt đầu từ Dịch vụ chỉ hiển thị khi
- 30. Màu mặc định của bánh mì nướng của Android và alpha
[Điều này] (http://stackoverflow.com/a/16886486/1919641) trả lời chi tiết câu hỏi. – mjosh
câu trả lời này cung cấp giải pháp ngắn nhất: http://stackoverflow.com/a/18280318/1891118 –