首页 > 系统 > Android > 正文

android自定义Toast设定显示时间

2019-10-21 21:39:58
字体:
来源:转载
供稿:网友

开发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 necessary   handleHide();   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;  @Override protected 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() {  @Override public 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; }  } }; }

效果如下:

android,Toast,显示时间

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表