Android自定义Toast提示框的显示效果实例

先看看效果图

Activity:

package com.example.editortoast;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.bt).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                toastShow();
            }
        });
    }
    private void toastShow() {
        LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
        View view = inflater.inflate(R.layout.item_toast, null);
        TextView textView1 = (TextView) view.findViewById(R.id.TextView_1);
        textView1.setText("Toast1");
        Toast toast = new Toast(getApplicationContext());
        toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
        toast.setDuration(0);
        toast.setView(view);
        toast.show();
    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.editortoast.MainActivity" >
    <Button
        android:id="@+id/bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击" />

</RelativeLayout>

item_toast.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/image"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_launcher" />
    <TextView
        android:id="@+id/TextView_1"
        android:textSize="30sp"
        android:textColor="@android:color/holo_red_light"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@id/image" />
</RelativeLayout>

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;
      }
      
    }
  };
  
}

效果如下: 

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, view
, new
params
android 自定义toast、android中自定义toast、自定义toast、toast自定义显示时间、toast自定义布局,以便于您获取更多的相关知识。

时间: 2024-09-22 15:06:39

Android自定义Toast提示框的显示效果实例的相关文章

Android超实用的Toast提示框优化分享_Android

前言 相信每位Android开发者都用过Toast,都知道是弹出消息的.类似于js里面的alert,C#里面的MesageBox.当然android里面也有dialog,dialog是有焦点的,可与用户交互.而toast是没有焦点的,时间到了自动消失,不能回应用户的交互,下面就跟大家分享下Android中Toast提示框的优化方法. 先看下源码: public class Toast { public static final int LENGTH_SHORT = 0; public stati

Android实现Toast提示框图文并存的方法_Android

本文实例讲述了Android实现Toast提示框图文并存的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.text.util.Linkify; import android.view.Gravity; import android.view.View; import android.view.

iOS自定义alertView提示框实例分享_IOS

本文实例为大家分享iOS自定义alertView提示框,先上图,弹框的背景色,按钮背景色,提示的消息的字体颜色都可以改变 利用单例实现丰富的自定义接口 // // PBAlertController.h // PBAlertDemo // // Created by 裴波波 on 16/4/20. // Copyright 2016年 裴波波. All rights reserved. // #import <UIKit/UIKit.h> typedef void(^PBBlock)(); @

Android实现Toast提示框图文并存的方法

本文实例讲述了Android实现Toast提示框图文并存的方法.分享给大家供大家参考,具体如下: 程序如下: import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.text.util.Linkify; import android.view.Gravity; import android.view.View; import android.view.

easyUI实现(alert)提示框自动关闭的实例代码_javascript技巧

原理:使用js的定时任务函数setInterval设置时间,然后触发关闭事件 参数说明 title:提示框的标题 msg:提示信息内容 ico:显示的提示信息图标,'info','warnning','error'等 函数体 function alert_autoClose(title,msg,icon){ var interval; var time=1000; var x=2; //设置时间2s $.messager.alert(title,msg,icon,function(){}); i

Android 自定义弹出框实现代码_Android

废话不多说了,直接给大家上关键代码了. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self showAlertView:@"11111"]; } //自定义弹出框 -(void)showAlertView:(NSString *)strTipText { UIView *showView=[[UIView alloc]init]; [sho

Android顶部(toolbar)搜索框实现的实例详解

Android顶部(toolbar)搜索框实现的实例详解 本文介绍两种SearchView的使用情况,一种是输入框和搜索结果不在一个activity中,另一种是在一个activity中. 首先编写toolbar的布局文件 toolbar中图标在menu文件下定义一个布局文件实现 示例代码: <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.

Android 自定义弹出框实现代码

废话不多说了,直接给大家上关键代码了. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self showAlertView:@"11111"]; } //自定义弹出框 -(void)showAlertView:(NSString *)strTipText { UIView *showView=[[UIView alloc]init]; [sho

Android自定义View中attrs.xml的实例详解

Android自定义View中attrs.xml的实例详解 我们在自定义View的时候通常需要先完成attrs.xml文件 在values中定义一个attrs.xml 然后添加相关属性 这一篇先详细介绍一下attrs.xml的属性. <?xml version="1.0" encoding="utf-8"?> <resources> //自定义属性名,定义公共属性 <attr name="titleText" for