Toast位置的自定义,解决多次点击toast多次显示的问题,Snackbar在底部移动出来的控件

public class MainActivity extends Activity {
    
    private Context context;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.context = MainActivity.this;
    }
    
    public void onShowToast(View v){
        switch (v.getId()) {
        case R.id.btn_toast://普通Toast
            Toast.makeText(context, "普通的toast", Toast.LENGTH_LONG).show();
            break;
        case R.id.btn_gravity_toast://设置Toast的位置
            Toast toast = Toast.makeText(context, "设置Toast的位置", Toast.LENGTH_LONG);
            //设置位置    参数1:表示设置toast的位置   参数2:表示相对参数1位置的x偏移量    参数3:表示相对参数1位置的Y偏移量
            toast.setGravity(Gravity.CENTER, 100, 0);
            toast.show();
            break;
        case R.id.btn_view_toast://设置自定义视图toast
            Toast toast2 = new Toast(context);
            
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            View view = layoutInflater.inflate(R.layout.toast_custom, null);
            TextView tvText = (TextView) view.findViewById(R.id.tv_text);
            tvText.setText("自定义的吐司");
            //设置自定义的视图
            toast2.setView(view);
            //设置持续时间
            toast2.setDuration(Toast.LENGTH_LONG);
            toast2.show();
            break;
        default:
            break;
        }        
    }
}

自定义toast使用到的布局文件:toast_custom.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center"
    android:background="#ffcccc">
     
    <ImageView 
       android:layout_width="40dp"
       android:layout_height="40dp"
        android:src="@drawable/f047"/>
    <TextView 
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="25sp"/>
</LinearLayout>

效果图:

    

Toast的微技巧: 解决Toast多次显示的问题

假设当我们点击一次按钮就显示一次吐司,但是如果是快速连续点击了五次按钮,Toast就触发了五次。这样的体验其实是不好的,因为也许用户是手抖了一下多点了几次,导致Toast就长时间关闭不掉了。又或者我们其实已在进行其他操作了,应该弹出新的Toast提示,而上一个Toast却还没显示结束。

解决方法:

public class Util {

        private static Toast toast;

        /**
         * 这样就只会创建一次Toast对象,多次点击就不会出现多次显示了,因为只有一个toast对象
         */
        public static void showToast(Context context, String content) {
            if (toast == null) {
                toast = Toast.makeText(context,content, Toast.LENGTH_SHORT);
            } else {
                toast.setText(content);//当第二次点击的时候就只会设置文字
            }
            toast.show();
        }

    }

 Snackbar:  源码里面就是一个SnackbarLayout布局,里面一个TextView 和 一个 Button

 

在使用Snackbar之前,首先需要在app/build.gradle中添加相应的依赖:

dependencies {
    compile 'com.android.support:design:23.4.0'
}

然后就可以使用Snackbar了,它的用法和Toast是比较相似的:

 基本设置:

 

/**
     * 按钮的单击事件
     */
    public void btn(View v){
        // 一下两行是为了隐藏键盘 防止键盘挡住snackbar
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        /**
         * LENGTH_INDEFINITE 一直显示在屏幕底部  还有两个属性值跟Toast一样
         */
        Snackbar snackbar = Snackbar.make(v, "信息", Snackbar.LENGTH_INDEFINITE);

        snackbar.setAction("Snackbar中的按钮", new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                //点击按钮的单击事件
            }
        });
        View view = snackbar.getView();//找到Snackbar的布局
        if(view!=null){
            view.setBackgroundResource(R.drawable.switch_btn_on);//设置这个布局的背景颜色
            //找到这个布局里的TextView,设置文本颜色()   默认为白色
           ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(Color.parseColor("#ff0000"));
            //找到这个布局里的按钮
            Button button = (Button) view.findViewById(R.id.snackbar_action);//源码中的id
        }
        snackbar.show();//显示
    }

    /**
     * 向Snackbar布局中添加一个布局,可以指定位置
     */
    public static void SnackbarAddView( Snackbar snackbar,int layoutId,int index) {
        View snackbarview = snackbar.getView();//(其实就是SnackbarLayout)
        //SnackbarLayout就为Snackbar的布局方式
        Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview;
        //获取需要添加的布局文件
        View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null);
        //设置布局参数
        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
        p.gravity= Gravity.CENTER_VERTICAL;//设置新建布局在Snackbar内垂直居中显示
        //添加布局
        snackbarLayout.addView(add_view,index,p);
    }

make()方法的第一个参数需要传入一个view,只要是当前界面布局的任意一个view都可以,Snackbar会使用这个view来自动查找最外层的布局,用于展示Snackbar。第二个参数就是Snackbar中显示的内容,第三个参数是Snackbar显示的时长。这些和Toast都是类似的。

接着这里又调用了一个setAction()方法来设置一个动作,从而让Snackbar不仅仅是一个提示,而是可以和用户进行交互的。最后调用show()方法让Snackbar显示出来。

// 改变右边按钮字体颜色

snackbar.setActionTextColor(Color.YELLOW);
还有销毁 设置时间 等等

更多使用见:http://www.jianshu.com/p/14240c742c5f

工具类(不同的是 在顶部显示):在顶部显示 

Android部分手机通知权限关闭无法打出Toast: https://www.jianshu.com/p/091de36a4be5

 

 

 

posted @ 2016-08-05 19:24  ts-android  阅读(812)  评论(0编辑  收藏  举报