android菜鳥學習筆記5----第一個android程式,android5----
程式功能:點擊一個按鈕,然後彈出一個提示資訊
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 Xml File:
檔案名稱為first_layout
根節點選擇LinearLayout
然後點擊Finish完成
first_layout.xml中自動產生代碼如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <LinearLayout xmlns:android="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.xml
在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.xml檔案,看到根節點manifest中package屬性:並不是我們設定的FirstActivity.java包名,而是建立工程時預設的那個包名,而包cn.csc.hello_world是之後才建立的。這就導致了R.java與FirstActivity.java不在同一個包中,因此無法直接存取。
1 <manifest xmlns:android="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.xml中註冊要使用的Activity。所以FirstActivity不會被使用,當然它的onCreate()方法也不會被調用。
註冊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.xml中的package屬性,是在建立工程中設定的,在手機中用於唯一標識當前應用,原始碼的包可以手工建立新的包名,若與manifest.xml中的不一致,則應注意註冊各個組件時,應使用完整的類限定名,即包名.類名。否則會將package屬性,與所註冊的組件的name屬性拼接成錯誤的類限定名,導致找不到組件的定義類。