第七課:運用SharePreferences

今課要教大家的是如何可以把資料(Data)儲存起來,待下一次開啟App時可以再提取使用,並根據所儲存的資料,有不同的回應。

我們會用回上一課的打招呼App,作少許改動,讓它可以把輸入的名字儲存,在下一次開App時可以把名字直接顯示出來,而不需用家再次輸入名字。

首先,我們當然需要把MainActivity的OnClickListener修改一下,讓其可以把所輸入的名字儲起。

@Override
public void onClick(View v) {
    String name = etName.getText().toString();

    SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString(SecondActivity.KEY_NAME, name);
    editor.commit();

    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    startActivity(intent);
}

SharePreferences就是用來把Data儲起的地方,”data”就是這個Preferences的key,而MODE_PRIVATE就是標示這個Preferences只有自己的App可以存取,還有其他的選擇可以參考Google Android的Documentation。

之後我們需要一個Editor去把SharePreferences的數值改變,記得最後要加上commit,這樣所改變的數值才會生效。

然後我們需要修改SecondActivity,讓其可以讀取在SharePreferences的數值,修改如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);
    String name = preferences.getString(KEY_NAME, "default");

    tvWelcome = (TextView) findViewById(R.id.textView_welcome);
    tvWelcome.setText("Hello, " + name);
}

在這裡我們要留意的是,在getString時我們需要提交一個預設的數值,讓SharePreferences找不到數值時以此作數值提交,換個說法,若沒有KEY_NAME時,name會等於default。

最後我們要回到MainActivity,在OnCreate作出修改,讓其可以在Activity開始前嘗試讀取數值,並決定要開始那一個Activity,修改後的MainActivity如下:

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

    private TextView tvGreeting;
    private EditText etName;
    private Button bnOk;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);

        String name = preferences.getString(SecondActivity.KEY_NAME, "default");

        if (!name.equals("default")) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
            finish();
            return;
        }

        setContentView(R.layout.activity_main);

        tvGreeting = (TextView) findViewById(R.id.textView_greeting);
        etName = (EditText) findViewById(R.id.editText_name);
        bnOk = (Button) findViewById(R.id.button_ok);
        
        bnOk.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        String name = etName.getText().toString();

        SharedPreferences preferences = getSharedPreferences("data", MODE_PRIVATE);
        Editor editor = preferences.edit();
        editor.putString(SecondActivity.KEY_NAME, name);
        editor.commit();

        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        startActivity(intent);
    }

}

第六課:Activity(一)創建新Activity

接下來的一課教大家,開一個新的Activity,並把上一個Activity的Data傳到另一個Activity。

首先,開啟上一課的App,先創建一個Activity,在src資料夾按右鍵,按New來加一個Activity,當然也可以像普通的Java class一樣創建,但記得要創建用戶介面的XML(activity_second.xml),及在AndroidManifest.xml加入新Activity的Permission。

PIC03_New_Activity_Structure

PIC01_New_Activity

PIC02_New_Activity

在AndroidManifest.xml中的<application>裡加入:

<activity
android:name="com.hktecmedia.android.tutorial.SecondActivity"
         android:label="@string/title_activity_second" >
</activity>

而在新的用戶介面的xml(activity_second.xml),只需要加上TextView的ID,全部源碼如下:

<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="match_parent"
         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=".SecondActivity" >

<TextView
                 android:id="@+id/textView_welcome"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content" />

</RelativeLayout>

現在就要修改MainActivity及SecondActivity,做到可以把在MainActivity的Data傳到SecondActivity。修改MainActivity的onClick為如下:

 @Override
 public void onClick(View v) {
         String name = etName.getText().toString();

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra(SecondActivity.KEY_NAME, name);
startActivity(intent);
 }

這裡要留意的是Intent這個Class,Intent其實就是「意圖」的意思,是告訴Android系統你的下一部是做什麼的,將來你也會不停用到Intent的。用Intent的putExtra是把data放到Intent裡,然後在SecondActivity透過KEY_NAME把name的內容拿出來。在這裡你可能會見到eclipse會指出SecondActivity.KEY_NAME有錯誤,在這裡可先不理會,因為我們現在就修改SecondActivity:

import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;

public class SecondActivity extends Activity {

public static final String KEY_NAME = "name";

private TextView tvWelcome;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

Bundle bundle = getIntent().getExtras();
String name = bundle.getString(KEY_NAME);

tvWelcome = (TextView) findViewById(R.id.textView_welcome);
tvWelcome.setText("Hello, " + name);
}

}

PIC04_App_Output
PIC05_App_Output

第五課:創建基本用戶介面(二)使用Dialog及Toast

今次要介紹的是Android中常用到的用戶介面互動部件,一個是Dialog,而另一個是Toast。學懂了這兩個也可以應付大部份的用戶互動,而且在開發過程中作為調試之用(當然專業的開發者不應該這樣做啦,但有時用這兩個真的方便得很)。

要用Dialog更用戶打招呼,要用的就是如上課所講述的按鈕事件監聽器,修改如下:

原有:

        tvGreeting.setText(R.string.hello);
        tvGreeting.append(" " + name);

修改為:

        AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this)
            .setTitle(R.string.hello).setMessage(name)
            .setPositiveButton(android.R.string.ok, null).create();
        alertDialog.show();

調試一下,你該見到如下的結果:

PIC01_Dialog
全部的源碼如下:

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

    private TextView tvGreeting;
    private EditText etName;
    private Button bnOk;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         tvGreeting = (TextView) findViewById(R.id.textView_greeting);
         etName = (EditText) findViewById(R.id.editText_name);
         bnOk = (Button) findViewById(R.id.button_ok);

         bnOk.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
         String name = etName.getText().toString();

         AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this)
             .setTitle(R.string.hello).setMessage(name)
             .setPositiveButton(android.R.string.ok, null).create();
         alertDialog.show();
    }

}

跟大家一起看看關鍵的兩句,第一要先要以AlertDialog.Builder創建一個AlertDialog,然後把Title,Message和Button的字串和按鈕事件監聽器設定好,Dialog的Button可以不只一個,而每一個Button也可以設定監視器(Listener),代表著每一個Listener可以有不同的反應,唯要注意的是這個OnClickListener是DialogInterface.OnClickListener。例如如此的話,當你按Dialog的OK後,EditText就會重新設置。

     AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this)
         .setTitle(R.string.hello).setMessage(name)
         .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {

             @Override
             public void onClick(DialogInterface dialog, int which) {
                 etName.setText("");
             }

          }).create();
    alertDialog.show();

到介紹Toast了,Toast其實就是一個短提醒,大多數會出現在螢幕的下方,就是如下圖所示的一樣。

PIC02_Toast

 

Toast的創建比較簡單,一句就可以了,但要留意的是不要忘記最後的.show()呀(這也是Android開發者的common mistake)。

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    private TextView tvGreeting;
    private EditText etName;
    private Button bnOk;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvGreeting = (TextView) findViewById(R.id.textView_greeting);
        etName = (EditText) findViewById(R.id.editText_name);
        bnOk = (Button) findViewById(R.id.button_ok);

        bnOk.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        String name = etName.getText().toString();

        Toast.makeText(MainActivity.this, "Hello! " + name, Toast.LENGTH_LONG).show();
    }

}

———————————————————————————————————————

如公司或個人需要設計專案、 網頁製作、 編寫Mobile Apps等,可以以下的電郵聯絡,我們的專業團隊能應付以上種種的工作。

如果你認為自己有一技之長,無論精通網頁、App、Server任何一項,都歡迎你寄作品、履歷到以下電郵。

電郵:

enquiries@hktecmedia.com / hktecmedia@gmail.com

第四課:創建基本用戶介面(一)創建按鈕事件

首先,如上幾課所教的,創建一個基本的Android Application Project。你會見到你的Project將如下:

PIC01_Project_Structure

在這裡要介紹幾個folder給大家,分別係src,res,gen folder:

src folder就是你的Java Code的地方,所有的Program Logic等等也是在這個folder裡面。

res folder是放著你的resource,包括icon,layout,value(string,color)等等也是這裡。

gen folder就是自動產生的Java檔案,理論上是不該改的,裡面有的主要是resource的id等。

另外AndroidManifest.xml是一個十分重要的file,整個App所需的permission,每一個Activity等也需要在那裡列出,當你需要創建一個新Activity或要用到手機的硬體等等,就可能要改動。

在接下來的幾課,小編將會教大家寫一個會以不同方法向用家打招呼的App,以認識Android的一些基本組件。

PIC02_Panel

開啟第一個Activity的layout file,你會見到左手邊會有著不同的組件,將來用到的話小編會解釋組件的用法。今次我們要用的是TextView,EditText,Button。TextView是用來顯示字串的,EditText是讓用家可以輸入字串,Button就是按鈕一個。你可以從左手邊拉出組件並修改組件特性,或是在改寫XML Code為如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >


<TextView

android:id="@+id/textView_greeting"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello" />

<EditText

android:id="@+id/editText_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="Enter your name here"

android:inputType="text" />


<Button

android:id="@+id/button_ok"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@android:string/ok" >

</Button>


</LinearLayout>

android:id就是為這個組件的ID,之後在Java裡就是用這一個ID去找出個別組件,android:hint就是EditText的輸入提示,而這裡你可以見到使用了三種字串(”@string/hello”,”Enter your name here”,”@android:string/ok”)。

“@string/hello”是自行創建的字串,你需要在res->values->strings.xml加入這個字串。

“Enter your name here”是一個直接字串,用法上是可以的,但不建議這樣用,特別是如果是多地區多語言的更加不贊成。

“@android:string/ok”是直接使用Android系統的內建字串,如果有合用的直接使用即可。

完成後的layout應如下:

PIC03_Layout

然後修改MainActivity.java如下:


import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;


public class MainActivity extends Activity implements OnClickListener {


private TextView tvGreeting;

private EditText etName;

private Button bnOk;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tvGreeting = (TextView) findViewById(R.id.textView_greeting);

etName = (EditText) findViewById(R.id.editText_name);

bnOk = (Button) findViewById(R.id.button_ok);

bnOk.setOnClickListener(this);

}

@Override

public void onClick(View v) {

String name = etName.getText().toString();

tvGreeting.setText(R.string.hello);

tvGreeting.append(" " + name);

}

}

在這裡要認識setContentView就是指定這個Activity要用哪個layout,而findViewById就是將這個layout裡的不同組件以ID作配對。要注意的是在要為Button設立事件監聽器(setOnClickListener),而監聽器以Interface的形式嵌入在MainActivity當中,所以Button的事件在onClick入面建立即可。

第三課:創建Android Virtual Device(AVD)

在開發Android App的時候,不一定每一次也要把App放到真機試,每次用真機試對真機也不好,假如App在開發期間有Code會導致不可修復的問題的話,就大件事了。

為此,Android SDK提供Android Virtual Device(AVD),以解決上述問題,和讓開發人員可以於不同Version和不同螢幕大小和配置的Android上測試其開發作品。

要創建AVD,可以到Windows > AVD Manager。你會見到以下視窗,你可以按New創建一個新的AVD:

PIC01_AVD

PIC02_AVD_Setting

創建AVD的時候,你可以改變以下配置:
Device:你可以在此選擇一個常見的機種,也可以從Device Definitions創建一個新的機種。
Target:在此可以選擇Android Version(Android API/Google API也可以,視乎你的App有沒有使用Google API)。
Front/Back camera:如果你的電腦有Webcam的話,你可以用Webcam當作AVD的相機。
SD Card:在此你可以選擇你的SD Card大小。

PIC03_Android_Device_Chooser

如果你已創建了AVD的話,你可以選擇你的Android Application Project並按Run,然後就可以從如下視窗選擇AVD,就可以見到你的App在Android了。

PIC04_Device_Definitions

有關AVD的詳細資料,如AVD Shortcut等,可以參考:

http://developer.android.com/tools/help/emulator.html

———————————————————————————————————————

如公司或個人需要設計專案、 網頁製作、 編寫Mobile Apps等,可以以下的電郵聯絡,我們的專業團隊能應付以上種種的工作。

如果你認為自己有一技之長,無論精通網頁、App、Server任何一項,都歡迎你寄作品、履歷到以下電郵。

電郵:

enquiries@hktecmedia.com /

hktecmedia@gmail.com

第二課:第一隻Android App

上一課教了大家架設了Android開發環境,現在要做是開始一個新的Android專案,順便確定所架設的開發環境沒有問題。

Eclipse會把你所寫的Code用專案(Project)的形式儲存,所以要開始你的每一個App,第一件事要做的,就是要在Eclipse中開一個新專案。首先去File -> New -> Android Application Project,如果沒有的話請按Other選取:

PIC01_New_Android_Project

如果你是比較常寫Android的話,也可按下列方法把Android Application Project的選項放到File -> New中:

PIC02_Customize_Perspective

PIC03_Customize_Perspective

按了新專案,第一個見到的畫面如下:

PIC04_New_Android_Application

Application Name就是在Google Play內會見到的App名,在這階段可以暫時作一個上去,之後可以改的(還可以按不同語系改變)。

Project Name就是在你的Workspace上的專案名稱,不是你的App的名稱。

Package Name是你的App的獨立記認,Google Play是用這個Package Name來區別同名的App的,只要你的Package Name不和已有的Google Play App相同的話就沒有問題了。

Minimum Required SDK就是你的App最低的支持的版本,也可以隨著你開發時而有所改變。

Target SDK是跟Android System說你是在這個Android Version測試你的App。

然後你可以先加你的App Icon,和創建第一個Activity,有三款Activity可以給大家選的,先選第一種Blank Activity。

PIC05_New_Activity

PIC06_Activity_Type

創建完畢,你會在Project Explorer見到如下的架構。

PIC07_Project

就是這樣,你的第一個Android App便誕生了。

———————————————————————————————————————

如公司或個人需要設計專案、 網頁製作、 編寫Mobile Apps等,可以以下的電郵聯絡,我們的專業團隊能應付以上種種的工作。

如果你認為自己有一技之長,無論精通網頁、App、Server任何一項,都歡迎你寄作品、履歷到以下電郵。

電郵:

enquiries@hktecmedia.com /

hktecmedia@gmail.com

第一課:架設Android開發環境

古語有云:「工欲善其事,必先利其器」。要做好Android Development的工作,首先就是要架設一個好的Android開發環境(Development Environment)。

要開發Android App,你必先要 Java Development Kit (JDK),因為Android是以Java來編程的,所以你必需安裝JDK(如果是使用Mac機的話,可以跳過此步,Mac OS X內應有Java)。

安裝JDK

首先到以下網站,選擇適合自己的版本下載JDK:

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

PIC01_Download_JDK

Windows的話按指示完成就可以了,Linux的話就解壓縮,找個地方放好。

然後我們需要一個IDE(Integrated Development Environment,亦稱集成開發環境)。IDE坊間有很多,開發Android比較常用的有eclipse,IntelliJ IDEA,或者google自家開發,但其實是IntelliJ IDEA的Android Studio。

在接下來的教學,小編會選擇eclipse,因為eclipse加Android的網上資源較多,如果有困難時初學者會較容易在網上找到資源解決,當然我們也歡迎大家在下面留言發問交流啦!

eclipse IDE可到以下網頁下載:

http://www.eclipse.org/downloads/

Download Eclispe
Download Eclispe

下載 Eclipse IDE for Java Developers,然後解壓縮,找個地方放好。

有了IDE,你還需要以下的東西:

Android Software Development Kit (Android SDK)

Android Development Tools (ADT)

安裝Android SDK

到下列網址,選擇適合的版本,然後解壓縮(注意只是下載SDK):

http://developer.android.com/sdk/index.html

Download Android SDK
Download Android SDK

然後在安裝ADT前,先設定環境變數。在Windows設定環境變數,「我的電腦」>「內容」>「進階系統設定」>「環境變數」>「新增」,輸入以下兩項:

變數名稱:JAVA_HOME

變數值:你的JDK路徑(例: C:\Program Files\Java\jdk1.x.x_xx\bin)

變數名稱:ANDROID_HOME

變數值: 你的Android SDK路徑(例: C:\android\android-sdk_r04-windows\android-sdk-windows\tools)

之後就可以開啟eclipse來安裝ADT了,開啟eclipse時你會看見一個視窗詢問你Workspace的位置,Workspace就是將來儲存Project的地方。進入eclipse主畫面之後,就按「Help」>「Install New Software」。

Eclipse Install New Software
Eclipse Install New Software

然後在按「Add」,在彈出的視窗中輸入:

https://dl-ssl.google.com/android/eclipse/

剔選「Developer Tools」後按下一步,然後按指示完成。完成後,重新開啟eclipse。

Add Developer Tools
Add Developer Tools
Select Developer Tools
Select Developer Tools

接下來,只需設定eclipse用的Android SDK位置就可以了。

Add SDK Location
Add SDK Location

還記得上文下載Android SDK時,還有一個下載項目叫:ADT Bundle,那個就是eclipse加Android的懶人包了。

最後,按自己的需要,按Android SDK Manager更新自己需要的就可以了。

———————————————————————————————————————

如公司或個人需要設計專案、 網頁製作、 編寫Mobile Apps等,可以以下的電郵聯絡,我們的專業團隊能應付以上種種的工作。

如果你認為自己有一技之長,無論精通網頁、App、Server任何一項,都歡迎你寄作品、履歷到以下電郵。

電郵:hktecmedia@gmail.com