Java事件模型与Android事件模型的比较

Java事件模型与Android事件模型的比较
Java事件模型与Android事件模型的比较

Java事件模型与Android事件模型的比较

比较结果:Android借鉴了Java2中的UI事件处理机制,但是,Android 又提供了另一种事件?理器(event handler),而这个方式是否与java1.0事件模型一样呢,有待求证。

Java事件模型:

我们把JDK1.0事件处理模型成为Java1.0事件模型,而从jdk1.1后的版本事件处理模型称为Java 2事件处理模型。

1. Java1.0事件模型:

dispatchEvent()-postEvent()-handleEvent()

在JDK1.0的版本采用用的事件模型,提供了基本的事件处理功能。这是一种包容模型,所有事件都封装在单一的类Event中,所有事件对象都由单一的方法 handleEvent来处理,这些定义都在Component类中。

为此,只有Component类的子类才能充当事件处理程序,事件处理传递到组件层次结构,如果目标组件不能完全处理事件,事件被传递到目标组件的容器。

在Java1.0事件处理模型中事件处理是以如下方法执行的。deliverEvent()用于决定事件的目标,目标是处理事件的组件或容器,此过程开始于GUI层的最外部而向内运作。

当按一个button时,如果检测到是该按钮激发的事件,该按钮会访问它的deliverEvent()方法,这一操作由系统完成。一旦识别目标组件,正确事件类型发往组件的postEvent()方法,该方法依次把事件送

到handleEvent()方法并且等待方法的返回值。

"true"表明事件完全处理,"false"将使postEvent()方法联系目标容器,希望完成事件处理。

2. Java 2事件处理模型:

在Java2处理事件时,没有采用dispatchEvent()-postEvent()-handleEvent()方式,采用了监听器类,每个事件类都有相关联的监听器接口。事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的。

对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener。实现了事件监听者接口中一些或全部方法的类就是事件监听者。

伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自java.util.EventObject。事件状态对象作为单参传递给应响应该事件的监听者方法中。发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实例的引用。

3. Java事件和万事一样有其生命周期,会出生也会消亡。下图3.1给出了Java事件生命周期的示意图:

事件最初由事件源产生,事件源可以是GUI组件Java Bean或由生成事件能力的对象,在GUI组件情况下,事件源或者是组件的同位体(对于Abstract Window Toolkit[awt]GUI组件来说)或组件本身(对于Swing

组件来说)。

事件生成后放在系统事件队列内部。现在事件处于事件分发线程的控制下。事件在队列中等待处理,然后事件从事件队列中选出,送到dispatchEvent()方法,dispatchEvent()方法调用processEvent()方法并将事件的一个引用传递给 processEvent()方法。

此刻,系统会查看是否有送出事件的位置,如果没有这种事件类型相应的已经注册的监听器,或者如果没有任何组件受到激活来接收事件类型,事件就被抛弃。当然上图显示的是AWTEvent类的子类的生命周期。 dispatchEvent()方法和processEvent()方法把AWTEvent作为一个参数。但对,javax.swing.event并不是AWTEvent子类,而是从EventObject直接继承过来,生成这些事件的对象也会定义fireEvent()方法,此方法将事件送到包含在对象监听器列表内的那种类型的任何监听器。

3.2 Java事件捕获

从上面的分析我们知道,任何事件产生到 dispatchEvent()方法分发方法前,所有的事件都是存放在系统事件的队列中,而且所有的事件都由dispatchEvent()方法来分派。所以只要能重载dispatchEvent()方法就可以获取系统的所有事件,包括用户输入事件。一般来说,系统事件队列的操作对用户来说是可以控制。它在后台自动完成所要完成的事情,使用EventQueue类可以查看甚至操纵系统事件队列。

Java提供了EventQueue类来访问甚至操纵系统事件队列。EventQueue类中封装了对系统事件队列的各种操作,除dispatchEvent()

方法外,其中最关键的是提供了push()方法,允许用特定的EventQueue 来代替当前的EventQueue。

只要从EventQueue类中派生一个新类,然后通过push()方法用派生类来代替当前的EventQueue类即可。这样,所有的系统事件都会转发到派生EventQueue类。

而在实际的开发中,我们并不关心事件的分派方式,也就是说,并不会重载dispatchEvent(),

因为我们的目的并不是取系统的所有事件,而是对感兴趣的事件(例如,按键,鼠标的按下与释放)进行处理,而这些事件不会凭空产生,是由事件源(例如,button,window这些GUI组件产生的)。另一个原因是,java2中已经给我们提供了事件监听这种处理方式,而且是非常安全的,并且也易于开发,

4. 如何使用事件处理模型对事件进行处理:

作为一个程序开发者,我们所要做的是创建事件监听器对象并且在被激活事件的组件中进行注册。在java中,每一个组件会产生什么样的事件,已经被定义好了。或者说,对于任何一个事件来说,哪些组件可以产生它,已经是确定的了。

(1) 为了创建事件监听器以及在被激活事件的组件中进行注册,需要了解以下四个组件概念。

事件类、事件监听器、事件处理器和适配器四个组件。

事件类:见图4.1

事件监听器:是interface, 形中XXListener,而且,在java中,

这些interface已经被定义好了。用来被实现,它定义了事件处理器(即事件处理的方法原型,这个方法需要被重新实现)。例如,ActionListener接口,

MouseListener接口

WindowListener接口

KeyListener接口

ItemListener接口

MouseMotionListener接口

FocusListener接口

ComponentListener接口

适配器:因为对于有的事件监听器来说(例如,MouseListener

),java已经提供了实现它的类,那么我们就可以直接继承这个类,来处理事件。

Java提供了表示不同的事件的类, java.util. EventObject是事件顶层类,其层次结构如下:

图4.1

需要说明的是:

? EventObjet类提供了getSource()方法获取产生事件的源对象。

? AWTEvent类提供了getID() 方法返回事件本性的标识符。例如,如果鼠标事件发生,能够查出是单击、拖拉、按、还是其他操作。

(2)程序开发步骤:

所谓的创建事件监听器对象,就是创建一个类,而这个类必须实现

形如XXListener的接口(或者继承”已经实现了XXListener的类”),当然,实现这个接口就意味着重写XXListener的方法。例如,对于ActionListener, 只有一个actionPerformed方法:

class B1 implements ActionListener { // 实现ActionListener public void actionPerformed(ActionEvent e) { //重写actionPerformed getAppletContext().showStatus("Button 1");

}

在被激活事件的组件中注册事件监听器: 即调用形如addXXListener()的方法,例如:

Button b1 = new Button("Button 1"),b1.addActionListener(new B1());

//注册事件监听器,b1就是被激活事件的组件这样一来,当事件被激活时,处理流程如下(根据图3.1对照来看):由于已经通过addActionListener进行了事件监听器的注册,所以,就会调用到特定的事件处理方法,即actionPerformed()函数。这样,执行的结果就要看actionPerformed是具体做什么工作了。完整的例子(来源于think in java 13.16.1节): //: Button2New.java// Capturing button pressesimport java.awt.*;import java.awt.event.*; // Must add thisimport java.Applet.*; public class Button2New extends Applet { Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); public void init() { b1.addActionListener(new B1()); b2.addActionListener(new B2()); add(b1); add(b2); } class B1

implements ActionListener { public void actionPerformed(ActionEvent e) { getAppletContext().showStatus("Button 1"); } } class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { getAppletContext().showStatus("Button 2"); } }} 这是最常用的一种方式:定义一个内部类,来实现ActionListener监听器。而在外部类中,定义一个这样的对象,去注册监听器,通过调用addActionListener方法,需要注意的是,这个内部类对象是作为addActionListener的参数,在本类中,是直接作为匿名对象被创建的。这里,也可以不用匿名对象,而直接new 一个对象,然后,这个对象作为参数传给addActionListener。考虑:不用匿名对象与用匿名对象的区别? 更多的例子,请参考《think in java 13.16》,推荐编码方法见《think in java 13.16.7推荐编码方法》 Android事件模型(从UI角度来说):从网上摘抄了一些相关文章(共5篇),从这几篇文章来看,Android事件模型与java2的事件模型处理方式一样,对事件的处理,都是采用事件监听器的方式来实现的。

文章1:

Jollen 的 Android 教?,#15: 什?是事件毕?器(Event Listener)?

???生基本的UI後,接著就要??UI的事件?理(UI Events),才能?UI 陪使用者「互?」。

什?是事件毕?器(Event Listener)

UI的使用者事件?理,即View如何?理使用者的操作,是一?重要的疹铨。View是重要的??,它是陪使用者互?的前?;在Android框架的韵?中,以事件毕?器(event listener)的方式??理UI的使用者事件。Android框架提供了非常良好的UI事件?理?制。先前的教?提到,View 是捞氧UI的??,每?View物件都可以向Android框架暂?一?事件毕?器。每?事件毕?器都包含一?回呼函?(callback method),

呃?回呼函?(callback method)主要的工作就是回?或?理使用者的操作。

Event Listener: 以Click Listener?例

以「使用者狱碰(touch)」的?作?真,?View要?理使用者狱碰的事件?,就要向Android框架暂?View.OnClickListener事件毕?器;?「touch」事件办生?,Android框架便回呼事件毕?器彦的回呼函?。

View.OnClickListener是click listener,故名思意,呃是UI的「Click?作毕?器」;?使用者?View咄行Click操作?(即狱控?面上的UI 元件),Android 框架便?回呼呃?View.OnClickListener的回呼函?。

View.OnClickListerner的回呼函??OnClick()。

呃彦所提到的毕?器泛指event listener,主要用?「毕?」使用者的各肺?作。除了View.OnClickListener外,Android框架?有以下的event listener(及其callback method):

·View.OnL ongClickListener: onLongClick()

·View.OnFocusChangeListener: onFocusChange()

·View.OnKeyListener: onKey()

·View.OnTouchListener: onTouch()

·View.OnCreateContextMenuListener: onCreateContextMenu()另外一肺?理UI事件的?制?事件?理器(event handler),event handler陪event listener是不一?的二肺?理?制。在自?Android component的教?彦,再介铰呃?部份。

文章2:

如果玩过数独游戏,就会知道该游戏有时候非常容易,而有时候简直令人抓狂。因此,当用户选择New Game按钮时,就应该弹出一个对话框,要求用户从3个难度级别中选择一个。在Android中,从事件列表中选择某个事件非常容易实现。首先,需要在res/values/strings.xml文件中再添加几个字符串:

其次,使用数组资源在res/values/arrays.xml文件中创建难度列表:

然后,在Sudoku类中再导入几个包:

最后,在onClick()方法的switch语句中添加处理New Game按钮单击事件的代码:

其中,openNewGameDialog()方法的作用是创建一个处理难度列表的用户界面。

setItems()方法有两个参数:条目列表的资源ID和一个监听器,用户选择某个条目时,该监听器将被调用。

现在,运行该程序并按下New Game,将会出现如图3-12中所示的对话框。

图3-12 选择难度级别对话框

实际上,此时我们并不打算开始一次新游戏。因此,当用户选择某个难度级别时,该程序只是利用Log.d()方法输出一条调试消息。Log.d()方法接收两个参数:一个标记字符串和要输出的一条消息。

文章3:

Widget中事件监听器的实现

Widget中事件监听器的实现

widget中是没有click listener的,那么如何实现点击的动作呢?我们可以通过广播的形式来替代click linstener。

我们知道widget其实就是一个BroadcastReceiver,所以在AndroidManifest.xml中,注册一个新的action:

< receiver android:name="XXX">

< meta-data android:name="android.appwidget.provider"

android:resource="@xml/XXX">

< /meta-data>

< intent-filter>

< action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> < action android:name="com.android.CLICK">

< /intent-filter>

< /receiver>

代码中需要触发点击事件的地方发送一个广播:

Intent intent = new Intent("com.android.CLICK");

PendingIntent pi = PendingIntent

.getBroadcast(context, 0, intent, 0);

views.setOnClickPendingIntent(R.id.textview, pi);

在widget的onReceive() 方法中接收这个广播:

public void onReceive(Context context, Intent intent) {

super.onReceive(context, intent);

String action = intent.getAction();

if (action.equals("com.android.CLICK")) {

//TODO 处理点击事件

}

}

这样就完成了widget中的一次点击事件

TOP

文章4:

Reference/android/view/View

From Android中文网

Android中文网(https://www.360docs.net/doc/c710504686.html,) 版权申明 : creativecommons licenses

Jump to: navigation, search

android.view

公有类

android.view.View

https://www.360docs.net/doc/c710504686.html,ng.Object

android.view.View Drawable.Callback KeyEvent.Callback

视图(View)类代表了一种基本的用户界面组成模块。一个视图占据了屏幕上的一个矩形区域,并响应绘制图形和事件处理。视图类是窗体类(Widget)的基类,而窗体类用来生成可交互的用户图形接口(interactive GUI)。

视图类的使用窗口中所有的视图构成一个树形结构。要想增加视图,既可以用直接添加代码的方法,也可以在一个或者多个XML文件中声明新视图构成的树。在视图类的子类中,有的可以用来控制,有的具有显示文字、图片或者其他内容的功能。

当视图树被创建后,以下这若干种通用操作将可以被使用: 1.设置属性(properties):比如,可以设置TextView类的一个实例的文本内容。不同的子类可以用来设置的属性与方法不同。注意:只有编译时能够检测到的属性才可以在XML布局管理(layout)文件中设置。

2.设置输入焦点(focus):为了响应用户输入,整个框架将处理移动的焦点。如果想把焦点强制指向某一个特定的视图,必须调用requestFocus()方法。

3.设置监听器(listener):在视图中,允许设置监听器来捕获用户感兴趣的某些事件。比如说,在所有的视图中,无论视图是获得焦点还是失去焦点,都可以通过设置监听器来捕获。可以通过调用setOnFocusChangeListener(View.OnFocusChangeListener)来注册一个监听器。在其他视图子类中,提供了一些更加特殊的监听器。比如,

一个按键(Button)可以触发按键被按下的事件。

4.设置是否可视(visibility):可以通过调用setVisibility(int)来显示或者隐藏视图。

安卓按钮单击事件

第一种:匿名内部类作为事件监听器类 大部分时候,事件处理器都没有什么利用价值(可利用代码通常都被抽象成了业务逻辑方法),因此大部分事件监听器只是临时使用一次,所以使用匿名内部类形式的事件监听器更合适,实际上,这种形式是目前是最广泛的事件监听器形式。上面的程序代码就是匿名内部类来创建事件监听器的!!! 对于使用匿名内部类作为监听器的形式来说,唯一的缺点就是匿名内部类的语法有点不易掌握,如果读者java基础扎实,匿名内部类的语法掌握较好,通常建议使用匿名内部类作为监听器。 第二种:内部类作为监听器 将事件监听器类定义成当前类的内部类。1、使用内部类可以在当前类中复用监听器类,因为监听器类是外部类的内部类,2、所以可以自由访问外部类的所有界面组件。这也是内部类的两个优势。上面代码就是内部类的形式!! 第三种:Activity本身作为事件监听器

这种形式使用activity本身作为监听器类,可以直接在activity类中定义事件处理器方法,这种形式非常简洁。但这种做法有两个缺点:(1)这种形式可能造成程序结构混乱。Activity 的主要职责应该是完成界面初始化;但此时还需包含事件处理器方法,从而引起混乱。(2)如果activity界面类需要实现监听器接口,让人感觉比较怪异。 上面的程序让Activity类实现了OnClickListener事件监听接口,从而可以在该Activity类中直接定义事件处理器方法:onClick(view v),当为某个组件添加该事件监听器对象时,直接使用this作为事件监听器对象即可。 第四种:外部类作为监听器 ButtonTest类 当用户单击button按钮时,程序将会触发MyButtonListener监听器 外部MyButtonListener类

AndroidUI基本控件与事件处理

《Android基础应用》 AndroidUI基本控件与事件处理 ?本章任务 ?使用Android开发本息计算器程序 ?使用Android开发华氏-摄氏温度转换器 ?本章目标 ?熟悉掌握本章基本控件的使用 ?熟练掌握Android常用事件 1.Android基本控件 Android应用开发的一项内容就是用户界面的开发,Android提供了大量功能丰富的UI组件,大部分放在android.widget包及其子包android.view包及其子包 在Android当中View类是最基本的一个UI类,基本上所有的高级UI组件都是继承View类而实现的。如Button(按钮),list(列表),EditText(编辑框),RadioButton(多选按钮),Checkbox(选择框)等都是View类 在Android中,我们可以在Xml文件中使用UI组件也可以在java文件中创建UI组件官方建议采用xml方式,这样的话能够实现界面和代码分离 1.1TextView和EditText TextView是一种用于显示字符串的控件 EditText则是用来输入和编辑字符串的控件,EditText是一个具有编辑功能的TextView

TextView和EditText基本属性 ●android:id设置ID,通过编码可以找到这个组件 ●android:layout_width设置在屏幕上的宽度 ●android:layout_height设置在屏幕上的高度 fill_parent强制性地使构件扩展,以填充布局单元内尽可能多的空间 wrap_content强制性地使视图扩展以显示全部内容 ●android:text设置显示的文本信息 ●android:textColor设置文本颜色 ●android:textSize设置文本尺寸

第5章Java图形界面编程与事件响应

5.1 抽象窗口工具集AWT 5.1 抽象窗口工具集AWT 设计Java图形用户界面(GUI, Graphics User 5.1 抽象窗口工具集AWT(续1完) java.awt AWT核心包,包括组件类,事件类等 5.2 Java图形类(续1) 5.4 容器与容器类组件 (1)容器有一定范围,容器一般都是矩形,容器范围边界可

5.4 容器与容器类组件(续1) 5.4 容器与容器类组件(续2完) 5.5 Java事件类(续1) 5.5 Java事件类(续2完) 5.6 Java事件响应机制 5.6 Java事件响应机制(续1)

5.6 Java事件响应机制(续2) 5.6 Java事件响应机制(续3) 5.6 Java事件响应机制(续4) 5.6 Java事件响应机制(续5) 5.6 Java事件响应机制(续6) 5.6 Java事件响应机制(续7)

5.6 Java事件响应机制(续8) 组件可以响应的事件 5.6 Java事件响应机制(续9) 5.6 Java事件响应机制(续10)例5.1一个多监听的例子。5.6 Java事件响应机制(续11) //第一个内嵌事件响应类 5.6 Java事件响应机制(续12) //第二个内嵌事件响应类5.6 Java事件响应机制(续13) //第三个内嵌事件响应类

5.6 Java事件响应机制(续14) public void display()5.6 Java事件响应机制(续15完) public static void main(String args[]) { C5_1 c=new C5_1(); c.display(); } Ch5-26 5.7 Java事件适配器 5.7 Java事件适配器(续1) Listener接口对应的Adapter抽象类 5.7 Java事件适配器(续2) 例5.2将例5.1改造成Adapter类事件处理方式。5.7 Java事件适配器(续3完) class MyEvent2 extends WindowAdapter

Java程序设计与实践教程 王薇主编 答案

第1章JAVA简介 一、判断题 1.√ 2.√ 3.? 4.? 5.? 6.√ 7.√ 8.√ 9.? 10.? 二、填空题 1.Application Applet 2. 类(字节码文件、目标文件) .class 3.对象 4. 主 5. J2SE J2EE J2ME 三、选择题 1.B 2. D 3.B 4.B 5. A 四、简答题 1.参考答案 Java语言是简单的、面向对象的、分布式的、健壮的、安全的、体系结构中立的、可 移植的、编译解释型的、高性能的、多线程的、动态的等等。 2.参考答案 Java程序执行的具体过程如图1所示。 图1 Java程序的运行机制 3.参考答案 Java程序在计算机在执行要经历以下几个阶段: (1)使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境 (JCreater、Eclipse、MyEclipse等)编辑Java源文件,其文件扩展名为.java。 (2)通过编译使.java的文件生成一个同名的.class文件。 (3)通过解释方式将.class的字节码文件转变为由0和1组成的二进制指令执行。 在以上阶段中可以看出Java程序的执行包括了编译和解释两种方式。 第2章Java 语法基础 一、判断题

1. ? 2.√ 3. ? 4.? 5.? 二、填空题 1.10 2. 单精度双精度 3. n%13 !=0?false:true 4.接口 5. false 三、选择题 1.D 2. C 3.D 4.A 5. C 第3章程序流程控制 一、判断题 1.错误 2.? 3.? 4.? 5.√ 二、填空题 1.循环 2. if 3.case switch 4. while do-while 5. continue 三、选择题 1.D 2. C 3.C 4.B 5. C 第4章数组 一、判断题 1. ? 2. √ 3. √ 4. √ 5.? 二、填空题 1.类型 2. new 3.长度 4. 分配空间 5. 3 6 9 三、选择题 1.D 2. A 3.C 4.B 5. B 第5章类和对象 一、判断题 1.√ 2.√ 3.? 4.? 5.√ 6.? 7.√ 8.? 9.? 10.√ 11.√ 12.√ 13.? 14.? 15. ? 二、填空题 1.public default 2. class 属性方法 3.public static void main(String args[]){} 4. new

实验五Java事件处理

实验五Java事件处理 实验目的 1.掌握Java语言中的事件处理方法 2.掌握Java语言中事件源、监视器和处理事件的接口的概念 实验内容 1.图形用户界面设计程序(ArtFo nt.java) 在实验三第1题的基础上,添加事件处理机制,并逐步完善程序功能。分别用ArtFont 类的对象做监视器和匿名内部类的对象做监视器实现。 要求实现如下功能: 当在文本框中输入文字后回车,在文本域中显示输入的文字。当分别选择粗体和斜体 复选框时,文本域中的文字分别显示粗体和斜体样式。 当点击颜色按钮时,出现颜色选择对话框,选择需要的颜色,按确定按钮后,按钮的 前景色和文本域的前景色设置为选定的颜色。 当选择字体样式下拉框中的某一字体样式时,文本域中的文字设置为指定的字 体样式。 当选择字体大小下拉框中的某一字体大小时,文本域中的文字设置为指定的字 体大小。 当选择窗体样式下拉框中的某一窗体效果时,窗体外观改变为指定的窗体外观。 图1程序界面运行效果 package Sy; import java.awt.*; import java.awt.event.*;

import javax.swing.*; public class ArtFont extends JFrame { static ArtFont artFont; JComboBox fontType;// 字体样式下拉框 JComboBox fontSize;// 字体大小下拉框 JComboBox windowStyle;// 窗体样式下拉框 JCheckBox boldBx;// 粗体按钮 JCheckBox italicBx;// 斜体按钮 JButton colorBtn;// 颜色按钮 String[] fontNames;// 字体名称 String[] fontSizes;// 字体大小 JLabel label;// 输入提示标签 JTextField inputText;// 文字输入框 JTextArea txtArea;// 文字显示区 JPanel northPanel;// 字体设置 JPanel centerPanel;// 显示效果区 JPanel southPanel;/样式设置 Font font; int boldStyle, italicStyle; int fontSizeStyle; String fontNameStyle; Color colorStyle = Color.black;// 设置字体的默认颜色为黑色 String[] style = { "默认显示效果 ", "Windows 显示效果 ", "Unix 显示效果 " }; public ArtFont() { super(”字体设置"); // 设置默认字体 boldStyle = 0; italicStyle = 0; fontSizeStyle = 10; fontNameStyle = "宋体 ";

Android OnTouchListener触屏事件接口

Android OnTouchListener触屏事件接口 OnTouchListener接口是用来处理手机屏幕事件的监听接口,当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。该接口中的监听方法签名如下。 Java代码: public boolean onT ouch(View v, MotionEvent event) 参数v:参数v同样为事件源对象。 参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息。 节中介绍了一个在屏幕中拖动矩形移动的案例,本节将继续采用该案例的思路,通过监听接口的方式实现在屏幕上拖动按钮移动的案例。开发步骤如下。 创建一个名为Sample的Android项目。 准备字符串资源,打开strings.xml文件,用下列代码替换原有代码。 Java代码: Hello World, Sample Sample 位置 说明:与前面介绍的案例相同,对程序中用到的字符串资源进行定义。 开发布局文件。打开res/layout目录下的main.xml,用下列代码替换其原有代码。

Java代码:

相关文档
最新文档