android 自定义Toast,可设定显示时间
来源:互联网 发布:php全栈 编辑:程序博客网 时间:2024/05/17 13:07
http://www.tuicool.com/articles/rIV3ie
开发android的同学可能会抱怨Toast设定显示的时长无效,只能是Toast.LENGTH_LONG 或者Toast.LENGTH_SHORT 之一,为了解决这些办法,有多种实现方式:
1.使用定时器,定时调用show()方法.
2.使用CountDownTimer类,也是调用show()方法.
3.使用WindownManager类实现.
本文使用方法三进行实现,难度不大,直接看代码吧.
package com.open.toast;import android.content.Context;import android.graphics.Color;import android.graphics.PixelFormat;import android.os.Handler;import android.view.Gravity;import android.view.View;import android.view.WindowManager;import android.widget.LinearLayout;import android.widget.TextView;/** * 自定义时长的Toast * @author DexYang * */public class CToast {public static CToast makeText(Context context, CharSequence text, int duration) {CToast result = new CToast(context);LinearLayout mLayout=new LinearLayout(context);TextView tv = new TextView(context);tv.setText(text);tv.setTextColor(Color.WHITE);tv.setGravity(Gravity.CENTER);mLayout.setBackgroundResource(R.drawable.widget_toast_bg);int w=context.getResources().getDisplayMetrics().widthPixels / 2;int h=context.getResources().getDisplayMetrics().widthPixels / 10;mLayout.addView(tv, w, h);result.mNextView = mLayout;result.mDuration = duration;return result;}public static final int LENGTH_SHORT = 2000;public static final int LENGTH_LONG = 3500;private final Handler mHandler = new Handler();private int mDuration=LENGTH_SHORT;private int mGravity = Gravity.CENTER;private int mX, mY;private float mHorizontalMargin;private float mVerticalMargin;private View mView;private View mNextView;private WindowManager mWM;private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); public CToast(Context context) {init(context);} /** * Set the view to show. * @see #getView */public void setView(View view) {mNextView = view;}/** * Return the view. * @see #setView */public View getView() {return mNextView;}/** * Set how long to show the view for. * @see #LENGTH_SHORT * @see #LENGTH_LONG */public void setDuration(int duration) {mDuration = duration;}/** * Return the duration. * @see #setDuration */public int getDuration() {return mDuration;}/** * Set the margins of the view. * * @param horizontalMargin The horizontal margin, in percentage of the *container width, between the container's edges and the *notification * @param verticalMargin The vertical margin, in percentage of the *container height, between the container's edges and the *notification */public void setMargin(float horizontalMargin, float verticalMargin) {mHorizontalMargin = horizontalMargin;mVerticalMargin = verticalMargin;}/** * Return the horizontal margin. */public float getHorizontalMargin() {return mHorizontalMargin;}/** * Return the vertical margin. */public float getVerticalMargin() {return mVerticalMargin;}/** * Set the location at which the notification should appear on the screen. * @see android.view.Gravity * @see #getGravity */public void setGravity(int gravity, int xOffset, int yOffset) {mGravity = gravity;mX = xOffset;mY = yOffset;} /** * Get the location at which the notification should appear on the screen. * @see android.view.Gravity * @see #getGravity */public int getGravity() {return mGravity;}/** * Return the X offset in pixels to apply to the gravity's location. */public int getXOffset() {return mX;}/** * Return the Y offset in pixels to apply to the gravity's location. */public int getYOffset() {return mY;}/** * schedule handleShow into the right thread */public void show() {mHandler.post(mShow);if(mDuration>0){ mHandler.postDelayed(mHide, mDuration);}}/** * schedule handleHide into the right thread */public void hide() {mHandler.post(mHide);}private final Runnable mShow = new Runnable() {public void run() {handleShow();}};private final Runnable mHide = new Runnable() {public void run() {handleHide();}};private void init(Context context){ final WindowManager.LayoutParams params = mParams; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; params.format = PixelFormat.TRANSLUCENT; params.windowAnimations = android.R.style.Animation_Toast; params.type = WindowManager.LayoutParams.TYPE_TOAST; params.setTitle("Toast"); mWM = (WindowManager) context.getApplicationContext() .getSystemService(Context.WINDOW_SERVICE);}private void handleShow() {if (mView != mNextView) {// remove the old view if necessaryhandleHide();mView = mNextView;//mWM = WindowManagerImpl.getDefault();final int gravity = mGravity;mParams.gravity = gravity;if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {mParams.horizontalWeight = 1.0f;}if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {mParams.verticalWeight = 1.0f;}mParams.x = mX;mParams.y = mY;mParams.verticalMargin = mVerticalMargin;mParams.horizontalMargin = mHorizontalMargin;if (mView.getParent() != null) {mWM.removeView(mView);}mWM.addView(mView, mParams);}}private void handleHide() {if (mView != null) {if (mView.getParent() != null) {mWM.removeView(mView);}mView = null;}}}
测试类的代码如下:
package com.open.toast;import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.widget.EditText;public class MainActivity extends Activity {private EditText mEditText;private CToast mCToast;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init(){mEditText=(EditText)findViewById(R.id.timeEditText);findViewById(R.id.showToastBtn).setOnClickListener(listener);findViewById(R.id.hideToastBtn).setOnClickListener(listener);}private View.OnClickListener listener=new View.OnClickListener() {@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.showToastBtn:if(null!=mCToast){mCToast.hide();}int time=TextUtils.isEmpty(mEditText.getText().toString())?CToast.LENGTH_SHORT:Integer.valueOf(mEditText.getText().toString());mCToast=CToast.makeText(getApplicationContext(), "我来自CToast!",time);mCToast.show();break;case R.id.hideToastBtn:if(null!=mCToast){mCToast.hide();}break;}}};}
效果如下:
代码地址: http://download.csdn.net/detail/zz7zz7zz/7019077
0 0
- android 自定义Toast,可设定显示时间
- android 自定义Toast,可设定显示时间
- android 自定义Toast,可设定显示时间
- android toast自定义显示时间
- 如何设定Toast显示时间。
- Android中Toast显示时间的自定义
- Android进阶篇-Toast自定义显示时间
- Android中Toast显示时间的自定义
- Android中Toast显示时间的自定义
- Android进阶篇-Toast自定义显示时间
- Android中Toast显示时间的自定义
- android中Toast显示时间自定义使用
- [Android]可自定义显示时长的Toast
- android Toast工具类,可自定义位置和取消显示
- android 自定义Toast显示风格顶部弹出自定义时间
- Toast显示时间的自定义
- android自定义Toast的显示时间与消失
- Android中Toast显示时间的自定义控制
- 信息安全等级定义
- 程序员的工作感言
- fast-rcnn中编译cudnn出错解决方法
- DapperExtensions 1.5.0
- 和我一起学C++之list<一>
- android 自定义Toast,可设定显示时间
- 学习笔记:数据库的安装和基本语法
- 全面总结阿里巴巴Java开发手册
- 静默模式下的rac部署安装
- chmod 777 修改权限
- Dell Inspiron 15 5000 series 设置u盘启动(新版BIOS)
- hibernate面试题
- Zxing图片拉伸解决 Android 二维码扫描
- Linux环境CENTOS下apache-ftpserver搭建配置及后台启动