你的位置:首页 > 操作系统

[操作系统]android菜鸟学习笔记5


程序功能:点击一个按钮,然后弹出一个提示信息

Step 1:在eclipse中新建一个android application project,在创建过程中不勾选create activity,这样就创建了一个空的android工程。

 

此时,src及res/layout均为空。

Step 2:在src中新建一个Activity继承自android.app.Activity,点击finish,生成代码如下:

 1 package cn.csc.hello_world; 2  3  4  5 import android.app.Activity; 6  7  8  9 public class FirstActivity extends Activity {10 11 12 13 }

 

 

按下shift+alt+S,弹出菜单中选择Override/Implement Methods:

 

勾选onCreate(Bundle),点OK,实现Activity的onCreate(Bundle)方法。自动生成代码如下:

1     @Override2 3    protected void onCreate(Bundle savedInstanceState) {4 5      // TODO Auto-generated method stub6 7      super.onCreate(savedInstanceState);8 9    }

 

Step 3:在res/layout目录下新建一个只有一个按钮的布局文件

右击layout --》new --》 Android

文件名为first_layout

根节点选择LinearLayout

然后点击Finish完成

 

first_layout.

 1 <??> 2  3 <LinearLayout ="http://schemas.android.com/apk/res/android" 4  5   android:layout_width="match_parent"   宽度:填充父节点 6  7   android:layout_height="match_parent"  高度:填充父节点 8  9   android:orientation="vertical" >    子节点排列方向:垂直排列10 11 </LinearLayout>

 

在LinearLayout中添加一个Button子节点,输入butt,然后alt+/,即可自动补全button子节点,要添加属性,同样可以输入几个首字母,然后alt+/补全

 1 <Button 2  3     android:id="@+id/btn"  添加一个id,以后引用这个button时,可用R.id.btn 4  5     android:layout_width="wrap_content" 包裹内容即可 6  7     android:layout_height="wrap_content" 包裹内容即可 8  9     android:text="I'm a button"      button上显示的文本值10 11     />

 

这里,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.

在FirstActivity的onCreate()方法中,添加上:

1 protected void onCreate(Bundle savedInstanceState) {2 3      // TODO Auto-generated method stub4 5      super.onCreate(savedInstanceState);6 7       setContentView(R.layout.first_layout);8 9 }

 

此时,会发现R.layout.点不出来first_layout,setContentView()语句报错

观察FirstActivity代码,会发现,多了一句import android.R;

把它删掉,还是报错,提示找不到R。

(注意,这里若是按下Ctrl + 1进行代码修复,import com.example.hello_world.R;

虽然不会再报错,但是,后面注册Activity时,若不指定完整的包名.类名会出现程序无法运行的问题,报错提示找不到所需的Activity。为了简单起见可以进行下面的修改package属性操作,当然,也可以不修改,后面注册各个组件时,注意带上包名即可)

找到Android Manifest.

1 <manifest ="http://schemas.android.com/apk/res/android"2 3   package="com.example.hello_world"4 5   android:versionCode="1"6 7 android:versionName="1.0" >

 

把package属性值修改为FirstActivity的包名即可:package="cn.csc.hello_world"。

这样R.java与FirstActivity.java就在同一个包中了,可以直接访问。

然后回到FirstActivity代码,发现就不再报错了。

Step 5 :找到添加的按钮,设置其单击响应事件

onCreate()代码修改如下:

 1 protected void onCreate(Bundle savedInstanceState) { 2  3      // TODO Auto-generated method stub 4  5      super.onCreate(savedInstanceState); 6  7       setContentView(R.layout.first_layout); 8  9      Button btn = (Button) findViewById(R.id.btn);10 11      btn.setOnClickListener(new OnClickListener() {12 13            @Override14 15           public void onClick(View arg0) {16 17               Toast.makeText(FirstActivity.this, "I was clicked", Toast.LENGTH_SHORT).show();18 19            }20 21        });22 23 }

 

findViewById()根据Id找到需要的View

btn.setOnClickListener()设置单击事件监听,这里选择使用了匿名内部类实现。

Toast.makeText().show();弹出一个提示信息

Step 6:注册要使用的FirstActivity

完成Step 5之后,若是运行该程序,会发现没有任何效果,这是因为没有在Android Manifest.

注册FirstActivity方法如下:

在application节点中添加activity子节点:

 1 <activity android:name=".FirstActivity"   android:label="Hello world" > 2  3       <intent-filter > 4  5         <action android:name="android.intent.action.MAIN"/> 6  7         <category android:name="android.intent.category.LAUNCHER"/> 8  9       </intent-filter>10 11 </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.