Android-自定义Toast
前言
笔者小白,初次写博客,有诸多不足之处,欢迎各位读者指正。
由于参加亚太机器人大赛Robocon2022——同创辉煌,我在参赛团队里负责的是上位机部分,本次上位机我们团队放弃了传统的手柄,改用了手机app做上位机交互控制。前些天大致学了些Java(也真的就只学了些,很多看不完,也看不懂,深感自身编程能力不足)。现在开始学习Android开发,在Android Studio平台学习app开发。
Toast
1.什么是Toast?
我也具体答不上来,只知道在Android开发中,大致和消息提示有关,为此我还查了一下该单词英文含义,如下图(好像没有一个和消息相关的。。。)
2.Toast的使用案例
大致看了一些资料,基本是这么使用的(如下代码)。
第一个参数是上下文(我现在还不知道上下文的含义,但基本看到都是MainActivity.this或getApplicationContext()),并且参考了于连林老师的《爱上Android》,书上说最好用getApplicationContext(),原因:如果在Toast消失之前,Toast持有了当前Activity,而此时如果点击返回键,会导致Activity无法被GC销毁,这个Activity就引起了内存泄露。
第二个参数是想显示的String对象,也就是字符串,这里我传入 “我要学好Android”
第三个参数是传入int类型,一般传入的是Toast.LENGTH_SHORT或Toast.LENGTH_LONG,分别代表不同的显示时长(显示时长一到,消息提示就消失了)
Toast toast = Toast.makeText(getApplicationContext(), "我要学好Android", Toast.LENGTH_SHORT);
toast.show();
而Toast.LENGTH_SHORT和Toast.LENGTH_SHORT实际上就是Toast类里的静态(static)int类型常量,定义如下图
使用案例1
AndroidStudio平台新建好一个Empty Project,如下图
在activity_main.xml里新建一个按钮,因为想实现点击按钮后通过Toast对象显示一条消息
activity_main.xml里的内容如下
接下来编写MainActivity.java
内容比较简单,就是在setOnContentView(R.layout.activity_main)后获取这个按钮,然后设置监听,如下
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_1 = findViewById(R.id.btn_1);
//注意一定要先findViewById,这一步相当于Java里学的实例化对象,否则就是空对象了,空对象设置监听会闪退
btn_1.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
if (id == R.id.btn_1){
Toast toast = Toast.makeText(getApplicationContext(), "我要学好Android", Toast.LENGTH_SHORT);
toast.show();
}
}
}
效果就不展示了(录屏结果我暂时不会转gif。。)
使用案例2
从上面结果来看(好吧,我没贴),虽然第三个参数是Toast.LENGTH_SHORT,但显示时间依然很长,如果多个按钮,每个按钮点击后显示消息不同,那么当用户点击很勤时,消息显示会有滞后,因此需要实现能够设定其显示时长。
实现方法如下:新建一个类,我这里命名为Toast_Customed,然后在该类里写一个static方法,然后MainActivity里的OnClick回调方法里调用这个static方法即可。
Toast_Customed.java内容如下(当然,第一次写,只会使用这种简单的方式,后面学了更好的方式再补充)
public class Toast_Customed {
public static void ShowShorter(Context context, String word, int delay_ms){
Toast toast = Toast.makeText(context, word, Toast.LENGTH_SHORT);
toast.show();
try {
Thread.sleep(delay_ms);
} catch (InterruptedException e) {
e.printStackTrace();
}
toast.cancel();
}
}
然后在MainActivity中使用,如下
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn_1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_1 = findViewById(R.id.btn_1);
//注意一定要先findViewById,这一步相当于Java里学的实例化对象,否则就是空对象了,空对象设置监听会闪退
btn_1.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
if (id == R.id.btn_1){
// Toast toast = Toast.makeText(getApplicationContext(), "我要学好Android", Toast.LENGTH_SHORT);
// toast.show();
Toast_Customed.ShowShorter(getApplicationContext(), "好好学习", 200);
}
}
}
效果就不展示了(录屏结果我暂时不会转gif。。),明显显示时间更短了,但有个问题是当我第三个参数delay_ms给太小了,好像不给显示了