官术网_书友最值得收藏!

1.7 創建一個Android項目

前面已經完成了Android開發環境的搭建工作,現在就讓我們一起來編寫一個簡單的Android程序。這里我們要實現一個兩個整型數字相加的程序。

1.7.1 創建一個新的Android項目

啟動Eclipse,單擊“File > New > Android Application Project”菜單項,如圖1-42所示。

圖1-42 創建一個Android項目的菜單操作步驟

1.7.2 如何填寫Android項目信息

在彈出的圖1-43所示界面中,“Application Name”表示應用名稱,如果后續我們將該應用安裝到手機設備上,會在手機上顯示該名稱,這里我們給其起名為“CalculatorOfTwoNum”。“Project Name”表示項目名稱,在項目創建完成后該名稱會顯示在Eclipse左側的Package Explorer中,這里我們保留其自動生成的內容,即“CalculatorOfTwoNum”。“Package Name”表示項目的包名,Android系統是通過包名來區分不同應用程序的,因此要保證包名的唯一性,這里我們將其命名為“com.yuy.calculatoroftwonum”。“Minimum Required SDK”表示程序運行需要的最低兼容版本,這里我們保留其默認值,即Android 4.0版本。“Target SDK”表示目標版本,通常我們要在該版本經過非常全面的系統測試,這里我們選擇Android 4.4版本。“Complie With”表示程序將使用那個版本的SDK進行編譯,這里我們也選擇Android 4.4版本。“Theme”表示程序的UI所使用的主題,這里我們選擇其默認的“Holo Light with Dark Action Bar”主題。

圖1-43 創建一個Android項目的對話框信息

1.7.3 配置Android項目目錄和活動信息

單擊“Next”按鈕,進入到圖1-44所示對話框,這個對話框可以對項目的一些屬性信息進行配置,如是否創建啟動圖標、創建活動和項目的存放位置等內容,我們不做修改,保留其默認值。單擊“Next”按鈕,將出現圖1-45所示界面,在這個對話框中我們可以配置應用的啟動圖標,通常啟動圖標是一個應用的門面,必須好好設計來吸引用戶的眼球,但作為一個簡單的示例程序,我們可以保留其默認的設置不做更改,單擊“Next”按鈕,出現圖1-46所示界面。

圖1-44 項目配置對話框信息

圖1-45 項目啟動圖標配置對話框信息

圖1-46 項目創建活動對話框信息

如圖1-46所示,我們可以在該對話框選擇要創建活動的類型,這里選擇創建一個空白活動,也就是其默認的選項,單擊“Next”按鈕,將出現圖1-47所示界面。

圖1-47 空白活動對話框信息

在彈出的圖1-47所示界面中,包括了2項內容,即“Activity Name”和“Layout Name”,其中“Activity Name”表示給新建的空白活動起的名字,這里保留“MainActivity”,“Layout Name”是針對這個活動的布局文件名字,我們也保留“activity_main”這個名字。然后,單擊“Finish”按鈕,完成新項目的創建工作,將出現圖1-48所示界面。

圖1-48 “CalculatorOfTwoNum”相關信息

1.7.4 設計程序的原型UI

在做任何事情之前,大家都要想好怎樣去實施。這里我們想做一個基于圖形界面的手機應用,作者用“畫筆”程序做了一個簡單的應用預實現的界面,供大家參考,如圖1-49所示。

圖1-49 預實現的“CalculatorOfTwoNum”應用的相關界面信息

1.7.5 依據UI原型實現Android項目的布局文件

下面,我們就來實現這個小的手機應用程序。首先來實現布局文件,將相應標簽、文本框和按鈕控件放到圖1-49所示的相應位置。當然有兩種方式可以實現,一種方式是直接從圖1-48所示的控件面板中拖放控件到右側的活動中,另外一種方式是直接修改“activity_main.xml”文件。這里我們選擇第二種方式,雙擊“res”目錄下的“layout”子目錄中的“activity_main.xml”文件,然后選擇右側的“activity_main.xml”頁,如圖1-50所示。將“activity_main.xml”文件修改為如下內容。

圖1-50 修改“activity_main.xml”布局文件的操作信息

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="@dimen/activity_vertical_margin"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            tools:context="com.yuy.calculatoroftwonum.MainActivity" >

        <EditText
              android:id="@+id/edtnum1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentRight="true"
              android:layout_alignTop="@+id/edtnum1"
              android:ems="10"
              android:inputType="number" >
        <requestFocus />
        </EditText>

        <EditText
              android:id="@+id/edtnum2"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignLeft="@+id/edtnum1"
              android:layout_below="@+id/edtnum1"
              android:layout_marginTop="27dp"
              android:ems="10"
              android:inputType="number" >

        </EditText>

        <TextView
              android:id="@+id/txtnum2"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignBottom="@+id/edtnum2"
              android:layout_toLeftOf="@+id/edtnum2"
              android:text="@string/num2" />

        <TextView
              android:id="@+id/txtnum1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_above="@+id/edtnum2"
              android:layout_alignLeft="@+id/txtnum2"
              android:text="@string/num1" />

        <Button
              android:id="@+id/btncalc"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignLeft="@+id/txtnum2"
              android:layout_below="@+id/edtnum2"
              android:layout_marginTop="70dp"
              android:text="@string/calc" />

        <Button
              android:id="@+id/btnexit"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignBaseline="@+id/btncalc"
              android:layout_alignBottom="@+id/btncalc"
              android:layout_alignRight="@+id/edtnum2"
              android:text="@string/exit" />

        </RelativeLayout>

布局文件創建好以后,我們可以切換到圖形布局,來看一下效果,如圖1-51所示。

圖1-51 “activity_main.xml”布局文件的圖形化界面信息

1.7.6 布局文件內容的理解

從圖1-51可以進一步確認它實現了我們預設計界面的需求。也許細心的讀者已經從上面的布局文件中發現了以下一些問題。

(1)在上面的配置文件中,并沒有出現“數值1:”“數值2:”“求和計算”和“退出”漢字。

(2)上面的布局文件是一個XML文件,那么在XML中不同的標簽表示什么控件呢?

下面我們就主要針對這兩個問題向大家介紹一下,第一個問題為了解決日后手機應用版本的國際化問題,開發人員通常不直接把文本標簽、按鈕名稱直接寫到對應控件的屬性中,而是通過一個配置文件來進行設置,這樣就可以根據不同國家應用不同的語言,加載不同的配置文件,而不用再每次編譯不同的安裝包進行分發。這里對應漢字的標題都存放在“res”目錄下“values”子目錄的“strings.xml”文件中,如圖1-52所示。

圖1-52 “stings.xml”文件信息

為了讓大家看得更清楚,這里將“strings.xml”文件內容展示如下。

        <? xml version="1.0" encoding="utf-8"? >
        <resources>

        <string name="app_name">CalculatorOfTwoNum</string>
        <string name="num1">數值1:</string>
        <string name="num2">數值2:</string>
        <string name="calc">求和計算</string>
        <string name="exit">退出</string>
        <string name="action_settings">Settings</string>

        </resources>

從這個XML文件中,我們可以看到定義了很多標簽。第一個標簽“<string name="app_name">CalculatorOfTwoNum</string>”定義了名稱“app_name”,其值為“CalculatorOfTwoNum”這樣的一組鍵值對。它將會在另一個非常重要的文件,即“AndroidManifest.xml”文件中得到應用,在后續內容中我們將會介紹到。第二個標簽“<string name="num1">數值1:</string>”,定義了名稱為“num1”的鍵值,其值為“數值1:”。我們不難理解在“activity_main.xml”布局文件中“android:text="@string/num1"”引用的就是“數值1:”。后續的內容類似,就不再進行贅述說明。下面再說一下第二個問題,在布局文件中,用“<RelativeLayout>”標簽來聲明一個相對布局,用“<TextView>”來聲明一個文本標簽控件,用“<EditText>”來聲明一個文本框控件,而用“<Button>”來聲明一個按鈕控件,各個控件標簽中還有一些屬性來描述其高度、寬度、相對位置等信息,如果想深入地學習,建議大家看系統性書籍,這里作者不再過多地講述。

1.7.7 Android項目的源代碼實現

接下來,我們實現這個小程序的源代碼,單擊“src”目錄,在“com.yuy.calculatoroftwonum”包下雙擊“MainActivity.java”文件,打開該文件,如圖1-53所示。

圖1-53 “MainActivity.java”文件信息

我們將“MainActivity.java”文件的信息修改為以下內容。

        package com.yuy.calculatoroftwonum;

        import android.R.string;
        import android.app.Activity;
        import android.os.Bundle;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.Button;
        import android.widget.EditText;
        import android.widget.Toast;

        public class MainActivity extends Activity {
            public int add(int num1, int num2){
                  return num1+num2;
            }

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
                  Button calc = (Button)findViewById(R.id.btncalc);
                  calc.setOnClickListener(new OnClickListener() {
                      @Override
                      public void onClick(View v) {
                          // TODO Auto-generated method stub
                          EditText t1 = (EditText)findViewById(R.id.edtnum1);
                          EditText t2 = (EditText)findViewById(R.id.edtnum2);

                          int a= Integer.parseInt(t1.getText().toString());
                          int b= Integer.parseInt(t2.getText().toString());
                          String s= Integer.toString(add(a, b));
                          Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
                      }
                  }
                  );
                  Button exit = (Button)findViewById(R.id.btnexit);
                  exit.setOnClickListener(new OnClickListener() {
                      @Override
                      public void onClick(View v) {
                            finish();
                      }
                  });
              }


              @Override
              public boolean onCreateOptionsMenu(Menu menu) {
                  // Inflate the menu; this adds items to the action bar if it is present.
                  getMenuInflater().inflate(R.menu.main, menu);
                  return true;
              }

              @Override
              public boolean onOptionsItemSelected(MenuItem item) {
                  // Handle action bar item clicks here. The action bar will
                  // automatically handle clicks on the Home/Up button, so long
                  // as you specify a parent activity in AndroidManifest.xml.
                  int id = item.getItemId();
                  if (id == R.id.action_settings) {
                      return true;
                  }
                  return super.onOptionsItemSelected(item);
              }
        }}

上面的代碼很簡單,主要的代碼是求和計算部分代碼,即下面的內容。

                  Button calc = (Button)findViewById(R.id.btncalc);
                  calc.setOnClickListener(new OnClickListener() {
                      @Override
                      public void onClick(View v) {
                            // TODO Auto-generated method stub
                            EditText t1 = (EditText)findViewById(R.id.edtnum1);
                            EditText t2 = (EditText)findViewById(R.id.edtnum2);
                            int a= Integer.parseInt(t1.getText().toString());
                            int b= Integer.parseInt(t2.getText().toString());
                            String s= Integer.toString(add(a, b));
                            Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
                      }
                  }
                  );

我們從上面的代碼可以看到有findViewById()方法,這個方法是獲取布局文件中定義的元素,這里傳入的是R.id.btncalc,得到“求和計算”按鈕的實例。它涉及了R.java文件,那么就讓我們來說一下這個文件。在項目“gen”文件夾下的“com.yuy.calculatoroftwonum”包中會自動生成一個叫“R.java”的文件。在項目中添加的任何資源都會在其中生成一個與之對應的資源ID,請不要自行修改該文件內容,如圖1-54所示。得到“求和計算”按鈕實例后,通過調用setOnClickListener()方法為該按鈕注冊一個監聽器,單擊該按鈕就會執行監聽器的onClick()方法。

圖1-54 “R.java”文件信息

因此就會執行下面的內容。

                                      EditText t1 = (EditText)findViewById(R.id.edtnum1);
                                      EditText t2 = (EditText)findViewById(R.id.edtnum2);

                                      int a= Integer.parseInt(t1.getText().toString());
                                      int b= Integer.parseInt(t2.getText().toString());
                                      String s= Integer.toString(add(a, b));
                                      //顯示求和結果
                                      Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();

這幾條語句的含義是先獲得布局中的兩個文本框實例,再將“數值1”和“數值2”的文本內容轉換為整數賦給整型變量a和b,而后通過add()函數將a與b的和轉換為字符串類型賦給字符串類型變量s,最后通過Toast對象的show()方法將求和結果顯示出來。

1.7.8 AndroidManifest.xml文件講解

“AndroidManifest.xml”文件位于項目目錄之下,如圖1-55所示。

圖1-55 “AndroidManifest.xml”文件位置信息

它是Android項目的配置文件,程序中定義的四大組件都需要在這個文件里注冊。有時候我們需要對SD卡的讀寫操作、網絡等資源進行訪問,也需要在該文件中添加相應的權限。還可以在該文件中指定運行這個手機應用所要求的最低兼容版本和目標版本。下面就讓我們一起來看一下這個文件的內容。

        <? xml version="1.0" encoding="utf-8"? >
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.yuy.calculatoroftwonum"
            android:versionCode="1"
            android:versionName="1.0" >

        <uses-sdk
              android:minSdkVersion="14"
              android:targetSdkVersion="19" />

        <application
              android:allowBackup="true"
              android:icon="@drawable/ic_launcher"
              android:label="@string/app_name"
              android:theme="@style/AppTheme" >

        <activity
                  android:name=".MainActivity"
                  android:label="@string/app_name" >
        <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        </activity>

        </application>

        </manifest>

需要大家注意的是所有的活動都要在“AndroidManifest.xml”文件進行注冊后才能被使用,以下配置即為注冊“MainActivity”活動,在“MainActivity”前面有一個“.”,它表示當前目錄的意思,因為我們的包為“com.yuy.calculatoroftwonum”,也就是“com.yuy.calculatoroftwonum. MainActivity”,“. MainActivity”為其簡寫形式。為了使“MainActivity”作為這個手機應用的主活動,也就是說能通過單擊手機桌面應用的圖標直接打開這個活動,就需要加入“<intent-filter>”標簽,并加入“<action android:name="android.intent.action.MAIN" />”和“<category android:name="android.intent.category.LAUNCHER" />”,才能使之成為應用的主活動,如下所示。

        <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

如果沒有聲明任何一個活動作為主活動,這個程序仍然是可以正常安裝的,只是沒有辦法在手機桌面上看到它,如我們將在后續做自動化測試時講到的測試程序,將只能看到被測試應用,而看不到測試應用也就是這個原因,這種形式的應用一般作為第三方服務來進行內部調用。

下面的配置用于指定這個程序所支持的最低向下兼容的系統版本和目標版本。

        <uses-sdk
              android:minSdkVersion="14"
              android:targetSdkVersion="19" />

下面的配置用于指定應用的圖標、應用標題、序的UI所使用的主題,這些內容引用的也是“strings.xml”和“R.java”這2個文件中的內容。當“allowBackup”標志為“true”時,用戶可通過“adb backup”和“adb restore”來進行對應用數據的備份和恢復,這可能存在一定的安全風險。

              android:allowBackup="true"
              android:icon="@drawable/ic_launcher"
              android:label="@string/app_name"
              android:theme="@style/AppTheme" >

圖1-54中,在項目的最下面有一個名為“project.properties”的文件,該文件的內容如下。

        # This file is automatically generated by Android Tools.
        # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
        #
        # This file must be checked in Version Control Systems.
        #
        # To customize properties used by the Ant build system edit
        # "ant.properties", and override values to adapt the script to your
        # project structure.
        #
        # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties:
    sdk.dir,
        # user.home):
        #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

        # Project target.
        target=android-19

從上面的內容來看,有效的內容僅為“target=android-19”,它指定了編譯程序所使用的SDK版本。

結合圖1-54項目的結構,我們再向大家介紹和補充說明如下。

“src”:這個目錄是存放Java源代碼文件的地方。

“gen”:這個目錄里的內容都是自動生成的,它主要有一個R.java文件,我們在項目中添加的任何資源其實都會在該文件中生成一個對應的資源ID,請大家不要自行去修改該文件。

“assets”:這個目錄主要用于存放一些隨程序打包的文件,在程序運行過程中可以動態讀取到這些文件的內容。如果程序使用到了WebView加載本地網頁的功能,這個目錄也將是存放網頁相關文件的位置。

“bin”:這個目錄主要包含了一些在編譯時自動產生的文件,比如安裝包文件就會存放在該目錄。

“libs”:如果在項目中使用到了第三方的一些jar包,就需要把這些jar包都放在該目錄下,放在這個目錄下的jar包都會被自動添加到構建路徑里去。

“res”:這個目錄主要存放項目中使用的所有圖片、布局、字符串等資源,前面提到的R.Java文件中的內容也是根據這個目錄下的文件自動生成的。當然這個目錄下還有很多子目錄,圖片放在“drawable”目錄下,布局放在“layout”目錄下,字符串放在“values”目錄下。

1.7.9 運行Android項目

如果手機模擬器沒有啟動,則需要開啟我們先前創建的手機模擬器,保證其處于運行狀態,如圖1-56所示。

圖1-56 處于運行狀態的“Galaxy_Nexus_4.4.2”模擬器

而后選中“CalculatorOfTwoNum”項目,單擊鼠標右鍵,從彈出的快捷菜單中,選擇“Run As > Android Application”菜單項,如圖1-57所示。

圖1-57 運行Android應用的操作方法

接下來,將會在“Console”的輸出內容中看到圖1-58所示信息。

圖1-58 運行Android應用后Console的輸出信息內容

以下內容為其具體的輸出信息。

        [2015-05-28 13:46:39 - CalculatorOfTwoNum] ------------------------------
        [2015-05-28 13:46:39 - CalculatorOfTwoNum] Android Launch!
        [2015-05-28 13:46:39 - CalculatorOfTwoNum] adb is running normally.
        [2015-05-28 13:46:39 - CalculatorOfTwoNum] Performing
    com.yuy.calculatoroftwonum.MainActivity activity
        launch
        [2015-05-28 13:46:40 - CalculatorOfTwoNum] Automatic Target Mode: using existing emulator
    'emulator-5554'
        running compatible AVD 'Galaxy_Nexus_4.4.2'
        [2015-05-28 13:46:40 - CalculatorOfTwoNum] Uploading CalculatorOfTwoNum.apk onto device
    'emulator-5554'
        [2015-05-28 13:46:41 - CalculatorOfTwoNum] Installing CalculatorOfTwoNum.apk...
        [2015-05-28 13:46:53 - CalculatorOfTwoNum] Success!
        [2015-05-28 13:46:54 - CalculatorOfTwoNum] Starting activity com.yuy.calculatoroftwonum.
    MainActivity on device emulator-5554
        [2015-05-28 13:46:57 - CalculatorOfTwoNum] ActivityManager: Starting: Intent
        { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
        cmp=com.yuy.calculatoroftwonum/.MainActivity }

從上面的輸出信息,我們能夠清楚地看到執行該應用的操作全過程,可以清楚地看到其啟動過程中檢測“adb”命令是否可以成功執行,是否能夠調用應用的主活動,上傳應用的安裝包到手機模擬器,安裝應用,啟動主活動這一完整過程。從輸出的信息來看,應用是安裝成功的并啟動了主活動,所以我們用鼠標操作手機模擬器滑開被鎖住的屏幕,如圖1-59所示。

圖1-59 運行后的應用顯示界面信息

我們在“數值1”后的文本框中輸入2,在“數值2”后的文本框中輸入3,而后單擊“求和計算”按鈕,會發現在手機屏幕的下方顯示一個Toast提示信息“5”,如圖1-60所示。

圖1-60 驗證應用功能的測試信息

單擊圖1-60所示的“后退鍵”或者單擊“退出”按鈕,則回到模擬器的桌面,在桌面上,我們能夠看到一個名稱為“CalculatorOfTwoNum”的應用,它就是我們的樣例程序,如圖1-61所示。

圖1-61 模擬器桌面相關應用信息

當然也可以使用物理的手機設備作為調試設備,在應用物理的手機設備時,需要保證我們的手機設備可以被一些360手機助手、騰訊手機助手等工具成功訪問,如圖1-62所示。因為只有被成功識別了,才說明其相關的一些驅動正確安裝了,這也是最簡單的一種保證手機設備處于可調試狀態的處理方式。

圖1-62 手機設備被正確識別的相關信息

當使用手機設備作為調試工具時,選中“CalculatorOfTwoNum”項目,單擊鼠標右鍵,從彈出的快捷菜單中,選擇“Run As > Android Application”菜單項后,將出現如圖1-63所示界面。

圖1-63 “Android Device Chooser”對話框信息

從運行的Android設備列表中選擇相應的手機設備,單擊“OK”按鈕,就會產生和在模擬器上相同的效果,這部分內容就不再進行贅述了。

這里作者強調一點,如果在條件允許的情況下請最好還是通過手機設備進行測試用例腳本的編寫、調試以及測試工作,一方面物理設備是真實的設備,模擬器有些情況是模擬不了的、和物理設備還是有一定差異的,另一方面,物理設備的運行速度也明顯優于模擬器,所以在本書無特殊說明的情況下,都是通過我的物理手機設備進行調試和測試工作。

主站蜘蛛池模板: 留坝县| 双柏县| 屏东市| 怀宁县| 射阳县| 台北县| 澜沧| 丹寨县| 澄迈县| 孙吴县| 巴彦淖尔市| 常德市| 佛坪县| 新昌县| 曲麻莱县| 枣阳市| 历史| 资溪县| 城步| 宜阳县| 木里| 鄄城县| 自治县| 高阳县| 平阳县| 丰顺县| 德令哈市| 菏泽市| 广饶县| 定结县| 奇台县| 阜平县| 乐平市| 开平市| 华亭县| 河池市| 丹巴县| 灌阳县| 白玉县| 井冈山市| 吴江市|