上一篇我们介绍了活动的一些基本知识,也了解了如何创建一个主活动。这篇我们说说使用率相当高的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,这一篇就到这了。