以下说明基于Android Studio,简称AS。(红色字体为自行添加,注在醒目)
具体包括:
- 创建活动
- 创建项目
- 加载布局
- 在AndroidManifest文件中注册
- 活动中使用(提醒)Toast
- 在活动使用(菜单)menu
- 销毁活动
所谓活动(Activity):是一种包含用户界面的组件,主要用于和用户进行交互。
在Android Studio 内进行新建项目ActivityTest,项目报名默认为,com.example.ActivityTest,其余步骤默认即可。然后一个项目就创建完成。
- 手动创建活动:
步骤:创建项目(可以勾选Generate Layout File),假如此时已经创建好一个活动,及其对应的一个布局文件,然后默认重写onCreate()方法,-> 布局文件已经创建好,编辑布局xml文件(比如可以添加一个Button,但是然后要在对应的Activity文件加载这个Button.)->所有的活动都要在AndroidManifest.xml中进行注册才能进行生效,但是AS已经自动将活动在AndroidManifest.xml中注册了->配置主活动,添加<action android:name="android.intent.action.MAIN" />以及 <category android:name="android.intent.category.LAUNCHER" />表示主活动。
找到com.example.activity包右击新建Empty Activity,活动命名为FirstActivity,不要勾选Generate Layout File(会自动创建一个对应的布局文件Layout,在res目录的Layout目录下) 和Launcher Activity(会自动设置为当前项目的主活动),但要勾选Backwards Compatibility 表示选择向下兼容模式。然后完成创建。
项目中的任何活动都应该重写Activity的onCreate()方法,这一步骤AS会帮我们自动完成,默认实现。代码如下:
package com.example.activitytest;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;public class FirstActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//调用了父类的onCreate()方法}
}
Android程序讲究逻辑和视图分离,最好每个活动对应一个布局,所谓布局是指用来显示界面内容的,因为上一步没有勾选Generate Layout File,所以我们要手动创建一个布局文件。右击res目录的layout的目录,新建Layout resource file,命名为first_layout,根元素默认为LinearLayout(线性布局)。
在first_layout.xml文件下,Text通过XML文件的方式来编辑布局的,点击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"></LinearLayout>
在创建布局时,选择了以LinearLayout为根元素,因此现在布局文件中有了一个LinearLayout元素了,对布局文件进行编辑,添加一个按钮,如下所示:
<?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"><Buttonandroid:id="@+id/button_1"//当前元素的唯一标识符android:layout_width="wrap_content"//当前元素的宽度android:layout_height="match_parent" //当前元素的高度android:text="Button 1"/>//当前元素中显示的文字内容
</LinearLayout>
一个按钮就成功的显示出来了。接下来我们在活动中加载这个布局,返回到FirstActivity,在onCreat()方法中加入代码。
package com.example.activitytest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class FirstActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.first_layout);//调用了setContenView()方法来给当前的活动加载一个布局,而在setContentView()方法中,我们一般会传入一个布局文件的id(项目中添加的任何资源都会在R文件中生成一个相应的资源id,只需要调用R.layout.first_layout就可以得到first_layout.xml布局的id)}
}
所有的活动都要在AndroidManifest.xml中进行注册才能进行生效,而FirstActivity已经在AndroidManifest.xml中注册过了,打开AndroidManifest.xml文件,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.activitytest"><applicationandroid: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=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>*/ 注释符内先别在意。<activity android:name=".FirstActivity"></activity></application>
</manifest>
活动的注册声明要放<application>标签内,这里时通过<activity>来对活动进行注册。很明白:是AS自动完成了对FirstActivity的注册。<activity>标签中我们使用了android:name来指定具体注册哪一个活动,这里填入.FirstActivity(com.example.activitytest.FirstActivity的缩写)。这是由于最外层的<manifest>标签中已经通过package属性指定了程序的包名是com.example.activitytest。
不过,仅仅注册了活动,程序是不能运行的,还没有为程序配置主活动,程序运行先从主活动开始。配置主活动的方法是在<activity>标签的内部加入<intent-filter>标签,并在这个标签中添加<action android:name="android.intent.action.MAIN" />以及<category android:name="android.intent.category.LAUNCHER" />这两句的声明即可。
这部分就是我们上面用注释符/**/注解掉的部分。除此之外,我们还可以是使用android:lable指定活动中标题栏的内容,标题栏是显示在活动最顶部的,给主动指定的lable不仅会成为标题栏的内容,还会成为启动器(Launcher)中应用程序显示的名称。再次打开AndroidManifest.XML文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.activitytest"><applicationandroid: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"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>
不出所料,现在程序无bug,已经可以开始运行。
- 在活动中使用Toast
Toast是一种非常好的提醒方式,在程序中可以使用它将一些短小的消息通知给用户,过一段时间会自动消失。在活动中使用Toast。首先定义一个弹出Toast触发点,正好界面有一个按钮,我们就让点击这个按钮的时候弹出一个Toast吧,在onCreat()方法中添加如下代码:
package com.example.activitytest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;public class FirstActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first_activity);Button button1 = (Button)findViewById(R.id.button_1);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(FirstActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show();}});}
}
在活动中通过findViewById()方法获取到在布局文件中定义的元素,这里传入的为R.id.button_1,来得到这个按钮的实例,这个值是在first_layout.xml中通过android:id指定的。findViewById()方法返回是一个View对象,我们将它向下转型为Button对象。得到按钮对象实例后,通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮就会执行监听器中的onClick()方法。因此,弹出Toast的功能当然是在OnClick()中编辑。
Toast的用法灰常简单,用过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来就可以了。
makeText()方法需要传入3个参数,第一个参数是Context,就是Toast要求的上下文,由于活动本身就是一个Context对象,因此这里这要传入FirstActivity.this就行了。第二个参数是Toast显示的内容。第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
重新运行,并点击按钮,如下图:
- 在活动中使用menu
菜单(menu)作用节省空间。
右击res目录下new一个Directory,输入文件名menu。然后右击menu文件new一个Menu resource file 命名为main。点击完成。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/add_item"android:title="Add"/><itemandroid:id="@+id/remove_item"android:title="Remove"/>
</menu>
这里创建了两个菜单项,其中<item>标签就是用来创建具体的菜单项,然后通过android:id给这个菜单项指定一个唯一的标识符,通过android:title给这个菜单项指定一个名称。
然后回到FirstActivity来重写onCreatOptionMenu()方法,重写方法使用Ctrl+O,然后在onCreatOptionMenu()方法中编写如下代码:
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main,menu);return true;
}
通过getMenuInflater()方法能够得到MenuInflater对象,在调用它的inflate()方法,就可以给当前活动创建菜单了。inflate()方法接受两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里传入R.menu.main,可以理解为就是所在的目录地址。第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。然后给这个方法返回true,表示允许创建的菜单显示出来,如果返回false,表示创建菜单无法显示。
以上步骤,仅仅是让菜单显示出来,但是并不能真正的使用。因此还要定义菜单响应事件,在FirstActivity中重写onOptionsItemSelected()方法,代码如下:
public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()){case R.id.add_item:Toast.makeText(this,"You clicked Add",Toast.LENGTH_SHORT).show();break;case R.id.remove_item:Toast.makeText(this,"You clicked Remove",Toast.LENGTH_SHORT).show();break;default:}return true;}
在onOptionsItemSelected()方法中,通过调用item.getItemId()来判断我们点击的是哪一个菜单项,然后给每一个菜单项一个逻辑处理,弹出一个Toast。运行之后,如下图,
- 销毁一个活动
如何销毁一个活动呢?按一下back键就可以销毁当前的活动了,也可以使用另一种方法,Activity类提供了一个finish()方法,在活动中调用一下这个方法就可以销毁当前活动了。代码如下:
button1.setOnclickListener(new View.OnClickListener){@overridepublic void onClick(View v){ finish(); }
}
注:此次一系列android 文章,均有参考郭霖书籍《第一行代码》,再一次无法抑制对大牛的崇敬。