在上一章的学习中,我们已经掌握并成功的创建了自己Android项目。那么接下来,应该开始学习Android的四大组件了,Activity、Service、ContentProvider、 BroadcastReceiver,并且我们要从看得见的地方入手 -- Activity。
一、Activity的概念
Activity是一种可以包含用户界面的组件, 主要用于和用户进行交互。
一个应用程序中可以包含零个或多个活动, 但不包含任何活动的应用程序很少见, 谁也不想让自己的应用永远无法被用户看到吧?
二、Activity的基本用法
虽然在Hello World项目中Android Studio帮我们创建了一个默认的Activity,但是通过手动创建更可以加深对Activity的了解。因此,新建一个项目,选择Add No Activity。
1、手动创建Activity
创建好后,我们看到了熟悉的目录,只是在com.johnhao.testdemo中是空的了。
下面我们可以手动创建Activity了。现在右击 com.cxamplcactivitytcst 包New->Activity->Empty Activity ,会弹出一个创建Activity的对话框,我们将活动命名为FirstActivity,并且不要勾选Generate LayoutFile 和 Launcher Activity这两个选项(因为我们要练习自己创建)。
勾选Generate LayoutFile表示会自动为FirstActivity创建一个对应的布局文件,勾选Launcher Activity表示会自动将FirStActivity 设置为当前项目的主Activity。这里因为咱们要手动创建活动,所以这些自动生成的东西暂时都不勾选。勾选 Backwards Compatibility表示会为项目启用向下兼容的模式,点击 Finish完成创建。
我们知道任何类型的Activity都应该重写onCreate方法,这里Android Studio已经帮我们完成了。
2、创建和加载布局(Layout)
Android 程序的设计讲究逻辑和视图分离, 所以最好每一个活动都能对应一个布局, 布局就是用来显示界面内容的, 因此我们现在就来手动创建一个布局文件。
右击app/src/main/res 目录->New->Directory,先创建一个名为Layout的目录,然后在layout目录创建一个Layout resource file。给他起个名字first_layout,根元素选默认的LinearLayout就可以。
来编辑一下布局文件,添加一个Button控件。我在Button元素内部添加了一些属性:id、text、宽高等等。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/app_name"/>
</LinearLayout>
完成了简单的布局编辑,我们接下来要做的就是在Activity中加载这个布局。
回到FirstActivity,在onCreate中加入setContentView代码
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
}
}
可以看到, 这里调用了 setContentView()方法来给当前的活动加载一个布局, 而在setContentView()方法中, 我们一般都会传入一个布局文件的id。 我们知道,项目中添加的任何资源都会在 R文件中生成一个相应的资源id,因此我们刚才创建的first_layout.xml布局的id已经添加到R文件中了。将R.layout.first_layout传给setContentView()方法,就可以加载这个布局了。
3、注册Activity
在学习Activity的知识的时候,我们了解到所有的Activity都要在Manifest中注册才能生效。而智慧的Android Studio已经帮我们自动添加了,打开AndroidManifest可以看到已经存在activity的标签。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.johnhao.testdemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".FirstActivity"></activity>
</application>
</manifest>
不过目前为止,程序仍然不能运行,因为我们还没配置主Activity。添加如下代码,设置主Activity后,我们的app就能运行了。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.johnhao.testdemo">
<application
...>
<activity android:name=".FirstActivity"
android:label="First Activity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
4、在Activity中使用Toast
Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户。这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
首先定一个触发点,我们在布局上设置了一个按钮,所以我们让点击按钮的时候弹出一个Toast。修改onCreate()方法,添加如下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn_toast = findViewById(R.id.btn_1);
btn_toast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "You click the Button", Toast.LENGTH_LONG).show();
}
});
}
在Activity中,通过findViewById()获取到在布局文件中定义的元素,这里我们传入R.id.btn_1,来得到按钮的实例。接下来通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮的时候就会执行监听器中的onClick()方法。
Toast的用法也很简单,通过静态方法makeText()创建一个Toast对象,然后调用show()发法展示Toast就可以了。makeText需要三个参数,第一个是Context,第二个是要显示的内容,第三个是Toast的显示时长。现在重新Run一下,点击按钮就能看大Toast提示了。
5、在Activity中使用Menu
接下来我们尝试在Activity创建一个菜单。在res目录创建一个menu文件夹,res -> New -> Directory。然后在menu文件夹下新建一个Menu resource file。在xml中添加代码,这里我们添加一个菜单,用<item>标签表示。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_exit"
android:title="@string/exit"/>
</menu>
回到FirstActivity中,重写onCreateOptionsMenu()方法,mac上可以使用快捷键⌃ + o。
在onCreateOptionsMenu()添加代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
通过getMenuInflater()得到MenuInflater对象,再调用它的inflate()方法就可以给当前的Activity创建菜单了。inflate()方法接收两个参数,第一个用于指定通过哪一个资源文件来创建菜单,我们传入的是R.menu.main。第二参数用于指定我们的菜单将添加到哪一个Menu对象中,这直接使用onCreateOptionsMenu()传进来的menu参数。然后给方法返回true,代表允许创建的菜单显示出来。如果为false,创建的菜单将无法显示出来。
创建了菜单,我们还得给它添加对应的相应事件,要不添加它干嘛。重写onOptionsItemSelected()方法。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_exit:
finish();
break;
default:
}
return true;
}
在onOptionsItemSelected()方法中,通过调用item.getItemId()来判断点击的是哪一个item选项。这里我们提供一个销毁Activity的方法finish()。重新运行下程序,点击菜单退出,让我们来看看效果:
到这里第二天的学习就结束了。回顾一下,我们通过手动创建Activity和手动加载布局并注册到Manifest,更深入的了解了Activity的创建过程。并且学习到了如何在Activity中使用Toast,以及给我们的应用添加菜单。
关注获取更多
网友评论