android 提示
1、Toast:
Toast toast=new Toast(context); Toast.makeText(context, text, duration);//返回值为Toast toast.setDuration(duration);//设置持续时间 toast.setGravity(gravity, xOffset, yOffset);//设置Toast的位置 toast.setText(s);//设置提示内容 toast.show();//显示
2、(转)Snackbars(版权声明:欢迎转载,转载请注明出处 https://blog.csdn.net/u012810020/article/details/52108818)
简述:
Snackbar 是 Android design support library 中的一个组件,它的作用和Toast类似,显示吐司,但Snackbar的特别之处在于Snackbar显示的提示信息可以和用户交互,更好地获取用户反馈信息。同时,它显示的吐司带有动画效果,从屏幕下方慢慢展开显示。
Goggle官方这样介绍:“SnackBars提供了一个轻量级的反馈操作。他们在屏幕的底部显示一条简短的信息,如果是较大的设备就显示在左下角。SnackBar出现在屏幕中所有其他元素的上方,同一时间仅仅只有一条SnackBar”。总之,SnackBar的特点大致下面几条:
①与Toast一样可以进行吐司信息;
②可以与用户交互操作;
③一个时刻只能有唯一一个 Snackbar 显示。
基本使用方法
1、简单使用
1 import android.support.design.widget.Snackbar; 2 import android.support.v7.app.AppCompatActivity; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.Button; 7 public class MainActivity extends AppCompatActivity { 8 private Button btn_show; 9 private ViewGroup frameLayout; 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 initViews(); 15 } 16 private void initViews() { 17 frameLayout = (ViewGroup) findViewById(android.R.id.content); 18 btn_show = (Button) findViewById(R.id.btn_show); 19 btn_show.setOnClickListener(new View.OnClickListener() { 20 @Override 21 public void onClick(View view) { 22 Snackbar.make(view,"Hello SnackBar!",Snackbar.LENGTH_SHORT).show(); 23 } 24 }); 25 } 26 }
其实使用的核心代码就一句:
Snackbar.make(view,"Hello SnackBar!",Snackbar.LENGTH_SHORT).show();
使用起来类似于Toast,但也有与Toast的不同之处,Toast的使用:
Toast.makeText(MainActivity.this, "真的能够交互", Toast.LENGTH_SHORT).show();
他们的第一个参数不同,Toast第一个参数是Context,而Snackbar第一个参数为View,这个View就是Toast的父布局。与Toast不同的是Snackbar显示时长有三种:
①Snackbar.LENGTH_SHORT:与Toast.LENGHT_SHORT(大约1.x秒)一样显示较短时长后自动消失。
②Snackbar.LENGTH_LONG:与Toast.LENGHT_LONG(大约3秒)一样显示相对较长时间后自动消失。
③Snackbar.LENGTH_INDEFINITE:永不消失除非手动调用dismiss()方法去除Snackbar。
2、可交互的Snackbar
核心代码:
1 final Snackbar snackbar = Snackbar.make(frameLayout, "Hello SnackBar!", Snackbar.LENGTH_INDEFINITE); 2 snackbar.setAction("OK?", new View.OnClickListener() { 3 @Override 4 public void onClick(View view) { 5 // snackbar.dismiss(); 6 //doSomething 7 } 8 }); 9 snackbar.show();
setAction(CharSequence text, View.OnClickListener listener)方法为用户交互的点击事件,第一个参数是点击事件的信息,第二个就是一个View.OnClickListener点击监听器。
3、可反馈的Snackbar
核心代码:
1 final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "反馈监听的Snackbar", Snackbar.LENGTH_LONG); 2 snackbar.setAction("能交互吗", new View.OnClickListener() { 3 @Override 4 public void onClick(View view) { 5 Toast.makeText(MainActivity.this, "真的能够交互", Toast.LENGTH_SHORT).show(); 6 } 7 }); 8 snackbar.setCallback(new Snackbar.Callback() { 9 @Override 10 public void onDismissed(Snackbar snackbar, int event) { 11 super.onDismissed(snackbar, event); 12 switch (event) { 13 case Snackbar.Callback.DISMISS_EVENT_ACTION: 14 Toast.makeText(MainActivity.this, "Snackbar通过Action的点击事件退出", Toast.LENGTH_SHORT).show(); 15 break; 16 case Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE: 17 Toast.makeText(MainActivity.this, "Snackbar由于新的Snackbar显示而退出", Toast.LENGTH_SHORT).show(); 18 break; 19 case Snackbar.Callback.DISMISS_EVENT_MANUAL: 20 Toast.makeText(MainActivity.this, "Snackbar通过调用dismiss()方法退出", Toast.LENGTH_SHORT).show(); 21 break; 22 case Snackbar.Callback.DISMISS_EVENT_SWIPE: 23 Toast.makeText(MainActivity.this, "Snackbar右划退出", Toast.LENGTH_SHORT).show(); 24 break; 25 case Snackbar.Callback.DISMISS_EVENT_TIMEOUT: 26 Toast.makeText(MainActivity.this, "Snackbar自然退出", Toast.LENGTH_SHORT).show(); 27 break; 28 } 29 } 30 @Override 31 public void onShown(Snackbar snackbar) { 32 super.onShown(snackbar); 33 Toast.makeText(MainActivity.this, "Snackbar显示", Toast.LENGTH_SHORT).show(); 34 } 35 }); 36 snackbar.show();
监听的实现是通过CallBack接口实现的,setCallback(Snackbar.Callback
callback):Snackbar的显示与隐藏的回调接口,在该接口中可以重写两个方法:一个是onShow()在Snackbar显示时回调,另一个是onDismissed()在Snackbar隐藏时回调。另外一点就是在onDismissed()方法中可以监听到Snackbar退出的五种原因类型:
①Snackbar.Callback.DISMISS_EVENT_SWIPE=0:Indicates that the Snackbar was dismissed via a swipe。
该事件下Snackbar退出的原因是;意思是“Snackbar右划退出事件”,注意这个右划事件只有在父布局为CoordinatorLayout才会被触发,其他布局如LinearLayout、RelativeLayout等是不会出发的。
②Snackbar.Callback.DISMISS_EVENT_ACTION = 1:Indicates that the Snackbar was dismissed via an action click。
该事件下Snackbar退出的原因是:Snackbar通过Action点击事件触发退出。
③Snackbar.Callback.DISMISS_EVENT_TIMEOUT = 2:Indicates that the Snackbar was dismissed via a timeout。
该事件下Snackbar退出的原因是:Snackbar超出通过setDuration()方法所设置的规定时间后退出,这也是正常的自然退出。
④Snackbar.Callback.DISMISS_EVENT_MANUAL = 3:Indicates that the Snackbar was dismissed via a call to dismiss()。
该事件下Snackbar提出的原因是:通过手动调用了dismiss()方法。
⑤Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE = 4:Indicates that the Snackbar was dismissed from a new Snackbar being shown。
该事件下Snackbar提出的原因:由于新的Snackbar的显示而退出。
4、自定义Snackbar
在自定义Snackbar之前需要弄清Snackbar的内部构造,打开Snackbar源码可以看到其有一个内部类Snackbar.SnackbarLayout,该内部类就是Snackbar布局,然后找到Snackbar.SnackbarLayout的布局资源文件design_layout_snackbar_include.xml,打开该文件看到一个TextView(吐司左边的信息)和一个Button(显示SnackBar右侧与用户交互的按钮)。
如果我们能够获取到该View岂不是就能随意的更改一些Snackbar的背景样式、吐司信息、吐司文字的颜色及大小、交互按钮Button的颜色与文字大小等信息了吗?不错,Snackbar提供了一个getView()方法,这个方法就可以获取到Snackbar.SnackbarLayout的实例。那么下面就来尝试一下。
核心代码:
1 final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "自定义Snackbar", Snackbar.LENGTH_LONG); 2 snackbar.setAction("是否OK", new View.OnClickListener() { 3 @Override 4 public void onClick(View view) { 5 Toast.makeText(MainActivity.this, "真的能够交互", Toast.LENGTH_SHORT).show(); 6 } 7 }); 8 final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView(); 9 if (snackbarView != null){ 10 //设置SnackBar背景与透明度 11 snackbarView.setBackgroundResource(R.drawable.background); 12 snackbarView.setAlpha((float) 0.4); 13 14 //设置Action的字体颜色与大小 15 final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action); 16 snackbar_action.setTextColor(Color.RED); 17 snackbar_action.setTextSize(convertSpToPixel(snackbarView.getContext(),10)); 18 19 //这是Text的文字颜色与大小 20 final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text); 21 snackbar_text.setTextColor(Color.RED); 22 snackbar_text.setTextSize(convertSpToPixel(snackbarView.getContext(),10)); 23 //设置左侧icon 24 Drawable drawable = ContextCompat.getDrawable(MainActivity.this, R.mipmap.ic_core); 25 if (drawable != null) { 26 drawable = fitDrawable(getResources(), drawable, (int) convertDpToPixel(24, MainActivity.this)); 27 } else { 28 throw new IllegalArgumentException("resource_id is not a valid drawable!"); 29 } 30 31 final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables(); 32 snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]); 33 } 34 snackbar.show();
对于自定义我们首先得获取Snackbar的布局:
final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
拿到布局以后我们可以对Snackbar的背景和透明度进行设置:
还记得刚才我们看的Snackbar的布局文件吗?里面就是一个TextView和一个Button,如果我们想要对他们进行自定义我们可以先拿到他们的布局view,首先我们看一下Button:
final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
我们拿到Button实例之后就可以对其进行自定义了:
我们在对Snackbar里的TextView进行自定义:
1 final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
对其设置字体大小和字体颜色:
对于TextView本身来说还有一个方法就是可以通过setCompoundDrawables(left,top,right,bottom)设置图标Icon,现在我们对Snackbar里的TextView进行左侧图标Icon的设置:
1 //设置左侧icon 2 Drawable drawable = ContextCompat.getDrawable(MainActivity.this, R.mipmap.ic_core); 3 if (drawable != null) { 4 drawable = fitDrawable(getResources(), drawable, (int) convertDpToPixel(24, MainActivity.this)); 5 } else { 6 throw new IllegalArgumentException("resource_id is not a valid drawable!"); 7 } 8 9 final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables(); 10 snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]);
这里的代码还用到的方法如下:
好了,Snackbar的基本用法已经差不多了,现在封装一个Snackbar的工具类吧!!!
5、封装工具类
1 import android.annotation.TargetApi; 2 import android.content.Context; 3 import android.content.res.Resources; 4 import android.graphics.Bitmap; 5 import android.graphics.Canvas; 6 import android.graphics.drawable.BitmapDrawable; 7 import android.graphics.drawable.Drawable; 8 import android.graphics.drawable.VectorDrawable; 9 import android.os.Build; 10 import android.support.annotation.Nullable; 11 import android.support.design.widget.Snackbar; 12 import android.support.v4.content.ContextCompat; 13 import android.util.TypedValue; 14 import android.view.View; 15 import android.widget.Button; 16 import android.widget.TextView; 17 18 /** 19 * 类描述:Snackbar工具类 20 * Created by lizhenya on 16/7/14. 21 */ 22 public class SnackbarUtil { 23 24 private static Snackbar.SnackbarLayout getSnackbarLayout(Snackbar snackbar) { 25 final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView(); 26 return snackbarView; 27 } 28 29 30 public static Snackbar shortMake(View view, CharSequence message) { 31 final Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT); 32 return snackbar; 33 } 34 35 public static Snackbar shortMake(View view, int messageId) { 36 final Snackbar snackbar = Snackbar.make(view, messageId, Snackbar.LENGTH_LONG); 37 return snackbar; 38 } 39 40 public static Snackbar longMake(View view, CharSequence message) { 41 final Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT); 42 return snackbar; 43 } 44 45 public static Snackbar longMake(View view, int messageId) { 46 final Snackbar snackbar = Snackbar.make(view, messageId, Snackbar.LENGTH_LONG); 47 return snackbar; 48 } 49 50 public static Snackbar indefiniteMake(View view, CharSequence message) { 51 final Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE); 52 return snackbar; 53 } 54 55 public static Snackbar indefiniteMake(View view, int messageId) { 56 final Snackbar snackbar = Snackbar.make(view, messageId, Snackbar.LENGTH_INDEFINITE); 57 return snackbar; 58 } 59 60 /** 61 * 方法描述:设置Snackbar的透明度 62 * 63 * @param snackbar 64 * @param alpha 65 */ 66 public static void setSnackbarAlpha(Snackbar snackbar, float alpha) { 67 final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar); 68 if (snackbarView == null) return; 69 snackbarView.setAlpha(alpha); 70 } 71 72 /** 73 * 方法描述:设置Snackbar的背景颜色 74 * 75 * @param snackbar 76 * @param color 77 */ 78 public static void setSnackbarBackgroundColor(Snackbar snackbar, int color) { 79 final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar); 80 if (snackbarView == null) return; 81 snackbarView.setBackgroundColor(color); 82 } 83 84 /** 85 * 方法描述:设置Snackbar的背景图片资源 86 * 87 * @param snackbar 88 * @param resId 89 */ 90 public static void setSnackbarBackgroudResource(Snackbar snackbar, int resId) { 91 final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar); 92 if (snackbarView == null) return; 93 snackbarView.setBackgroundResource(resId); 94 } 95 96 /** 97 * 方法描述:设置Snackbar中Action的字体颜色 98 * 99 * @param snackbar 100 * @param color 101 */ 102 public static void setActionTextColor(Snackbar snackbar, int color) { 103 //snackbar.setActionTextColor(color); 104 final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar); 105 if (snackbarView == null) return; 106 final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action); 107 snackbar_action.setTextColor(color); 108 } 109 110 /** 111 * 方法描述:设置Snackbar中Action的字体大小 112 * 113 * @param snackbar 114 * @param size Action的字体大小(单位为sp) 115 */ 116 public static void setActionTextSize(Snackbar snackbar, float size) { 117 final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar); 118 if (snackbarView == null) return; 119 final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action); 120 snackbar_action.setTextSize(sp2px(snackbarView.getContext(), size)); 121 } 122 123 /** 124 * 方法描述:设置SnackBar左侧TextView控件的文字颜色和大小 125 * 126 * @param snackbar 127 * @param color TextView控件的文字颜色 128 * @param size TextView控件的文字大小 129 */ 130 public static void setTextColorAndSize(Snackbar snackbar, @Nullable int color, @Nullable float size) { 131 final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar); 132 if (snackbarView == null) return; 133 final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text); 134 if (color != 0) { 135 snackbar_text.setTextColor(color); 136 } 137 if (size != 0) { 138 snackbar_text.setTextSize(size); 139 } 140 } 141 142 143 /** 144 * 方法描述:在Snackbar左侧添加icon 145 * 146 * @param snackbar Snackbar实例 147 * @param drawableResId 添加的icon资源ID 148 * @param sizeDp icon的宽度与高度值 149 */ 150 public static void setIconLeft(Snackbar snackbar, int drawableResId, float sizeDp) { 151 final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) getSnackbarLayout(snackbar); 152 if (snackbarView == null) return; 153 //snackbar不同于Toast,snackbar依赖于Activity而存在 154 final Context mContext = snackbarView.getContext(); 155 if (mContext == null) { 156 return; 157 } 158 final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text); 159 160 Drawable drawable = ContextCompat.getDrawable(mContext, drawableResId); 161 if (drawable != null) { 162 drawable = fitDrawable(mContext.getResources(), drawable, (int) convertDpToPixel(sizeDp, mContext)); 163 } else { 164 throw new IllegalArgumentException("resource_id is not a valid drawable!"); 165 } 166 167 final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables(); 168 snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]); 169 } 170 171 /** 172 * 方法描述:将drawable压缩为指定宽高的drawable 173 * 174 * @param resources 175 * @param drawable 原始drawable 176 * @param sizePx 指定的drawable压缩宽高 177 * @return 178 */ 179 private static Drawable fitDrawable(Resources resources, Drawable drawable, int sizePx) { 180 if (drawable.getIntrinsicWidth() != sizePx || drawable.getIntrinsicHeight() != sizePx) { 181 if (drawable instanceof BitmapDrawable) { 182 drawable = new BitmapDrawable(resources, Bitmap.createScaledBitmap(getBitmap(drawable), sizePx, sizePx, true)); 183 } 184 } 185 drawable.setBounds(0, 0, sizePx, sizePx); 186 187 return drawable; 188 } 189 190 /** 191 * 方法描述:将Drawable转化为Bitmap 192 * 193 * @param drawable 194 * @return 195 */ 196 private static Bitmap getBitmap(Drawable drawable) { 197 if (drawable instanceof BitmapDrawable) { 198 return ((BitmapDrawable) drawable).getBitmap(); 199 } else if (drawable instanceof VectorDrawable) { 200 return getBitmap((VectorDrawable) drawable); 201 } else { 202 throw new IllegalArgumentException("unsupported drawable type"); 203 } 204 } 205 206 /** 207 * 方法描述:将VectorDrawable转化为Bitmap 208 * 209 * @param vectorDrawable 210 * @return 211 */ 212 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 213 private static Bitmap getBitmap(VectorDrawable vectorDrawable) { 214 Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), 215 vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 216 Canvas canvas = new Canvas(bitmap); 217 vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 218 vectorDrawable.draw(canvas); 219 return bitmap; 220 } 221 222 /** 223 * 方法描述:dp转化为px 224 * 225 * @param dpValue 226 * @param context 227 * @return 228 */ 229 private static float convertDpToPixel(float dpValue, Context context) { 230 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 231 dpValue, context.getResources().getDisplayMetrics()); 232 } 233 234 /** 235 * sp转px 236 * 237 * @param context 238 * @param spVal 239 * @return 240 */ 241 public static int convertSpToPixel(Context context, float spVal) { 242 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 243 spVal, context.getResources().getDisplayMetrics()); 244 } 245 246 public static int sp2px(Context context, float spValue) { 247 final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; 248 return (int) (spValue * fontScale + 0.5f); 249 } 250 251 }
顶部展示的SnackBar
文章最后介绍一个第三方框架。系统默认的Snackbar是从屏幕底部弹出的,如果想要改变其弹出位置可以将其父控件置于想要弹出的屏幕位置,但是即使这样做也不能改变动画,现在介绍一个从顶部弹出的Snackbar框架TSnackbar,github链接:https://github.com/AndreiD/TSnackBar。
Snackbar使用源码下载:http://download.csdn.net/detail/u012810020/9594379
3、AlertDialog
1 new AlertDialog.Builder(this) 2 .setTitle("标题") // ; 3 .setMessage("message") 4 .setIcon(R.drawable.ic_launcher_background) // 图标 5 .setNegativeButton("取消",new DialogInterface.OnClickListener(){ 6 @Override 7 public void onClick(DialogInterface dialog, int which) { 8 // do something 9 } 10 }) 11 .setPositiveButton("确定", new DialogInterface.OnClickListener() { 12 @Override 13 public void onClick(DialogInterface dialog, int which) { 14 // do something 15 } 16 }) 17 .setView(new EditText(this)) // 还可以 加入额外view来实现额外功能 18 .create() 19 .show();
还可以使用,LayoutInflater 将布局文件转化为 view对象 放进 Alert
1 LayoutInflater layoutInflater = LayoutInflater.from(MainActivity.this); //context 2 LinearLayout layout = (LinearLayout) layoutInflater.inflate(R.layout.acvitity_alert,null);//自定义的layout 3 Dialog dialog = new AlertDialog.Builder(this).create(); 4 dialog.show(); 5 dialog.getWindow().setContentView(layout);
4、 AlertView