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