自定义Toast

自定义Toast

相信很多android开发者对Toast都很熟悉,在很多场景都会用到,常用的方法无外乎就是:

Toast.makeText(c, "", Toast.LENGTH_SHORT).show();

第一个是上下文,第二个是toast上显示的文字。我们能操作的就只有这些,当然还可以改变toast的显示位置等,但是我们会想为什么这个toast只能显示文字呢?为什么不可以按照我们自己的意愿改变toast的样式呢。下面我来解释下:
第一:为什么只能显示文字,因为Toast的源码里面只定义了一个只包含TextView的布局文件,它的布局文件路径如下D:/Sdk/platforms/android-25/data/res/layout/transient_notification.xml,代码如下
这里写图片描述
在Toast.makeText方法中对该布局进行填充,代码如下:

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);
LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);
result.mNextView = v;
result.mDuration = duration;
return result;
}
注意到这两行代码:
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);
给toast布局中的textView设置toast要显示的值。
那么现在我们可以想了,我们是否可以自定义一个布局文件来替换系统的布局文件呢?也就是我们写一个类似于makeText的方法呢?答案是可以的,下面废话不多说,直接上代码:
import android.content.Context;
import android.text.Layout;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.a71ant.lyc.R;

/**
* toast帮助类
* @author moon
*
*/
public class ToastUtil {
private static Toast toast = null;
private static TextView textView;
public static void showTips(Context c, String tips )
{
if (c == null) {
return;
}
if (toast == null) {
toast = new Toast(c);
View view = LayoutInflater.from(c).inflate(R.layout.toast_view,null);
toast.setView(view);
textView = (TextView)view.findViewById(R.id.tv_tip);
textView.setText(tips);
toast.setDuration(Toast.LENGTH_LONG);
} else {
textView.setText(tips);
}
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
}
布局文件过于简单,这里就不贴代码了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超级 Toast博客地址:悬浮窗需求终结者已投入公司项目多时,没有任何毛病,可胜任任何需求,点击此处下载Demo想了解实现原理的可以点击此链接查看:XToast 源码本框架意在解决一些极端需求,如果是普通的 Toast 封装推荐使用 ToastUtils集成步骤dependencies {     implementation 'com.hjq:xtoast:2.0' }使用案例new XToast(XToastActivity.this) // 传入 Application 表示设置成全局的         .setView(R.layout.toast_hint)         .setDraggable() // 设置成可拖拽的 .setDuration(1000) // 设置显示时长 .setAnimStyle(android.R.style.Animation_Translucent) // 设置动画样式         .setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)         .setText(android.R.id.message, "点我消失")         .setOnClickListener(android.R.id.message, new OnClickListener<TextView>() {             @Override             public void onClick(XToast toastTextView view) { // 点击这个 View 后消失                 toast.cancel();             }         })         .show();混淆规则-keep class com.hjq.xtoast.** {*;}框架亮点(原生 Toast 无法实现的功能)支持自定义 Toast 动画样式支持自定义 Toast 显示时长支持监听 Toast 的显示和销毁支持监听 Toast 中点击事件支持一键开启 Toast 拖拽功能支持 Toast 全局显示(需要权限)作者的其他开源项目架构工程:AndroidProject权限封装:XXPermissions吐司封装:ToastUtils标题栏封装:TitleBarAndroid技术讨论Q群:78797078
package com.example.dzy; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btnLogin,btnRegister; private ImageView ivLogin; private TextView tvUsername,tvUserId; private static final int REQUEST_REGISTER_CODE=1; private static final int REQUEST_LOGIN_CODE=2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvUserId=findViewById(R.id.tv_main_userid); tvUsername=findViewById(R.id.tv_main_username); ivLogin=findViewById(R.id.iv_login); btnLogin=findViewById(R.id.btn_main_login); btnRegister=findViewById(R.id.btn_main_register); btnLogin.setOnClickListener(this); btnRegister.setOnClickListener(this); } @Override public void onClick(View view){ Intent intent=new Intent(); switch (view.getId()){ case R.id.btn_main_login: intent.setClass(this,LoginActivity.class); startActivityForResult(intent,REQUEST_LOGIN_CODE); break; case R.id.btn_main_register: intent.setClass(this,RegisterActivity.class); startActivityForResult(intent,REQUEST_REGISTER_CODE); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent intent){ super.onActivityResult(requestCode,resultCode,intent); if(intent==null){ return; } switch (requestCode){ case REQUEST_REGISTER_CODE: if (resultCode==11){ tvUserId.setText(intent.getStringExtra("userId")); tvUsername.setText(intent.getStringExtra("userName")); ivLogin.setImageResource(R.mipmap.user_2); Toast.makeText(this,"注册成功!",Toast.LENGTH_LONG).show(); Intent intent1=new Intent(this,NavigationActivity.class); }else{ Toast.makeText(this,"注册失败!",Toast.LENGTH_LONG).show(); } break; case REQUEST_LOGIN_CODE: if(resultCode==21){ tvUserId.setText(intent.getStringExtra("userId")); tvUsername.setText(intent.getStringExtra("userName")); ivLogin.setImageResource(R.mipmap.user_2); Toast.makeText(this,"登录成功!",Toast.LENGTH_LONG).show(); Intent intent1=new Intent(this,NavigationActivity.class); }else{ Toast.makeText(this,"登录失败!",Toast.LENGTH_LONG).show(); } break; default: Toast.makeText(this,"操作失败!",Toast.LENGTH_LONG).show(); break; } } }这段中intent1没有进行页面跳转
最新发布
05-31

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值