安卓第五夜 维纳斯的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

之前各讲中,分别讲解了安卓的开发环境、架构和基本概念。从这一讲开始,我将制作一个简单的应用,并通过逐步升级它的功能,连带出安卓开发的多个情境。

《维纳斯的诞生》是文艺复兴早期名画。相传美神维纳斯从海的泡沫中诞生,波提切利用大胆的笔触描绘这一古典神话。画面洋溢着对人体和美的热爱。如果在中世纪或者西班牙宗教审判时期,这幅画足够波提切利上火刑架了。 

 

任务描述

我将制作一个简单的欢迎页面。页面中有一个按钮。点击后,将显示制作人姓名。

知识点包括:

  • 新建Activity:通过继承Activity类,来创建一个新的类。
  • 页面布局:LinearLayout
  • 按钮点击监:OnClickListener
  • 临时显示简单的文字信息:Toast用于显示简单的文字信息

 

编写视图

按照安卓第一夜 第一个应用中的介绍,创建一个Android项目Vamei,项目包的名字为me.vamei.vamei。

我将要创建一个页面。这个页面的视图定义在res/layout/activity_main.xml中。从安卓第四夜 概念漫游(下)中,我们已经知道,这个XML文件描述了一个视图树。内容如下:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Welcome" />

    <Button
        android:id="@+id/author"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_text" />

</LinearLayout>

 

 

这里采用了线性布局LinearLayout,根据它的orientation的属性"vertical",视图元素将从上向下排列。线性布局中包含一个TextView,以及一个Button按钮。TextView用于显示文本"Welcome"。

视图元素有layout_width和layout_height属性,分别定义元素的宽度和高度。这两个属性可以是具体的数值,比如"10px",也可以是:

  • "match_parent":与母元素相同
  • "wrap_content":与包含的内容相同,如文字本身的尺寸

Button还有一个id,即author。在程序中我们可以借用这个id来引用该按钮。Button上文本是一个字符串。注意符号@,表示这里引用了一个名为btn_text的字符资源。我们当然可以像"Welcome"那样直接使用一个字符串,但引用字符资源有额外的好处。我们可以在程序的多处重复利用的同一个资源条目,从而便于修改。该字符串保存在res/values/strings.xml中:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Vamei</string>
    <string name="action_settings">Settings</string>
    <string name="author">vamei</string>
    <string name="btn_text">who am I</string>
</resources>

可以看到,名为btn_text的字符串资源为"who am I"。

 

 

编写Activity

上面XML定义的视图是静态的。想要实现动态的应用,我还需要一个配套的Activity。在src文件夹下的me.vamei.vamei包中,会有一个MainActivity.java。这个Java文件中包含一个MainActivity类,继承自Activity。我将其中的代码修改为:

package me.vamei.vamei;

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

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

// attach view tree to the activity
        setContentView(R.layout.activity_main);
                // monitor "click" action for the button
        Button btn = (Button) findViewById(R.id.author);
        btn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,
                        getString(R.string.author),
                        Toast.LENGTH_LONG).show();
            }
        });
    }
}

在这个类中,我只包含了一个onCreate()方法。当应用启动时,安卓将调用onCreate()方法。该方法有一个Bundle类型的参数,记录Activity的状态,我将在以后讲解。

onCreate()方法中主要做了两件事:

  1. 连接Activity与视图树。setContentView()方法为Activity增加了视图树。这里引用了activity_main.xml中的视图树。可以注意到,安卓中用R来代表资源。
  2. 监听按钮的点击事件。因为我们在activity_main.xml中定义了按钮的id,所以可以使用findViewById方法,便捷的引用按钮。View元素可以使用setOnClickListner()方法,为点击事件增加OnClickListener类型的监听对象。

用户点击按钮后,安卓将执行监听对象的onClick()方法。该方法利用Toast,显示一段文本,即R.string.author对应的字符串资源。在res/values/strings.xml中,已经定义该字符串为"vamei"。Toast是一个弹出的文字显示框。makeText()的三个参数分别为弹出框的Context、要显示的字符串和显示时间。

 

注册Activity

已经完成的Activity需要在AndoriManifest.xml中注册。这是安卓应用的配置文件,可以进行许多权限相关的设定。我的AndroidManifest.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="me.vamei.vamei"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="me.vamei.vamei.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

可以看到<activity>标签中注册了MainActivity。<Activity>中还定义了该Activity的Intent Filter,即愿意接收的Intent。

 

运行

运行应用,效果如下:

好吧,这个界面离维纳斯还有点距离…… 

 

总结

一个单页Activity

LinearLayout, TextView, Button

layout_width, layout_height, "wrap_content", "match_parent"

setContentView()

setOnClickListener()

Toast.maketext()

<activity>

 

欢迎继续阅读“Java快速教程”系列文章

 

时间: 2024-09-30 03:43:02

安卓第五夜 维纳斯的诞生的相关文章

安卓第十夜 亚当的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   上一讲介绍了用WebView来抓取一个网页内容.这一讲我将介绍如何在安卓内部直接进行HTTP通信. <亚当的诞生>,西斯廷礼拜堂的吊顶画,米开朗基罗之作.当时的教皇强迫沉迷于雕塑的米开朗基罗画巨幅壁画.米开朗基罗认为这是在浪费自己的才华,充满愤怒的作画.当然,他又成功了.   描述 这一讲中,我将使用JSON,将数据库备份到远程的数据库中.反过来我也将从远程数据库中抓取条目

10天学安卓-第五天

原文:10天学安卓-第五天 经过前几天的练习,相信大家已经对如何做出一个简单的界面有了初步的了解,并且已经做出来一个还不错的天气列表了. 今天大家稍事休息,要练习的内容比较少,着重学习一些理论知识,先理清几个概念. Android系统架构 Android系统本质上是Linux系统,但相对于Linux系统,主要在驱动.性能.内存管理.设备管理等一些部分做了比较多的改动,以更适用于移动设备. 从上图可以看到,Android系统架构为四层,分别是Linux内核.系统运行库.应用程序框架以及应用层,每一

安卓第四夜 概念漫游(下)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在安卓第三夜 概念漫游(上)中,我介绍了安卓最基本的功能单元和Intent的连接方式.在这个骨架之上,我们可以进一步增加一些与开发密切相关的重要概念.   Context 一个应用是由多个Activity和Service这样的功能单元组成.一个应用共享有一个Application Context对象.在功能单元内部,可以用特定的方法来调用该对象.正如名字所表示的,Contex

安卓第三夜 概念漫游(上)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    拿起一个手机,总是满屏的应用图标.点击图标,选择应用,玩一把游戏,刷一下微博,写一篇日记."叮咚"一声,邮件应用提醒有一封新来的邮件.在安卓里,眼花缭乱的应用承载着各种有趣的功能.欢迎来到安卓应用的世界. 每一个应用都是存储在手机中的一段小程序.编写这段小程序,是每个安卓开发者的主要工作.程序运行后成为一个进程后,在进程的内存空间中新建一个Dalvik虚拟机.程序

安卓第六夜 凡高的自画像

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   在上一讲中,我已经制作了一个简单的Android应用.项目的主要文件包括: MainActivity.java activity_main.xml 在这一讲,我将拓展应用的功能,从而允许用户输入个人信息.   <自画像>,凡高.凡高一生不得志,精神更是越来越差.在割掉自己的耳朵一部分后,画家给自己留下了这幅自画像.在当时,这幅画依然是无人问津.   描述 我将创建一个新的A

安卓第八夜 玛丽莲梦露

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    上一讲说明了数据库中存取数据的方法.这一讲将以条目的视图方式,来以相似的视图方式,显示多个数据对象.这种方式特别适合于显示从数据库中取出的多个结构相似的数据,比如多个联系人,或者多个联系人分类. <玛丽莲梦露>,这是一副现代艺术作品.听到玛丽莲梦露自杀的消息后,现代艺术家沃霍尔深为震惊.他通过重复玛丽莲梦露的形象,创作了这幅波普艺术的名作.每一个形象既是重复,又有变化.

安卓第七夜 雅典学院

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    我之前只使用了一种持续保存数据的方法,即SharedPreferences.然而,SharedPreferences只能存储少量松散的数据,并不适合大量数据的存储.安卓带有SQLite数据库,它是一个简单版本的关系型数据库,可以应对更复杂的数据存取需求.我将在这里说明安卓中该数据库的使用方法.这里只专注于安卓中SQLite数据库的接口使用,并没有深入关系型数据库和SQL语言

Java快速教程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!      Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领导了Java的项目小组.该项目的最初只想为家电设计一门容易移植的语言.然而,在获得了Netscape浏览器支持后,Java快速推广,应用广泛. Java受到C和C++的强烈影响.Java与C++相近,都是静态类型,但移除了C++中容易出错的一些特征,比如指针和

安卓第九夜 狂风

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   我们经常需要在安卓应用中包含简易的网页显示功能.我将在这一讲中实现网页的显示. <狂风>,来自小Willem,荷兰画派黄金时代的作品.作为当时海上马车夫的荷兰,对航海题材的画情有独钟. 这种倾斜的船身,是当时的画家常用的手法,用于表现很强的风.   描述 上一讲实现了一个类别条目页面.现在,我希望点击某个类别后,能再次以条目的方式显示所有的联系人.在这个新的条目页面中,点击