Android第二讲.docx
- 文档编号:5686922
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:18
- 大小:624.76KB
Android第二讲.docx
《Android第二讲.docx》由会员分享,可在线阅读,更多相关《Android第二讲.docx(18页珍藏版)》请在冰豆网上搜索。
Android第二讲
Android讲解
第一讲
1.Android概述
2.开发环境的搭建
3.创建第一个Android应用程序
4.Android程序的结构分析
1.src
毫无疑问,src目录是放置我们所有Java代码的地方,它在这里的含义和普通Java项目下的src目录是完全一样的,展开之后你将看到我们刚才创建的HelloWorldActivity文件就在里面。
2.gen
这个目录里的内容都是自动生成的,主要有一个R.java文件,你在项目中添加的任何资源都会在其中生成一个相应的资源id。
这个文件永远不要手动去修改它。
3.assets
这个目录用得不多,主要可以存放一些随程序打包的文件,在你的程序运行时可以动态读取到这些文件的内容。
另外,如果你的程序中使用到了WebView加载本地网页的功能,所有网页相关的文件也都存放在这个目录下。
4.bin
这个目录你也不需要过多关注,它主要包含了一些在编译时自动产生的文件。
其中会有一个你当前项目编译好的安装包,展开bin目录你会看到HelloWorld.apk,把这个文件拷到手机上就可以直接安装了。
5.libs
如果你的项目中使用到了第三方Jar包,就需要把这些Jar包都放在libs目录下,放在这个目录下的Jar包都会被自动添加到构建路径里去。
你可以展开上图中Android6.0、AndroidPrivateLibraries、AndroidDependencies这些库,其中显示的Jar包都是已经被添加到构建路径里的。
6.res
这个目录下的内容就有点多了,简单点说,就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下,前面提到的R.java中的内容也是根据这个目录下的文件自动生成的。
当然这个目录下还有很多的子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。
7.AndroidManifest.xml
这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册。
另外还可以在这个文件中给应用程序添加权限声明,也可以重新指定你创建项目时指定的程序最低兼容版本和目标版本。
由于这个文件以后会经常用到,我们用到的时候再做详细说明。
8.project.properties
这个文件非常地简单,就是通过一行代码指定了编译程序时所使用的SDK版本。
我们的HelloWorld项目使用的是API14,你也可以在这里改成其他版本试一试。
详解项目中的资源
所有以drawable开头的文件夹都是用来放图片的,所有以values开头的文件夹都是用来放字符串的,layout文件夹是用来放布局文件的,menu文件夹是用来放菜单文件的。
怎么样,是不是突然感觉清晰了很多?
之所以有这么多drawable开头的文件夹,其实主要是为了让程序能够兼容更多的设备。
在制作程序的时候最好能够给同一张图片提供几个不同分辨率的副本,分别放在这些文件夹下,然后当程序运行的时候会自动根据当前运行设备分辨率的高低选择加载哪个文件夹下的图片。
当然这只是理想情况,更多的时候美工只会提供给我们一份图片,这时你就把所有图片都放在drawable-hdpi文件夹下就好了。
知道了res目录下每个文件夹的含义,我们再来看一下如何去使用这些资源吧。
比如刚刚在strings.xml中找到的Helloworld!
字符串,我们有两种方式可以引用它:
1.在代码中通过R.string.hello_world可以获得该字符串的引用;
2.在XML中通过@string/hello_world可以获得该字符串的引用。
5.日志工具的使用
Android中的日志工具类是Log(android.util.Log),这个类中提供了如下几个方法来供我们打印日志。
1.Log.v()
这个方法用于打印那些最为琐碎的,意义最小的日志信息。
对应级别verbose,是Android日志里面级别最低的一种。
2.Log.d()
这个方法用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。
对应级别debug,比verbose高一级。
3.Log.i()
这个方法用于打印一些比较重要的数据,这些数据应该是你非常想看到的,可以帮你分析用户行为的那种。
对应级别info,比debug高一级。
4.Log.w()
这个方法用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。
对应级别warn,比info高一级。
5.Log.e()
这个方法用于打印程序中的错误信息,比如程序进入到了catch语句当中。
当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。
对应级别error,比warn高一级。
第二讲Activity
1.添加一个新的Activity
1.1直接添加Activity
1.2添加一个类
1.2.1创建布局文件
1.2.2创建一个类
1.2.3在AndroidManifest文件中注册
2.隐藏标题栏
标题栏中可以进行的操作其实还是蛮多的,尤其是在Android4.0之后加入了ActionBar的功能。
不过有些人会觉得标题栏相当占用屏幕空间,使得内容区域变小,因此也有不少的应用程序会选择将标题栏隐藏掉。
隐藏的方法非常简单,打开FirstActivity,在onCreate()方法中添加如下代码:
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
}
其中requestWindowFeature(Window.FEATURE_NO_TITLE)的意思就是不在活动中显示标题栏,注意这句代码一定要在setContentView()之前执行,不然会报错。
3.使用Toast
Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间,我们现在就尝试一下如何在活动中使用Toast。
首先需要定义一个弹出Toast的触发点,正好界面上有个按钮,那我们就让点击这个按钮的时候弹出一个Toast吧。
在onCreate()方法中添加代码:
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.first_layout);
Buttonbutton1=(Button)findViewById(R.id.button_1);
button1.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Toast.makeText(FirstActivity.this,"YouclickedButton1",
Toast.LENGTH_SHORT).show();
}
});
}
Toast的用法非常简单,通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来就可以了。
这里需要注意的是,makeText()方法需要传入三个参数。
第一个参数是Context,也就是Toast要求的上下文,由于活动本身就是一个Context对象,因此这里直接传入FirstActivity.this即可。
第二个参数是Toast显示的文本内容,第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
4.使用Menu
首先在res目录下新建一个menu文件夹,右击res目录→New→Folder,输入文件夹名menu,点击Finish。
接着在这个文件夹下再新建一个名叫main的菜单文件,右击menu文件夹→New→AndroidXMLFile,如下图所示。
文件名输入main,点击Finish完成创建。
然后在main.xml中添加如下代码:
android="> android: id="@+id/add_item" android: title="Add"/> android: id="@+id/remove_item" android: title="Remove"/> 这里我们创建了两个菜单项,其中 id给这个菜单项指定一个唯一标识符,通过android: title给这个菜单项指定一个名称。 然后打开FirstActivity,重写onCreateOptionsMenu()方法,代码如下所示: publicbooleanonCreateOptionsMenu(Menumenu){ getMenuInflater().inflate(R.menu.main,menu); returntrue; } 通过getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了。 inflate()方法接收两个参数,第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main,第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。 然后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。 当然,仅仅让菜单显示出来是不够的,我们定义菜单不仅是为了看的,关键是要菜单真正可用才行,因此还要再定义菜单响应事件。 在FirstActivity中重写onOptionsItemSelected()方法: publicbooleanonOptionsItemSelected(MenuItemitem){ switch(item.getItemId()){ caseR.id.add_item: Toast.makeText(this,"YouclickedAdd",Toast.LENGTH_SHORT).show(); break; caseR.id.remove_item: Toast.makeText(this,"YouclickedRemove",Toast.LENGTH_SHORT).show(); break; default: } returntrue; } 在onOptionsItemSelected()方法中,通过调用item.getItemId()来判断我们点击的是哪一个菜单项,然后给每个菜单项加入自己的逻辑处理,这里我们就活学活用,弹出一个刚刚学会的Toast。 5.销毁一个活动 如何销毁一个活动呢? 其实答案非常简单,只要按一下Back键就可以销毁当前的活动了。 不过如果你不想通过按键的方式,而是希望在程序中通过代码来销毁活动,当然也可以,Activity类提供了一个finish()方法,我们在活动中调用一下这个方法就可以销毁当前活动了。 修改按钮监听器中的代码,如下所示: button1.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ finish(); } }); 6.使用Intent在活动之间跳转 Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。 Intent一般可被用于启动活动、启动服务、以及发送广播等场景,由于服务、广播等概念你暂时还未涉及,那么本章我们的目光无疑就锁定在了启动活动上面。 Intent的用法大致可以分为两种,显式Intent和隐式Intent,我们先来看一下显式Intent如何使用。 6.1显式Intent Intent有多个构造函数的重载,其中一个是Intent(ContextpackageContext,Class >cls)。 这个构造函数接收两个参数,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent的“意图”。 然后我们应该怎么使用这个Intent呢? Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent参数,这里我们将构建好的Intent传入startActivity()方法就可以启动目标活动了。 修改FirstActivity中按钮的点击事件,代码如下所示: button1.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ Intentintent=newIntent(FirstActivity.this,SecondActivity.class); startActivity(intent); } }); 我们首先构建出了一个Intent,传入FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动,这样我们的“意图”就非常明显了,即在FirstActivity这个活动的基础上打开SecondActivity这个活动。 然后通过startActivity()方法来执行这个Intent。 使用这种方式来启动活动,Intent的“意图”非常明显,因此我们称之为显式Intent。 6.2隐式Intent 相比于显式Intent,隐式Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。 什么叫做合适的活动呢? 简单来说就是可以响应我们这个隐式Intent的活动,那么目前SecondActivity可以响应什么样的隐式Intent呢? 额,现在好像还什么都响应不了,不过很快就会有了。 通过在 在 只有 修改FirstActivity中按钮的点击事件,代码如下所示: 可以看到,我们使用了Intent的另一个构造函数,直接将action的字符串传了进去,表明我们想要启动能够响应com.example.activitytest.ACTION_START这个action的活动。 那前面不是说要 怎么没看到哪里有指定category呢? 这是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。 重新运行程序,在FirstActivity的界面点击一下按钮,你同样成功启动SecondActivity了。 不同的是,这次你是使用了隐式Intent的方式来启动的,说明我们在 每个Intent中只能指定一个action,但却能指定多个category。 目前我们的Intent中只有一个默认的category,那么现在再来增加一个吧。 修改FirstActivity中按钮的点击事件,代码如下所示: 可以调用Intent中的addCategory()方法来添加一个category,这里我们指定了一个自定义的category,值为com.example.activitytest.MY_CATEGORY。 现在重新运行程序,在FirstActivity的界面点击一下按钮,你会发现,程序崩溃了! 这是你第一次遇到程序崩溃,可能会有些束手无策。 别紧张,其实大多数的崩溃问题都是很好解决的,只要你善于分析。 在LogCat界面查看错误日志,你会看到如下图所示的错误信息。 错误信息中提醒我们,没有任何一个活动可以响应我们的Intent,为什么呢? 这是因为我们刚刚在Intent中新增了一个category,而SecondActivity的 现在我们在 再次重新运行程序,你就会发现一切都正常了。 6.3隐式Intent应用 6.3.1调用浏览器功能 可能你会对setData()部分感觉到陌生,这是我们前面没有讲到过的。 这个方法其实并不复杂,它接收一个Uri对象,主要用于指定当前Intent正在操作的数据,而这些数据通常都是以字符串的形式传入到Uri.parse()方法中解析产生的。 与此对应,我们还可以在 标签中主要可以配置以下内容。 1.android: scheme 用于指定数据的协议部分,如上例中的http部分。 2.android: host 用于指定数据的主机名部分,如上例中的部分。 3.android: port 用于指定数据的端口部分,一般紧随在主机名之后。 4.android: path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。 5.android: mimeType 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。 只有标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。 不过一般在标签中都不会指定过多的内容,如上面浏览器示例中,其实只需要指定android: scheme为http,就可以响应所有的http协议的Intent了。 为了让你能够更加直观地理解,我们来自己建立一个活动,让它也能响应打开网页的Intent。 新建third_layout.xml布局文件,代码如下: 然后新建活动ThirdActivity继承自Activity,代码如下: 最后在AndroidManifest.xml中为ThirdActivity进行注册。 6.3.2调用拨打电话功能 6.4向下一个活动传递数据 不过到目前为止,我们都只是简单地使用Intent来启动一个活动,其实Intent还可以在启动活动的时候传递数据的,我们来一起看一下。 在启动活动时传递数据的思路很简单,Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出就可以了。 比如说FirstActivity中有一个字符串,现在想把这个字符串传递到SecondActivity中,你就可以这样编写: 然后我们在SecondActivity中将传递的数据取出,并打印出来,代码如下所示: 6.5返回数据给上一个活动 startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。 我们还是来实战一下,修改FirstActivity中按钮的点击事件,代码如下所示: 这里我们使用了startActivityForResult()方法来启动SecondActivity,请求码只要是一个唯一值就可以了,这里传入了1。 接下来我们在SecondActivity中给按钮注册点击事件,并在点击事件中添加返回数据的逻辑,代码如下所示: 可以看到,我们还是构建了一个Intent,只不过这个Intent仅仅是用于传递数据而已,它没有指定任何的“意图”。 紧接着把要传递的数据存放在Intent中,然后调用了setResult()方法。 这个方法非常重要,是专门用于向上一个活动返回数据的。 setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数则是把带有数据的Intent传递回去,然后调用了finish()方法来销毁当前活动。 由于我们是使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法,因此我们需要在FirstActivity中重写这个方法来得到返回的数据,如下所示: onActivityResult()方法带有三个参数,第一个参数requestCode,即我们在启动活动时传入的请求码。 第二个参数resultCode,即我们在返回数据时传入的处理结果。 第三个参数data,即携带着返回数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 第二