android菜鸟学习笔记5----第一个android程序
程序功能:点击一个按钮,然后弹出一个提示信息
Step 1:在eclipse中新建一个android application project,在创建过程中不勾选create activity,这样就创建了一个空的android工程。
此时,src及res/layout均为空。
Step 2:在src中新建一个Activity继承自android.app.Activity,点击finish,生成代码如下:
package cn.csc.hello_world; import android.app.Activity; public class FirstActivity extends Activity { }
按下shift+alt+S,弹出菜单中选择Override/Implement Methods:
勾选onCreate(Bundle),点OK,实现Activity的onCreate(Bundle)方法。自动生成代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); }
Step 3:在res/layout目录下新建一个只有一个按钮的布局文件
右击layout --》new --》 Android Xml File:
文件名为first_layout
根节点选择LinearLayout
然后点击Finish完成
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中添加一个Button子节点,输入butt,然后alt+/,即可自动补全button子节点,要添加属性,同样可以输入几个首字母,然后alt+/补全
<Button android:id="@+id/btn" 添加一个id,以后引用这个button时,可用R.id.btn android:layout_width="wrap_content" 包裹内容即可 android:layout_height="wrap_content" 包裹内容即可 android:text="I'm a button" button上显示的文本值 />
这里,text属性直接设置为字符串,硬编码不太好,鼠标点到”I’m a button”,使光标停留在字符串任意位置,然后按下ctrl + 1(是数字1),在弹出的菜单中,选择Extract Android String:
Replace by R.string.btnText,然后点击OK,text属性变为:android:text="@string/btnText",以后要引用这个字符串,可以用R.string.btnText。
Step 4:给刚才新建的FirstActivity设置布局文件,为first_layout.xml
在FirstActivity的onCreate()方法中,添加上:
protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); }
此时,会发现R.layout.点不出来first_layout,setContentView()语句报错
观察FirstActivity代码,会发现,多了一句import android.R;
把它删掉,还是报错,提示找不到R。
(注意,这里若是按下Ctrl + 1进行代码修复,import com.example.hello_world.R;
虽然不会再报错,但是,后面注册Activity时,若不指定完整的包名.类名会出现程序无法运行的问题,报错提示找不到所需的Activity。为了简单起见可以进行下面的修改package属性操作,当然,也可以不修改,后面注册各个组件时,注意带上包名即可)
找到Android Manifest.xml文件,看到根节点manifest中package属性:并不是我们设置的FirstActivity.java包名,而是创建工程时默认的那个包名,而包cn.csc.hello_world是之后才建立的。这就导致了R.java与FirstActivity.java不在同一个包中,因此无法直接访问。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hello_world" android:versionCode="1" android:versionName="1.0" >
把package属性值修改为FirstActivity的包名即可:package="cn.csc.hello_world"。
这样R.java与FirstActivity.java就在同一个包中了,可以直接访问。
然后回到FirstActivity代码,发现就不再报错了。
Step 5 :找到添加的按钮,设置其单击响应事件
onCreate()代码修改如下:
protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Toast.makeText(FirstActivity.this, "I was clicked", Toast.LENGTH_SHORT).show(); } }); }
findViewById()根据Id找到需要的View
btn.setOnClickListener()设置单击事件监听,这里选择使用了匿名内部类实现。
Toast.makeText().show();弹出一个提示信息
Step 6:注册要使用的FirstActivity
完成Step 5之后,若是运行该程序,会发现没有任何效果,这是因为没有在Android Manifest.xml中注册要使用的Activity。所以FirstActivity不会被使用,当然它的onCreate()方法也不会被调用。
注册FirstActivity方法如下:
在application节点中添加activity子节点:
<activity android:name=".FirstActivity" android:label="Hello world" > <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
name属性必须设置,指定注册的是哪个Activity类,这里简写为.FirstActivity,将与manifest节点中的package属性拼接成完整的类名,也可以写完整的类名,如:cn.csc.hello_world.FirstActivity
label属性,设置应用的标题内容,若不设置,则标题为项目的名称。
intent-filter设置启动该activity的意图,这里将该activity设置为启动activity。
至此,改程序就可以顺利运行了。
若不想显示应用程序标题栏,则可以在onCreate()方法中,添加requestWindowFeature(Window.FEATURE_NO_TITLE);
但是,需要注意的是,一定要在setContentView()之前添加该代码,否则会报错。
总结:
若出现这不到R的错误提示,则可以优先考虑是不是前后设置的包名不一致,导致R.java与自己写的代码不在同一个包中的问题。
Manifest.xml中的package属性,是在新建工程中设置的,在手机中用于唯一标识当前应用,源代码的包可以手工建立新的包名,若与manifest.xml中的不一致,则应注意注册各个组件时,应使用完整的类限定名,即包名.类名。否则会将package属性,与所注册的组件的name属性拼接成错误的类限定名,导致找不到组件的定义类。
android菜鸟学习笔记5----第一个android程序的更多相关文章
- C#.NET学习笔记2---C#.第一个C#程序
C#.NET学习笔记2---C#.第一个C#程序 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com 6.第一个C#程序: ...
- Spark学习笔记1——第一个Spark程序:单词数统计
Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...
- android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据
补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访 ...
- android菜鸟学习笔记7----android布局(二)
3.FrameLayout:帧布局 如同Flash或者photoshop中图层的概念,在上面的图层遮盖下面的图层,没被遮到的地方仍然显示出来. 右击res/layout,然后在弹出的菜单中选择new, ...
- android菜鸟学习笔记26----Android广播消息及BroadcastReceiver
1.广播类型: Android中的广播有两种类型:标准广播和有序广播.其中,标准广播是完全异步发送的广播,发出之后,几乎所有的广播接收者都会在同一时刻收到这条广播消息,因而,这种类型的广播消息是不可拦 ...
- android菜鸟学习笔记16----Android项目打包安装过程(Run as Android Application)
右击项目名称,Run as Android Appication之后,Android项目打包安装过程: 1.打包生成.apk文件: 1)把源码中的.java文件编译生成.class文件 2)将所有的. ...
- android菜鸟学习笔记15----Android Junit测试
Android中的Junit测试与Java Junit测试有所不同,不能简单的使用标注…… 假设写了一个MathUtils类,有两个静态方法: public class MathUtils { pub ...
- android菜鸟学习笔记13----Android控件(二) 自定义控件简单示例
有时候,可能觉得系统提供的控件太丑,就会需要自定义控件来实现自己想要的效果. 以下主要参考<第一行代码> 1.自定义一个标题栏: 系统自带的标题栏很丑,且没什么大的作用,所以我们之前会在o ...
- android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件
主要参考<第一行代码> 1.TextView: 功能与传统的桌面应用开发中的Label控件相似,用于显示文本信息 如: <TextView android:layout_width= ...
随机推荐
- 谁都能听懂的Redux+Redux-Saga超级傻瓜教程
对不起本文确实有标题党的嫌疑:) 想要理解本文还是要先会用react和es6,如果连react和es6都不知道是什么的话我也没辙:( 如果你选择用react来开发应用,并且你没对各个组件的状态进行应有 ...
- (转)C++常用函数汇总
1.标准C++库字符串类std::string的用法 begin 得到指向字符串开头的Iterator end 得到指向字符串结尾的Iterator rbegin ...
- 利用Django徒手写个静态页面生成工具
每个Geek对折腾自己的博客都有着一份执念 背景介绍 曾经多次在不同的平台写博客,但全部都以失败而告终.去年七月选择微信公众号做为平台开始了又一次的技术分享,庆幸一直坚持到现在,但随着文章发表的越来越 ...
- codevs——1010 过河卒(棋盘DP)
2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 如图,A 点有 ...
- delphi如何把一个整数转化为4个十六进制字节
var s:string; len:Integer; AData:TBytes; begin s:=IntToHex(149259,6);//返回6位字符串 len ...
- 【spring boot】在自定义拦截器中从request中获取json字符串
又这样的需求,需要在自定义的拦截器中获取request中的数据,想获取到的是JSON字符串 那需要在拦截器中写这样一个方法 public static String getOpenApiRequest ...
- java基础篇1之可变参数,增强for循环,自动装箱
1.java中可变参数应用 例如 add(int x,int... args) 1)只能放在参数列表的最后面 2)...位于变量类型和变量名之间,前后有无空格都可以 3)调用可变参数的方法时,编译器为 ...
- JNI开发(2)——开发实战
JNI开发(1)--概述.环境搭建.必要知识点 JNI开发(2)--开发实战 本篇是重头戏:JNI实战开发.假设你对于 JNI.NDK 还没概念的话 那么观看本篇 也是没有太大难度的 ,哈哈哈哈! ! ...
- blind xxe攻击
最近做啊里的题的时候遇到了 http://hivesec.net/web-security/%E5%85%B3%E4%BA%8Eblind-xxe.html
- Python获取免费的可用代理
Python获取免费的可用代理 在使用爬虫多次爬取同一站点时,常常会被站点的ip反爬虫机制给禁掉,这时就能够通过使用代理来解决.眼下网上有非常多提供最新免费代理列表的站点.这些列表里非常多的代理主机是 ...