Android-活动(Activity)-Toast和Menu

上一篇我们介绍了活动的一些基本知识,也了解了如何创建一个主活动。这篇我们说说使用率相当高的Toast(吐司)和Menu。

Toast

Toast是什么?

  我说名词有的人应该不知道这个是什么,但我截个图大家就全明白了:

我们使用app的时候不免会有一些提示,这些比较简短、一段时间之后隐藏,并且不占用屏幕空间的提示,就是我们说的Toast。

Toast的使用

 首先贴上代码:

布局文件:

1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2     android:layout_width="match_parent"
3     android:layout_height="match_parent">
4     <Button
5         android:layout_width="wrap_content"
6         android:layout_height="wrap_content"
7         android:text="点我点我"
8         android:id="@+id/button"/>
9 </LinearLayout>

 

Java文件:

 1 package com.example.toastdemo;
 2 
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.widget.Button;
 7 import android.widget.Toast;
 8 
 9 public class MainActivity extends AppCompatActivity
10 {
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState)
14     {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.activity_main);
17         Button button = (Button) findViewById(R.id.button);
18         button.setOnClickListener(new View.OnClickListener()
19         {
20             @Override
21             public void onClick(View v)
22             {
23                 Toast.makeText(MainActivity.this,"雷吼啊",Toast.LENGTH_SHORT).show();
24             }
25         });
26     }
27 }

我们重点关注Java17-25行:

17行我们定义了一个按钮,将这个按钮与我们布局文件中的按钮进行绑定。我们是用findViewById(R.id.button)方式获取到我们的按钮对象的,因为这个方法返回来的是一个View对象(View对象是android所有空间的基类),所以我们要将这个对象向下转型为我们需要的Button类的对象,然后我们将Button的id传入进方法的参数就可以了。

接下来我们为这个按钮设置了一个监听器,监听点击事件。我们设置监听事件最常用的方法就是使用匿名内部类方式(因为真的是方便,在AS里面你只需要一个tab就可以把框架给补全)。当我们点击按钮的时候,就会执行我们的Toast方法了。

我们看到,makeTest的调用并没有建立对象,所以这个方法一定是一个静态方法。这个方法有三个参数:

1.Context context  这个直译是上下文的意思。我们简单介绍下上下文是什么意思。

在Android中,用户所有的与系统进行交互的场景都被抽象为上下文。我们所有的操作都是有一个背景或者是环境的。比如,我们在聊QQ,这里的“环境”就指我们聊天的界面,后台数据的传输。具体到我们这个,我们Toast弹出的“环境”就是我们的MainActivity。又因为我们是在内部类进行的操作,所以我们需要使用MainActivity.this来获取外部类对象。也就是说,外部类对象就是我们的“上下文”。

2. String text 这个很好理解,就是我们Toast要弹出的字符串。

3.int time  Toast要显示的时间。系统提供给了我们两个常量:Toast.LENTH_SHORT和Toast.LENTH_LONG。

这样我们就可以弹出我们的Toast了。

 Menu的使用

menu也是很常见的一个控件:

 

当我们有很多的菜单项需要显示,把他们全部放到我们的页面上是不现实的。这时候我们可以定义一个“收纳箱”将他们收纳进去。

首先,我们需要有一个Menu布局文件:

在res目录下右键,新建一个Directory,命名为menu。

然后在menu右键,新建一个Menu Resource file

然后我们的菜单添加选项:

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android">
 3 
 4     <item
 5         android:id="@+id/item_1"
 6         android:title="泷泽萝拉" />
 7     <item
 8         android:id="@+id/item_2"
 9         android:title="波多野结衣" />
10 </menu>

 

 我们定义了两个项,然后分别定义了id。这样我们的Menu菜单项布局就有了。

接下来我们需要将布局导入进逻辑。

我们在MainActivity.java重写(ctrl+o可以快速重写,在弹出框中键入关键字可以快速定位)onCreateOpinionsMenu方法,这个方法就是系统提供给我们的添加菜单项的方法,我们只需要在这里面添加自己的逻辑就行了。

1 @Override
2 public boolean onCreateOptionsMenu(Menu menu)
3 {
4     getMenuInflater().inflate(R.menu.main, menu);
5     return true;
6 }

 

 

getMenuInflater()返回了一个MenuInflater对象,然后再调用对象的inflate()方法就可以为当前活动创建菜单了。

inflate接收两个参数:第一个是我们Menu的资源文件,第二个表示我们要将这个菜单项要添加到哪个Menu对象中去,然后我们返回true表示显示这个菜单项。

解释下Inflater:android讲究视图与逻辑分离,我们如果想用传统意义上的方法去添加菜单项,就需要自己去手动用menu.add()添加,就像下面这样:

1  @Override
2  public boolean onCreateOptionsMenu(Menu menu)
3  {
4      menu.add("泷泽萝拉");
5      menu.add("波多野结衣");
6      return true;

发现效果是一样的。

但是我们如果有好多个菜单项,这种方法是非常繁琐的。这时候我们就可以采用"直接将布局文件实例化"然后得到文件中的所有选项,这个容器就是MenuInflater。Activity类中的getMenuInflater方法可以获取到这个活动的MenuInflater,并且用MenuInflater().inflate方法可以来设置这个menu的菜单项。

 为Menu添加点击事件

同样,我们可以重写系统给我们提供的方法来实现点击事件。重写onOptionsItemSelected方法,并且为其添加点击事件:

 1 @Override
 2 public boolean onOptionsItemSelected(MenuItem item)
 3 {
 4     switch (item.getItemId())
 5     {
 6         case R.id.item_1:
 7             Toast.makeText(MainActivity.this, "这是泷泽老师", Toast.LENGTH_SHORT).show();
 8             break;
 9         case R.id.item_2:
10             Toast.makeText(MainActivity.this,"这是波老师",Toast.LENGTH_SHORT).show();
11             break;
12         default:
13     }
14     return true;
15 }

 

这个方法接收菜单子项对象,然后我们根据每一项的id来分别处理逻辑事件。

一切正常!

 

ok,这一篇就到这了。

posted @ 2018-11-07 11:45  康先森  阅读(484)  评论(0编辑  收藏  举报