自定义Android Toast中的button?

Toast中可以有一个button吗?

从理论上讲,是的,因为你可以从一个XML格式的布局构build一个自定义Toast,但是我试图在其中放一个button,并且不能注册点击。 有没有人设法做这样的事情?

敬酒不能被点击。 在吐司消息中捕获点击是不可能的。 你将需要build立一个对话框。 查看创build对话框了解更多信息。

Toast类的API声明一个toast永远不会获得焦点,因为toast不是一个视图,所以没有onClick消息。 我会认为,所以敬酒的孩子也不能点击。

吐司不能包含一个button。 除了果冻豆的gmail应用程序和图库应用程序有一个半button,其中包含一个button,这是谷歌如何做到这一点

https://gist.github.com/benvd/4090998

我想这回答你的问题。

摘录显示了自定义Toast的实现:

头

  • 与原来的Toast类具有相似的界面
  • 可以用作Dialog (有可点击的button,如Gmail应用程序)
  • 有可能设定millis length
  • 有可能设置显示和取消animation
  • 生活只与初始化的Activity

目前的限制:

  • 不支持屏幕方向更改

用法:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //... View toastView = new View(getBaseContext()); //init your toast view ActivityToast toast = new ActivityToast(this, toastView); //set toast Gravity ( Gravity.BOTTOM | Gravity.FILL_HORIZONTAL by default) toast.setGravity(Gravity.CENTER); toast.setLength(10000); //set toast show duration to 10 seconds (2 seconds by default) Animation showAnim; // init animation Animation.AnimationListener showAnimListener; //init anim listener toast.setShowAnimation(showAnim); toast.setShowAnimationListener(showAnimListener); Animation cancelAnim; // init animation Animation.AnimationListener cancelAnimListener; //init anim listener toast.setCancelAnimation(showAnim); toast.setCancelAnimationListener(showAnimListener); toast.show(); //show toast view toast.isShowing(); // check if toast is showing now toast.cancel(); //cancel toast view toast.getView(); //get toast view to update it or to do something .. } 

来源

 import android.app.Activity; import android.os.Handler; import android.support.annotation.NonNull; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.FrameLayout; public class ActivityToast { public static final long LENGTH_SHORT = 2000; public static final long LENGTH_LONG = 3000; public static final int DEFAULT_ANIMATION_DURATION = 400; private final Activity mActivity; private FrameLayout.LayoutParams mLayoutParams; private Handler mHandler = new Handler(); private ViewGroup mParent; private FrameLayout mToastHolder; private View mToastView; private Animation mShowAnimation; private Animation mCancelAnimation; private long mLength = LENGTH_SHORT; private Animation.AnimationListener mShowAnimationListener; private Animation.AnimationListener mCancelAnimationListener; private boolean mIsAnimationRunning; private boolean mIsShown; /** * @param activity Toast will be shown at top of the widow of this Activity */ public ActivityToast(@NonNull Activity activity, View toastView) { mActivity = activity; mParent = (ViewGroup) activity.getWindow().getDecorView(); mToastHolder = new FrameLayout(activity.getBaseContext()); mLayoutParams = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.FILL_HORIZONTAL ); mToastHolder.setLayoutParams(mLayoutParams); mShowAnimation = new AlphaAnimation(0.0f, 1.0f); mShowAnimation.setDuration(DEFAULT_ANIMATION_DURATION); mShowAnimation.setAnimationListener(mHiddenShowListener); mCancelAnimation = new AlphaAnimation(1.0f, 0.0f); mCancelAnimation.setDuration(DEFAULT_ANIMATION_DURATION); mCancelAnimation.setAnimationListener(mHiddenCancelListener); mToastView = toastView; mToastHolder.addView(mToastView); mToastHolder.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { cancel(); } return false; } }); } public void show() { if (!isShowing()) { mParent.addView(mToastHolder); mIsShown = true; if (mShowAnimation != null) { mToastHolder.startAnimation(mShowAnimation); } else { mHandler.postDelayed(mCancelTask, mLength); } } } public void cancel() { if (isShowing() && !mIsAnimationRunning) { if (mCancelAnimation != null) { mToastHolder.startAnimation(mCancelAnimation); } else { mParent.removeView(mToastHolder); mHandler.removeCallbacks(mCancelTask); mIsShown = false; } } } public boolean isShowing() { return mIsShown; } /** * Pay attention that Action bars is the part of Activity window * * @param gravity Position of view in Activity window */ public void setGravity(int gravity) { mLayoutParams.gravity = gravity; if (isShowing()) { mToastHolder.requestLayout(); } } public void setShowAnimation(Animation showAnimation) { mShowAnimation = showAnimation; } public void setCancelAnimation(Animation cancelAnimation) { mCancelAnimation = cancelAnimation; } /** * @param cancelAnimationListener cancel toast animation. Note: you should use this instead of * Animation.setOnAnimationListener(); */ public void setCancelAnimationListener(Animation.AnimationListener cancelAnimationListener) { mCancelAnimationListener = cancelAnimationListener; } /** * @param showAnimationListener show toast animation. Note: you should use this instead of * Animation.setOnAnimationListener(); */ public void setShowAnimationListener(Animation.AnimationListener showAnimationListener) { mShowAnimationListener = showAnimationListener; } public void setLength(long length) { mLength = length; } public View getView() { return mToastView; } private Runnable mCancelTask = new Runnable() { @Override public void run() { cancel(); } }; private Animation.AnimationListener mHiddenShowListener = new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (mShowAnimationListener != null) { mShowAnimationListener.onAnimationStart(animation); } mIsAnimationRunning = true; } @Override public void onAnimationEnd(Animation animation) { mHandler.postDelayed(mCancelTask, mLength); if (mShowAnimationListener != null) { mShowAnimationListener.onAnimationEnd(animation); } mIsAnimationRunning = false; } @Override public void onAnimationRepeat(Animation animation) { if (mShowAnimationListener != null) { mShowAnimationListener.onAnimationRepeat(animation); } } }; private Animation.AnimationListener mHiddenCancelListener = new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { if (mCancelAnimationListener != null) { mCancelAnimationListener.onAnimationStart(animation); } mIsAnimationRunning = true; } @Override public void onAnimationEnd(Animation animation) { mParent.removeView(mToastHolder); mHandler.removeCallbacks(mCancelTask); if (mCancelAnimationListener != null) { mCancelAnimationListener.onAnimationEnd(animation); } mIsAnimationRunning = false; mIsShown = false; } @Override public void onAnimationRepeat(Animation animation) { if (mCancelAnimationListener != null) { mCancelAnimationListener.onAnimationRepeat(animation); } } }; } 

我在github上的原始文章
在这篇文章中显示自定义布局的实现

传递给吐司的自定义视图可以包含任何东西; 然而,吐司不能接收任何触摸事件,因此没有使用触摸事件的组件将在股票吐司(button,单选button等)中工作。 您唯一的select是使用button创build自定义视图并将其添加到您的布局。 有很多这样的例子,以及一些图书馆,你可以看看其他人在做什么。

UndoBar
MessageBar
努里克的UndoBar

当然,也欢迎您使用我放在一起的SuperToasts库,但是对于一个用法可能有点矫枉过正。 我在SuperActivityToast类中概述了这一点 。

在这种情况下,您可以尝试SuperToast 。 它可以创buildbutton的烤面包。 它具有自定义持续时间function,丰富多彩的背景,丰富多彩的字体,自定义字体,animation效果。 希望你会喜欢它

使用警报箱,如果你想添加一个button:-)。 以下是Android中的一些对话框示例

创build一个系统覆盖窗口(总在最上面)

这是暗示它可以做到,我也需要在烤面包的button,所以我仍然有自己的实施。 如果我发现更多,我会将其添加到我的post

你应该使用Snackbar 。 这是在最新的Android支持库(在答案的时候),并与旧的API级别兼容。 与Dialog或自定义View相比,实现起来要容易得多,并且能够拥有不同于Toast的button。

  1. SDK Manager (修订版本22.2.1或更高版本)的Extras中下载Android Support Library
  2. build.gradle添加这个类的依赖关系: com.android.support:design:22.2.0 : build.gradle : com.android.support:design:22.2.0
  3. 实行:

    Snackbar.make(this.findViewById(android.R.id.content), "Toast Message", Snackbar.LENGTH_LONG) .setAction("Click here to activate action", onClickListener) .setActionTextColor(Color.RED) .show;

就是这样。 没有github项目和实施是非常类似于Toast 。 我在我的一个项目中使用它,它很好。