美文网首页自定义views
Android 自定义Toast实现多次触发只会显示一次toas

Android 自定义Toast实现多次触发只会显示一次toas

作者: wuden | 来源:发表于2017-01-11 22:26 被阅读3238次

    使用场景描述

    当我们处于某个场景,例如一个按钮可以触发toast的显示,当你在多次点击按钮时,会多次触发toast的显示。而调用android原生的toast的makeText的方式所生产的toast是被加到一个队列里面,然后依次执行。这样就会出现多次点击按钮触发的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
        }
    }
    

    相关文章

      网友评论

        本文标题:Android 自定义Toast实现多次触发只会显示一次toas

        本文链接:https://www.haomeiwen.com/subject/zxrrbttx.html