一、 活动是什么
- Activity是一种可以包含用户界面的组件, 主要用于和用户进行交互;一个应用程序可以包含0个或者多个活动;
二、 活动的基本用法
1. 手动创建活动
-
为了更好的理解创建一个活动(Activity)所要完成的工作, 在创建项目的时候, 选择Add no Activity, 这样系统就不会自动帮我们添加一个Activity(活动);
-
创建完成后, 改成Project模式;
-
在src目录下的包目录下新增一个空的Activity, 且不要勾选Generate Layout File和Launcher Activity;
-
勾选Generate Layout File, 系统会自动给创建的Activity创建一个对应的布局文件, 并且添加进逻辑代码中;
-
勾选Launcher Activity会自动将创建的Activity设置为当前项目的主活动;
-
在创建出来的MainActivity.java文件中可以看到onCreate方法;
2. 创建和加载布局
- add no activity创建好项目之后, 可以看到res下没有layout目录(存放布局资源文件), 我们自己创建一个;
- 在res目录下, 右键Android Resource Directory, 新建layout资源文件
- 接着在layout目录下, 新建layout resource file;
- 根元素就默认选择LinearLayout(线性布局)
- 创建好目录之后, 接下来就开始对布局文件进行分析
2.1 分析布局文件
- 布局文件有3中模式可以切换, Code, Split, Design;
- Code : 即纯代码模式, 在这种模式下只能看到代码;
- Split模式:代码和视图混合;
- Design模式(可视化布局编辑器):只有视图, 这种模式比较方便的是可以直接拖动控件对布局进行设计;
- 为布局新增一个Button控件, 代码如下:
- android:id, 代表给当前元素定义一个唯一的标识符; 若要新增一个没有的id名, 就用@+id, 后面跟自定义的id名;而如果要引用Android自带的或者已有的ID名, 就用@id;
- android:layout_width指定当前元素的宽度, match_parent, 让当前元素和父元素一样宽;
- android:layout_height指定当前元素的高度,wrap_content, 指包裹内容, 即元素高度和内容一样高;
- android:text指元素中显示的文字;
3. 在活动中加载布局
- setContentView(R.layout.first_layout);为当前活动加载一个布局;
关键
:项目中添加的任何资源都会在R文件中生成一个相应的资源id, 所以刚才创建的first_layout.xml布局的id已经添加到了R文件中,将这个id传入setContentView中即可为此活动添加一个布局;
4. 在AndroidManifest.xml文件中注册
- exported属性值改为true;
- 可以看到活动的注册声明是放在
<application>
标签内的, 这里是通过<activity>
标签对活动进行注册的;【之前我们在包下手动创建activity的时候,选择的是new 一个empty activity, 所以这里Android Studio会帮我们写<activity>
这个标签的内容, 如果我们用的是创建类的方式去添加一个活动Activity, 则一定要在清单文件上加上<activity android:name=".MainActivity"/>
为活动进行注册, 否则运行会报错】。
4.1 分析清单文件
-
在
<activity>
标签内,android:name
来指定具体注册哪一个活动, 而.MainActivity
其实就是com.example.firsttest的缩写,因为这里在最外层的<manifest>
标签中, 已经通过package
属性指定了程序的包名, 所以这里可以直接使用.MainActivity
-
但这样写, 还只是注册了活动, 程序仍然不能运行;因为当程序运行起来的时候, 还不知道要首先启动哪一个活动, 所以这里还要为程序配置主活动
-
在
<activity>
标签内部加入<intent-filter>
标签:添加如下两句声明<action android:name="android.intent.action.MAIN"/>
表明这个Activity这个项目的主活动;<category android:name="android.intent.category.LAUNCHER"/>
表明当程序运行时, 首先启动的就是这个活动;android:label="First Activity"
, 指定活动中标题栏的内容, 标题栏是显示在Activity最顶部的;并且给主活动指定的label不仅会成为标题栏中的内容, 还会成为启动器(Launcher)中应用程序显示的名称;
-
启动效果如下:
-
总结:
没有将应用程序中的任何一个活动(Activity)设置成主活动, 这个程序仍然可以正常安装, 只是无法在启动器中看到或者打开这个程序【这种程序一般是作为第三方服务供其他应用在内部进行调用的, 比如支付宝的快捷支付服务】;但是应用程序中有活动, 却没有为它注册, 是一定会报错的;
5. 在活动中使用Toast
- Toast是Android系统提供的一种非常好的提醒方式, 在程序中可以使用它将一些短小的信息通知给用户, 这些信息会在一段时间后自动消失, 并且不会占用任何屏幕空间;
- 首先需要定义一个弹出Toast的触发点, 需求: 点击按钮的时候弹出一个Toast, 添加代码如下:
- 通过findViewById()方法获得在布局文件中定义的元素(控件),findViewById方法返回的是一个View对象, 这里需要将其向下转型成Button对象;
- 得到按钮的实例后, 通过调用setOnClickListener()方法为按钮注册一个监听器, 这样点击按钮的时候就会执行监听器中的onClick()方法;
- Toast通过静态方法makeText()创建出一个Toast对象, 接着调用show()方法将Toast显示出来;
- makeText()方法的三个参数:第一个参数Context即Toast要求的上下文(环境), 而活动(Activity)本身就是一个Context对象, 所以这里直接传入MainActivity.this;第二个参数即Toast要显示的内容;第三个参数即Toast显示的时长, Android提供了两个内置常量, Toast.LENGTH_LONG(长时间)和Toast.LENGTH_SHORT(短时间);
6. 在活动中使用Menu
- 手机和电脑相比, 其屏幕空间极其有限, 所以在手机界面设计中要学会充分的利用屏幕空间;
- 如果你的Activity中有大量的菜单需要显示,该如何做?Android提供了一种方式, 使得所有菜单都能得到展示的同时, 还可以不占用任何空间;
6.1. 新建Menu文件
- 在res(资源)目录下新建一个menu文件夹, 接着在这个目录下新建一个菜单文件, 过程如下:
6.2. 创建菜单项
- 输入文件名main之后, 在创建出来的main.xml文件中添加如下的代码:这里只创建了两个(item)菜单项;
<item>
标签是用来创建具体的某个菜单项, 然后通过android:id给这个菜单项指定唯一的标识符, 通过title给这个菜单项指定一个名称;
6.3. 重写onCreateOptionsMenu()方法
- 回到MainActivity活动中, 重写
onCreateOptionsMenu()
方法, 这里写重写方法可以使用ctrl+o组合快捷键:
- 代码如下:
getMenuInflater()
方法能够得到MenuInflater对象(MenuInflater是用来解析定义在menu 目录下的菜单布局文件的,类似于LayoutInflater 是用来解析定义在layout 下的布局文件。), 再调用其inflate()
方法就可以为当前活动创建菜单了。- inflate()方法接收两个参数, 第一个参数用于指定通过哪一个资源文件来创建菜单, 这里传入R.menu.main菜单文件资源ID; 第二个参数指定菜单项将添加到哪一个Menu对象中, 这里直接使用onCreateOptionsMenu()方法中传入的menu参数, 然后返回true, 表示允许将创建的菜单显示出来, 如果返回了false, 创建的菜单将无法显示。
6.4. 定义菜单响应事件
- 重写
onOptionsItemSelected()
方法, 代码如下:
- 在
onOptionsItemSelected()
方法中, 通过调用item.getItemId()来判断点击的是哪一个菜单项, 然后给每一个菜单项加入逻辑代码处理, 比如Toast消息提醒;
- 菜单里面的菜单项默认是不会显示出来的, 当点击菜单按钮(三个点)的时候才会弹出里面具体的内容, 因此它不会占用任何活动(Activity)的空间;
7. 销毁一个活动
- 当你按下Back键, 就可以销毁当前的活动了, 那么用代码该如何实现?
- 将刚才按钮监听器里面的逻辑代码修改一下, 当点击按钮, 当前活动销毁:(效果和Back键一样)