自定义Toast实现多次触发只显示一次toast使用改良

原创 2017年05月26日 09:09:12

使用场景描述

当我们处于某个场景,例如一个按钮可以触发toast的显示,当你在多次点击按钮时,会多次触发toast的显示。而调用android原生的toast的makeText的方式所生产的toast是被加到一个队列里面,然后依次执行。这样就会出现多次点击按钮触发的toast一直会按队列出现在界面上,而且即使退出了当前界面也会一直出现在手机上,而且无法手动取消,这时的用户体验变得非常的差。这时就可以使用自定义样式的toast。

自定义toast的好处

1.多次触发也只显示一个toast,只是把toast的内容替换成最新一次触发需要显示的内容。

2.可以手动取消toast的显示(不过这个取消还是会带有一点延迟效果,不是马上就消失,而是渐渐的消失,该功能主要是通过单例来实现,一直保持只有一个toast实例,这样在调用cancel方法时就能把toast给取消掉。)

3.可以自定义toast的样式,这样就可以做到定制的效果。

使用方法

1.将自定义toast引入你们的工程中,以下是toast的源码。

public enum  CustomToast {
    INSTANCE;// 实现单例
    private Toast mToast;
    private TextView mTvToast;
    public void showToast(Context ctx, String content) {
        if (mToast == null) {
            mToast = new Toast(ctx);
            mToast.setGravity(Gravity.CENTER, 0, 0);//设置toast显示的位置,这是居中
            mToast.setDuration(Toast.LENGTH_SHORT);//设置toast显示的时长
            View _root = LayoutInflater.from(ctx).inflate(R.layout.toast_custom_common, null);//自定义样式,自定义布局文件
            mTvToast = (TextView) _root.findViewById(R.id.tvCustomToast);
            mToast.setView(_root);//设置自定义的view 
       }
        mTvToast.setText(content);//设置文本
        mToast.show();//展示toast
    }
    public void showToast(Context ctx, int stringId) {
        showToast(ctx, ctx.getString(stringId));
    }
    public void cancelToast() {
        if (mToast != null) {
            mToast.cancel();
            mToast = null;
            mTvToast = null;
        }
    }
}

2.需要的一些资源文件

1)自定义样式的布局toast_custom_common,完全可以按照自己的需求进行布局,以下是案例中的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tvCustomToast"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/toast_custom_common_bg"
        android:gravity="center"
        android:minWidth="200dp"
        android:padding="15dp"
        android:textColor="@color/colorBasicWhite"
        android:textSize="17sp" />
</LinearLayout>

2)资源文件
<color name="colorBasicWhite">#ffffff</color>
<color name="colorAutoDismissToast">#88000000</color>

//@drawable/toast_custom_common_bg
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp" />
    <solid android:color="@color/colorAutoDismissToast" />
</shape>

3.在你对应的页面中直接使用toast即可

public class TestCustomToastActivity extends AppCompatActivity {
    private int count = 0;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_custom_toast);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.btnShowToast,R.id.btnCancelToast})
    public void clickEvent(View v){
        switch (v.getId()){
            case R.id.btnShowToast:
                count++;
                CustomToast.INSTANCE.showToast(this,getString(R.string.custom_toast_click_number,count));
                break;
            case R.id.btnCancelToast:
                count = 0;
                CustomToast.INSTANCE.cancelToast();//可手动取消toast 
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        CustomToast.INSTANCE.cancelToast();//销毁页面时,取消掉toast
    }
}


这个命题已经有人做了,今天是做个小的调整,思路和代码如下:

Activity也好Context也罢,这么做总是需要destroy个人觉得非常麻烦

所以用Application的单例会简便很多。

CustomToast.INSTANCE.showToast(MyApplication.getInstance(),content);


以后调用不用考虑是哪个Activity,统一修改也方便

版权声明:本文为博主原创文章,未经博主允许不得转载。

android应用开发之多次触发toast的处理

场景:当一个比如listview多次点击toast,这时候会出现toast延迟的情况 处理:以最后一次toast为准处理 使用方法: private ToastUtils mToastUtils; ...
  • loovejava
  • loovejava
  • 2013年10月11日 21:34
  • 2961

关于toast的使用方法总结,程序同一时刻只有一个toast,和toast的样式设置。

工具类:app运行只会显示一个toast import android.content.Context; import android.widget.Toast; /**  * 只会显示一个t...
  • liu13722785488
  • liu13722785488
  • 2015年09月28日 18:07
  • 1263

连续点击按钮显示Toast,只显示最后一次

我们在使用Toast的时候,会遇到一些显示提示信息的地方,如果用户在使用的时候,没事点了好多次。那么要让Toast全显示完要很长时间。这时候我们怎么办呢。/** * 显示最后的Toast ...
  • chenguang79
  • chenguang79
  • 2016年10月08日 14:12
  • 1051

解决Toast不断显示问题

Toast是Android中用来显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点,而且Toast显示的时间有限,过一定的时间就会自动消失。 Toast一般用来提示用户的误操作。但是...
  • kakaxi1o1
  • kakaxi1o1
  • 2015年07月07日 17:46
  • 1691

自定义Toast实现多次触发只显示一次toast使用改良

使用场景描述 当我们处于某个场景,例如一个按钮可以触发toast的显示,当你在多次点击按钮时,会多次触发toast的显示。而调用android原生的toast的makeText的方式所生产的toas...
  • knockheart
  • knockheart
  • 2017年05月26日 09:09
  • 282

Toast普通,防止多次点击效果重复以及自定义

  • 2016年07月26日 10:47
  • 2.57MB
  • 下载

Android--Toast多次点击只显示一次

在日常开发中,相信不少朋友都经常接触到Toast,相信用法对初学者来说应该也不是问题了。一般来说,通常用到Toast都是用来给用户展示消息框提示信息。但是随着项目的庞大起来,我们每次在需要显示Toas...
  • Amanduzhuojiang
  • Amanduzhuojiang
  • 2017年07月26日 16:31
  • 730

Android Toast连续点击只弹一次

在Android开发中,我们经常会使用到Toast,但是在使用的过程中发现了一个问题,当对一个事件进行连续操作弹出Toast时,Toast会连续的显示,这种体验可能不是很恰当,应该只提示一次就行了。下...
  • qq2603825424
  • qq2603825424
  • 2015年09月06日 18:06
  • 3041

技术记录---Toast频繁弹出问题及其流程分析

Toast频繁显示的问题以及原理分析
  • ilygjl
  • ilygjl
  • 2016年04月11日 22:03
  • 571

Android中多次弹出相同Toast提示框长时间不消失

解决Android中多次弹出相同Toast提示框长时间不消失的问题        很多时候在我们开发的APP中都会有点击某个按钮弹出相应的Toast提示,但是总是避免不了用户重复的点击一个按...
  • qq_23179075
  • qq_23179075
  • 2016年09月01日 11:11
  • 1211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义Toast实现多次触发只显示一次toast使用改良
举报原因:
原因补充:

(最多只允许输入30个字)