4.Android四大组件之Activity基本用法

一、什么是Activity?


      活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序很少见,毕竟谁也不想让自己的应用永远无法被用户看到。

二、Activity的基本用法?


        2.1 创建工程


        2.1.1 新建名为“ActivityDemo”的安卓工程项目,如下图所示:

   

     2.1.2  根据引导进行设置,到最后一步,与传统方式不同,我们到这一步取消勾选“Create Activity”,如图所示。

    2.1.3 点击 Finish,项目就创建完成了。



注意:如果此时工作空间中不止一个项目,那么建议将不相干的项目关闭掉,仅打开当前工作所需要的项目,不然以后可能会在这方面吃亏。

     2.1.4 最好现在就右击 HelloWorldDemo 项目→Close Project,如图所示。

    2.1.5  关闭后效果图如下所示:

       2.2 创建Activity活动

                   2.2.1 src根目录下创建名为“com.xingyun.activitydemo”的包。

            

                2.2.2 com.xingyun.activitydemo 包→New→Class,会弹出新建类的对话框,我们新建一个名为 FirstActivity的类,并让它继承自 Activity,点击 Finish 完成创建。

代码如下所示:

package com.xingyun.activitydemo;

import android.app.Activity;
import android.os.Bundle;

public class FirstActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}

}

          2.3  创建和加载布局

         Android 程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的,因此我们现在就来手动创建一个布局文件。

         2.3.1 右击 res/layout目录→New→Android XML File,会弹出创建布局文件的窗口

       

         2.3.2 我们给这个布局文件命名为 first_layout,根元素就默认选择为 LinearLayout,点击Finish后如图所示:


这是 ADT 为我们提供的可视化布局编辑器, 你可以在屏幕的中央区域预览当前的布局。在窗口的最下方有两个切换卡,左边是 Graphical Layout,右边是 first_layout.xml。GraphicalLayout是当前的可视化布局编辑器,在这里你不仅可以预览当前的布局,还可以通过拖拽的方式编辑布局。而 first_layout.xml 则是通过 XML 文件的方式来编辑布局,现在点击一下first_layout.xml切换卡,可以看到如下代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    

</LinearLayout>
由于我们刚才在创建布局文件时选择了 LinearLayout 作为根元素, 因此现在布局文件中已经有一个 LinearLayout 元素了。那我们现在对这个布局稍做编辑,添加一个按钮,如图所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <Button 
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button1Name"/>

</LinearLayout>

res/Values/string.xml代码修改如下:

<resources>

    <string name="app_name">ActivityDemo</string>
    <string name="button1Name">button1</string>

</resources>

         这里添加了一个 Button 元素,并在 Button元素的内部增加了几个属性。android:id是给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操作。你可能会对@+id/button_1 这种语法感到陌生,但如果把加号去掉,变成@id/button_1,这你就会觉得有些熟悉了吧,这不就是在 XML中引用资源的语法吗,只不过是把 string替换成了 id。是的,如果你需要在 XML中引用一个 id,就使用@id/id_name 这种语法,而如果你需要在 XML中定义一个 id,则要使用@+id/id_name 这种语法。随后 android:layout_width 指定了当前元素的宽度,这里使用 match_parent 表示让当前元素和父元素一样宽。android:layout_height指定了当前元素的高度,这里使用 wrap_content,表示当前元素的高度只要能刚好包含里面的内容就行。android:text 指定了元素中通过引用res/string.xml中的buttonName来显示的文字内容。

        如果你还不能完全看明白,没有关系,关于编写布局的详细内容我会在下一章中重点讲解,本章只是先简单涉及一些。现在按钮已经添加完了,你可以点回 Graphical Layout 切换卡,预览一下当前布局

可以在中央的预览区域看到,按钮已经成功显示出来了,这样一个简单的布局就编写完成了。那么接下来我们要做的,就是在活动中加载这个布局。

重新回到 FirstActivity,在 onCreate()方法中加入如下代码:

package com.xingyun.activitydemo;

import android.app.Activity;
import android.os.Bundle;

public class FirstActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.first_layout);
	}

}
         可以看到,这里调用了 setContentView()方法来给当前的活动加载一个布局,而在setContentView()方法中,我们一般都会传入一个布局文件的 id。在第一章介绍 gen 目录的时候我有提到过, 项目中添加的任何资源都会在 R 文件中生成一个相应的资源 id, 因此我们刚才创建的 first_layout.xml 布局的 id 现在应该是已经添加到 R 文件中了。在代码中去引用布局文件的方法你也已经学过了,只需要调用 R.layout.first_layout 就可以得到 first_layout.xml布局的 id,然后将这个值传入 setContentView()方法即可。

注意:这里我们使用的 R,是com.xingyun.activitdemo 包下的 R文件,Android SDK还会自动提供一个 android 包下的 R文件,千万别使用错了.

     2.4 在 AndroidManifest 文件中注册

      别忘了前面我有说过, 所有的活动都要在 AndroidManifest.xml 中进行注册才能生效, 那么我们现在就打开 AndroidManifest.xml 来给 FirstActivity注册吧,代码如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xingyun.activitydemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <activity 
            android:name=".FirstActivity"
            android:label="This is First Acvity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        
    </application>

</manifest>

         可以看到,活动的注册声明要放在<application>标签内,这里是通过<activity>标签来对活动进行注册的。

         首先我们要使用 android:name 来指定具体注册哪一个活动,那么这里填入的.FirstActivity 是什么意思呢?

其实这不过就是com.example.activitytest.FirstActivity 的缩写而已。由于最外层的<manifest>标签中已经通过 package 属性指定了程序的包名是com.example.activitytest,因此在注册活动时这一部分就可以省略了,直接使用.FirstActivity就足够了。

         然后我们使用了 android:label指定活动中标题栏的内容,标题栏是显示在活动最顶部的,待会儿运行的时候你就会看到。

需要注意的是,给主活动指定的 label 不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称。

        之后在<activity>标签的内部我们加入了<intent-filter>标签,并在这个标签里添加了<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />这两句声明。

         这个我在前面也已经解释过了,如果你想让 FirstActivity 作为我们这个程序主活动, 即点击桌面应用程序图标时首先打开的就是这个活动, 那就一定要加入这两句声明。另外需要注意,如果你的应用程序中没有声明任何一个活动作为主活动,这个程序仍然是可以正常安装的,只是你无法在启动器中看到或者打开这个程序。这种程序一般都是作为第三方服务供其他的应用在内部进行调用的,如支付宝快捷支付服务。

      好了,现在一切都已准备就绪,让我们来运行一下程序吧!

      在界面的最顶部是一个标题栏,里面显示着我们刚才在注册活动时指定的内容。标题栏的下面就是在布局文件 first_layout.xml 中编写的界面,可以看到我们刚刚定义的按钮。

       2.5 隐藏标题栏

      标题栏中可以进行的操作其实还是蛮多的,尤其是在 Android 4.0之后加入了 Action Bar的功能。不过有些人会觉得标题栏相当占用屏幕空间,使得内容区域变小,因此也有不少的应用程序会选择将标题栏隐藏掉。

      隐藏的方法非常简单,打开 FirstActivity,在 onCreate()方法中添加如下代码:

package com.xingyun.activitydemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class FirstActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
	}

}

其中 requestWindowFeature(Window.FEATURE_NO_TITLE)的意思就是不在活动中显示标题栏,注意这句代码一定要在 setContentView()之前执行,不然会报错。

再次运行程序,如图所示:

         2.6 在活动中使用 Toast

    Toast是 Android 系统提供的一种非常好的提醒方式, 在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间,我们现在就尝试一下如何在活动中使用 Toast。
             首先需要定义一个弹出 Toast 的触发点,正好界面上有个按钮,那我们就让点击这个按钮的时候弹出一个 Toast吧。在 onCreate()方法中添加代码:

package com.xingyun.activitydemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
		
		Button button1=(Button)findViewById(R.id.button1);
		
		button1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(FirstActivity.this,"you click the button1", 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()方法需要传入三个参数。第一个参数是 Context,也就是 Toast要求的上下文,由于活动本身就是一个 Context对象,因此这里直接传入FirstActivity.this即可。 第二个参数是Toast显示的文本内容, 第三个参数是Toast显示的时长,有两个内置常量可以选择 Toast.LENGTH_SHORT 和 Toast.LENGTH_LONG。
现在重新运行程序,并点击一下按钮,如图所示:

         2.7 在活动中使用 Menu

       不知道你还记不记得,在上一章中创建你的第一个 Android 项目时,ADT 在HelloWorldActivity 中自动创建了一个 onCreateOptionsMenu()方法。这个方法是用于在活动中创建菜单的,由于当时我们的重点不在这里,所以直接先忽略了,现在可以来仔细分析一下了。
       手机毕竟和电脑不同,它的屏幕空间非常有限,因此充分地利用屏幕空间在手机界面设计中就显得非常重要了。如果你的活动中有大量的菜单需要显示,这个时候界面设计就会比较尴尬,因为仅这些菜单就可能占用屏幕将近三分之一的空间,这该怎么办呢?不用担心,Android 给我们提供了一种方式,可以让菜单都能得到展示的同时,还能不占用任何屏幕的空间。

             2.7.1首先在 res 目录下新建一个 menu 文件夹,右击 res 目录→New→Folder,输入文件夹名menu,点击 Finish。

             2.7.2接着在这个文件夹下再新建一个名叫 main 的菜单文件,右击 menu文件夹→New→Android XML File


 

                    2.7.3  文件名输入 main,点击 Finish 完成创建。然后在 main.xml 中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
  
   <item 
          android:id="@+id/add_item"
          android:title="Add" 
    />
    
    <item 
        android:id="@+id/remove_item"
        android:title="Remove"
    />

</menu>
这里我们创建了两个菜单项, 其中<item>标签就是用来创建具体的某一个菜单项, 然后通过android:id给这个菜单项指定一个唯一标识符, 通过android:title给这个菜单项指定一个名称。
           2.7.4  然后打开 FirstActivity,重写 onCreateOptionsMenu()方法,代码如下所示

 

package com.xingyun.activitydemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends Activity {

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		getMenuInflater().inflate(R.menu.main, menu);//获取菜单
		return true;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
		
		Button button1=(Button)findViewById(R.id.button1);
		
		button1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				Toast.makeText(FirstActivity.this,"you click the button1", Toast.LENGTH_SHORT).show();//吐司显示
				finish();//销毁活动
			}
		});
	}

}
            通过 getMenuInflater()方法能够得到 MenuInflater对象,再调用它的 inflate()方法就可以给当前活动创建菜单了。inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源,这里当然传入 R.menu.main,第二个参数用于指定我们的菜单项将添加到哪一个 Menu对象当中,这里直接使用 onCreateOptionsMenu()方法中传入的 menu参数。然后给这个方法返回 true, 表示允许创建的菜单显示出来, 如果返回了 false, 创建的菜单将无法显示。

            当然,仅仅让菜单显示出来是不够的,我们定义菜单不仅是为了看的,关键是要菜单真正可用才行,因此还要再定义菜单响应事件。

           FirstActivity中重写 onOptionsItemSelected()方法:

package com.xingyun.activitydemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends Activity {

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		switch (item.getItemId()) {
		case R.id.add_item:
			Toast.makeText(this,"you click add", Toast.LENGTH_SHORT).show();
			break;
		case R.id.remove_item:
			Toast.makeText(this,"you click remove", Toast.LENGTH_SHORT).show();
            break;
		default:
			break;
		}
		return true;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
		
		Button button1=(Button)findViewById(R.id.button1);
		
		button1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				Toast.makeText(FirstActivity.this,"you click the button1", Toast.LENGTH_SHORT).show();
				finish();
			}
		});
	}

}

在 onOptionsItemSelected()方法中,通过调用 item.getItemId()来判断我们点击的是哪一个菜单项, 然后给每个菜单项加入自己的逻辑处理, 这里我们就活学活用, 弹出一个刚刚学会的Toast。

重新运行程序,并按下 Menu 键,效果图如图所示:

可以看到,菜单默认是不会显示出来的,只有按下了 Menu 键,菜单才会在底部显示出来,这样我们就可以放心地使用菜单了,因为它不会占用任何活动的空间。然后点击一下Add 菜单项


       2.8 销毁一个活动

         销毁一个活动方法只要按一下 Back 键就可以销毁当前的活动了。不过如果你不想通过按键的方式,而是希望在程序中通过代码来销毁活动,当然也可以,Activity 类提供了一个 finish()方法,我们在活动中调用一下这个方法就可以销毁当前活动了。

        修改按钮监听器中的代码,如下所示:

package com.xingyun.activitydemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class FirstActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.first_layout);
		
		Button button1=(Button)findViewById(R.id.button1);
		
		button1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				Toast.makeText(FirstActivity.this,"you click the button1", Toast.LENGTH_SHORT).show();
				finish();
			}
		});
	}

}

         重新运行程序,这时点击一下按钮,当前的活动就被成功销毁了,效果和按下 Back 键是一样的。

      


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值