android自定义Toast设定显示时间

 更新时间:2018年08月28日 09:53:10   作者:listen_to_heart  
这篇文章主要为大家详细介绍了android自定义Toast设定显示时间,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

开发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设定显示时间

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

相关文章

  • Android开发之DatePickerDialog、TimePickerDialog时间日期对话框用法示例

    Android开发之DatePickerDialog、TimePickerDialog时间日期对话框用法示例

    这篇文章主要介绍了Android开发之DatePickerDialog、TimePickerDialog时间日期对话框用法,结合实例形式分析了Android使用DatePickerDialog、TimePickerDialog显示日期时间相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Android LinearLayout实现自动换行效果

    Android LinearLayout实现自动换行效果

    这篇文章主要为大家详细介绍了Android LinearLayout实现自动换行效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android ContentProvider基础应用详解

    Android ContentProvider基础应用详解

    ContentProvider是android四大组件之一。它是不同应用程序之间交换数据的标准api,ContentProvider以某种uri的形式对外提供数据,允许其它应用程序对其访问或者修改数据。本文将介绍ContentProvider的基础应用,感兴趣的可以学习一下
    2021-12-12
  • Android GPS详解及示例代码

    Android GPS详解及示例代码

    本文主要讲解Android GPS,这里整理了GPS 的基础知识资料,并提供示例代码和实现效果图,有兴趣的小伙伴可以参考下
    2016-08-08
  • android获取时间差的方法

    android获取时间差的方法

    这篇文章主要介绍了android获取时间差的方法,涉及Android操作时间的相关技巧,需要的朋友可以参考下
    2015-04-04
  • ViewPager+Fragment实现侧滑导航栏

    ViewPager+Fragment实现侧滑导航栏

    这篇文章主要为大家详细介绍了ViewPager+Fragment实现侧滑导航栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android常用定时器的实现方式

    Android常用定时器的实现方式

    我们在开发中时常需要写一些定时的任务,比如每5秒执行一次,下面这篇文章主要给大家介绍了关于Android常用定时器的实现方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Android结束进程的方法详解

    Android结束进程的方法详解

    这篇文章主要介绍了Android结束进程的方法,结合实例形式分析了Android结束进程的具体步骤,实现技巧与相关注意事项,需要的朋友可以参考下
    2016-03-03
  • Android 应用的欢迎界面实现代码

    Android 应用的欢迎界面实现代码

    本文主要介绍Android 应用欢迎界面的开发,这里提供实现方法和实现代码以供大家参考,有需要的朋友可以参考下
    2016-07-07
  • android 调用系统的照相机和图库实例详解

    android 调用系统的照相机和图库实例详解

    android手机有自带的照相机和图库,我们做的项目中有时用到上传图片到服务器,今天做了一个项目用到这个功能,所以把我的代码记录下来和大家分享,有需求的朋友可以参考下
    2012-12-12

最新评论