开发者

Android- Making Toast clickable

I want to make toast click able or a UI element whi开发者_JAVA百科ch will have clickable button but behaves like toast. It should not run on UI thread like toast. It should not halt or overlay current user activity, message should come like toast with clickable button and vanish but as toast user should be able to access background ongoing UI item.

If any one has any idea about how to achieve this pls share with me.


Little trick. Tested working Android 4.4

toast = new Toast(context);
try {
    Class<?> clazz = Class.forName("android.widget.Toast");
    Method method = clazz.getDeclaredMethod("getWindowParams");
    WindowManager.LayoutParams param = (WindowManager.LayoutParams) method.invoke(toast);
    param.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
} catch (Exception e) {
    e.printStackTrace();
}


The Gmail undo bar is the best suitable for you, its just like a toast with a button. Here is a code implementation for it.

http://code.google.com/p/romannurik-code/source/browse/misc/undobar/src/com/example/android/undobar/UndoBarController.java


I had a similar requirement that I solved using a PopupWindow. Basically, I had an about window with a clickable link that I wanted displayed like a toast. The popup window can accomplish this as follows:

In the parent class, I use the following flag:

private boolean durationExpired = false;

Then, when I invoke what would have been the toast, I do the following instead:

LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.about_hiittimer,
    (ViewGroup) findViewById(R.id.about_hiittimer));
TextView url = (TextView) layout.findViewById(R.id.url);
url.setMovementMethod(LinkMovementMethod.getInstance());

final PopupWindow popupWindow = new PopupWindow(layout, 280, 160, false);
popupWindow.showAtLocation(layout, 17, 0, 0);
popupWindow.setTouchable(true);
popupWindow.setOutsideTouchable(true);

final Handler popupHandler = new Handler();
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        if (!durationExpired) {
            durationExpired = true;
            popupHandler.postDelayed(this, 2000);
        } else {
            popupWindow.dismiss();
            popupHandler.removeCallbacks(this);
            durationExpired = false;
        }
    }
});


Put your main layout inside a FrameLayout. Write a layout for your toast, with the button and all, insert it into the FrameLayout (below your main layout) and set its visibility to GONE.

When you show it (setting visibility to VISIBLE) start a new thread that counts down the seconds till its dismissed. Set it back to invisible from the thread via a Handler (cause all UI elements can only be managed from the main thread).

cheers!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜