顯示具有 初學 標籤的文章。 顯示所有文章
顯示具有 初學 標籤的文章。 顯示所有文章

2012年12月6日 星期四

Eclipse更新後出現錯誤(Incorrect line ending: found carriage return (\r) without corresponding newline (\n))

今天更新後,在xml出現這個錯誤
Incorrect line ending: found carriage return (\r) without corresponding newline (\n)
使用更新前的版本卻沒有出錯,後來找到了解決方法

 原本的寫法
 <LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/gradient_white"
    android:orientation="vertical" >

後來改成
 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/gradient_white"
    android:orientation="vertical" >

這樣子就解決了,推測更新的版本要求每個xml指令,必須換行才能正確執行

另一種方法更有效,Ctrl+Shift+F  按下後,儲存即可

2012年11月23日 星期五

更換Activity為進入程式的第一個內容

當我們有很多個Activity時,要將某一個Activity設定第一個進入時
執行的內容,只要在AndroidManifest.xml中設定
 如下面這個例子:
要將SecondActivity設為主要的Activity,只要將紅色的內容放進去就可以
但是,請注意,只能放在一個Activity中
  <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
           
        </activity>
        <activity android:name="SecondActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        </activity>

2012年11月16日 星期五

程式與界面連結

 當我們建立一個專案,開始進來時android都會預設一些method()
而我們在規畫主程式時,執行的核心通常都在onCreate()之中
下面以一個簡單例子來說明,讓我們的程式能與我之前說明的layout產生關聯

程式源碼:
//這裡為你專案設定的名稱
package com.example.helloworld;
//將需要的method載入
import android.os.Bundle;
.
.


//宣告方式有public(公開)、private(個別)、protected(受限制的)
但主要或共用method一定要public
//extends代表繼承,在這裡我們設定的內容是個活動(activity)所以要繼承Activity
  這樣子我們才能始用預設好的Activity方法


public class MainActivity extends Activity
 {
    //開始宣告一些變數,這些變數與誰連結、屬於那一類別、要做什麼功能
        都與這些變數有關
   //宣告tv1,tv2為TextView類別的變數
    TextView tv1, tv2;
   //宣告bt1為Button類別的變數
    Button bt1;
    //宣告lay1為View類別的變數(這個可用於控制layout)
    View lay1;   
   //註解Override為覆載,也就是說執行這個method時一定要看父類別中是否有onCreate
       這個函數,如果沒有則無法使用
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 設定要顯示的內容視窗
        setContentView(R.layout.activity_main);
        // 指定tv1與介面的textview1連結
        tv1 = (TextView) findViewById(R.id.textView1);
        // 指定bt1與介面的button1連結
        bt1 = (Button) findViewById(R.id.button1);
        // 指定介面的layout與lay1連結
        lay1 = (View) findViewById(R.id.lay1);  
    }
  

監聽你的Button或界面(On Click)

當我們在程式中的變數與界面中連結後,在界面中的所有動作可以
適當的傳給程式,然後由程式去判斷要做什麼動作,但通常只會
做一次,除非我們有設定監聽器,才會針對每次的變化去做處理
最常見的是Button,它按下後我們會看見圖案的變化,但實際上,
每個物件都可以設變化
下面的例子將簡單說明監聽器的使用方法

//直接在這個活動中植入監聽器(implement OnClickListener)
public class MainActivity extends Activity implements OnClickListener {
    TextView tv1, tv2;
    Button bt1;
    View lay1;
      @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
         tv1 = (TextView) findViewById(R.id.textView1);
           bt1 = (Button) findViewById(R.id.button1);
        /*
         * this代表這個activity的內容 setOnClickListenr代表設定監聽器
         * 而連結的監聽器已用implements內建在Activity之中
         */

         //將bt1這個變數設監聽器,只要界面中與它連結的button被按下,就會反應
        bt1.setOnClickListener(MainActivity.this);
         //將tv1這個變數設監聽器,只要界面中與它連結的textview被按下,就會反應
         tv1.setOnClickListener(this);
        // 指定介面的layout與lay1連結,並設定監聽器Listener     
        lay1 = (View) findViewById(R.id.lay1);
        lay1.setOnClickListener(this);
        }

    // 每個監聽器都必須有OnClick來指定後續的動作View則代表所要監聽的視
    public void onClick(View v) {
        // if 如果符合條件,則做if裡面的動作,只做一次
        //bt1==v表示如果視窗中按下的是button
        if (bt1 == v) {
            //文字的內容顯示為"TEST BUTTON", 而文字顏色為紅色
            tv1.setText("TEST BUTTON");
            tv1.setTextColor(Color.RED);
        }
        //tv1==v表示如果視窗按下的是texeview
        if (tv1 == v) {
             //文字的顏色為綠色,並且將string中的文字讀取出來
                tv1.setText(R.string/TextViewShow);
                tv1.setTextColor(Color.GREEN);
                 }
          //lay1==v表示如果視窗按下的是layout而不是button或textview
        if (lay1 == v) {
           //文字的顏色為灰色,並且顯示的內容為"TEST VIEW"
            tv1.setText("TEST VIEW");
            tv1.setTextColor(Color.GRAY);
        }
    }

Layout的基本設計

預設的專案中,android已給定一個Relative的界面
上面這個界面很簡單,而裡面包含了3個物件~layout、textview、button
由這個結構可看出RelativeLayout包含了2個物件TextView與Button在裡面
結構簡單表示:
    <RelativeLayout
          <TextView     />
          <Button         />
     />

以下為它的xml源碼
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    (給定layout一個名稱lay1,而自訂id一定要用@+id/名稱)
    android:id="@+id/lay1"  
    (設定它的寬度 match_parent表示符合父層的寬)

    android:layout_width="match_parent"  
    (設定它的高度 match_parent表示符合父層的高)
    android:layout_height="match_parent" >   

        <TextView
         (給定textview一個名稱textView1,而自訂id一定要用@+id/名稱)
        android:id="@+id/textView1"
         (設定它的寬度 wrap_content表示符合輸入內容的寬)
        android:layout_width="wrap_content"
           (設定它的高度 wrap_content表示符合輸入內容的高)
        android:layout_height="wrap_content"
         (alignParentTop代表要以父層的最高處為參考線)
        android:layout_alignParentTop="true"
           (centerHorizontal代表是否要在水平的中央處)
        android:layout_centerHorizontal="true"
            (marginTop代表離上邊多遠處,48dp代表距離)
        android:layout_marginTop="48dp"
             (文字內容可直接寫入,要代入字串則用@string/字串名稱)
        android:text="@string/TextView"
             (文字的外觀:下面是android預設的字形(大的))
        android:textAppearance="?android:attr/textAppearanceLarge"
        />

       <Button
          (給定textview一個名稱Button1,而自訂id一定要用@+id/名稱)
        android:id="@+id/button1"
         (設定它的寬度 wrap_content表示符合輸入內容的寬)
        android:layout_width="wrap_content"
           (設定它的高度 match_parent表示符合父層的高)
        android:layout_height="wrap_content"
         (alignParentBottom代表要以父層的最底處為參考線)
        android:layout_alignParentBottom="true"
         (alignParentLeft代表要以父層的左邊為參考線)
        android:layout_alignParentLeft="true"
         (marginBottom表示要離底部多遠)
        android:layout_marginBottom="136dp"
         (marginLeft表示要離左邊多遠)
        android:layout_marginLeft="37dp"
        android:text="@string/Button"
         />

</RelativeLayout>

專案中的結構說明

每個專案形成後,會自動形成許多資料夾

src:主程式設計的放置處。在裡面會有package,
        程式碼都放置在此

gen:最重要的位置,但我們不用去改(也不要亂改)
        所有的設定變數,都會在R.java出現
assets:外部的資料、儲存都放置在此
libs:資料庫儲存的位置
res:大部份引用的資源都放置在這裡
drawable:圖片、背景顏色、特效都放在此處
        android會預設hdpi、ldpi、mdpi、xldpi
        這是預防有此圖片放大後會不好看,因此針對
        不同的解析度,放置同名但不同畫質的圖片
layout:設計ui界面
menu:選單的放置處
values:裡面可放置color、string、style、theme
             的設定, 現在android形成新專案後會預設
             API11(values-v11)及API14(values-v14)的theme   
AndroidManifest.xml是很重要的設定,如果這裡出錯
            R.java的變數設定會出不來,則程式無法運行
            所有的權限設定及多設定的Activiy及Service
            都要在這裡寫入

在Eclipse中import一樣的Project

在Eclipse中要放入一樣的程式有幾個步驟,寫一下,怕下次又忘了
一、將原本的專案名稱改名
   方法:在專案名稱中按右鍵,選Refator/Rename改成新名稱
        例:Hello_World -->New_Name
這個時候就可以import另一個一模一樣的專案(但檔案放置的位置
         要不一樣,也就是要有2個資料夾在)
二、import成功後有幾個地方要改
    1、src裡面的package要改名稱
   例:com.example.helloworld --> com.example.newname
    2、AndroidManifest.xml裡面的名稱要改package
      例: 找到原本的package名稱
          com.example.helloworld改成新的com.example.newname
   這樣子就可以使用一模一樣的專案了
補充:app name也要改否則apk中會有2個一模一樣的名稱出現 

2012年7月6日 星期五

for、 while、 if、 switch 怎麼用?


  還記得開始寫android的時候,因為不熟悉程式碼,看到這4個指令:
    forwhileifswitch
的時候總是被這4種看似判斷又像迴圈的指令搞混(特別是ifwhile)。
到底何種時候用那種比較合適呢,其實看個人習慣,不過這四種指令
一定要分清楚的觀念:是否為迴圈!
迴圈代表它會一直重覆動作,並不會跳出來或自動終止(除非已不符合它
迴圈的條件),所以在用迴圈時,一定要特別注意它的判斷條件,否則很
容易造成無窮迴圈的形成~

這四種指令我們可以分成兩類,一類是單純的判斷(ifswitch),另一類就
是迴圈(forwhile),這裡先從容易理解的開始說起

1、switch(判斷式)

基本上它是尋找符合的條件才跳進去
舉例來說:
switch(a)   // 尋找a這個參數符合的條件
{
case 1: //a=1的動作
break;//中斷
case 2://a=2的動作
break;
case 3://a=3的動作
break;
default://預設的動作
break;
 }
由上面這個範例我們可以看出,尋找a=1a=2a=3及不符合
這些條件
(default)時的動作,每個條件做完之後,我們都要再加上break(才會跳出switch,不然只會浪費資源往下繼續找其他符合的條
件,當然大多已不符合了
),而我們用break的好處是我們只用switch
來做一次尋找並判斷,當找到我們要的之後,就可以跳開
switch,繼
續往下一個動作去執行。
    另外,我們用的參數是要以整數(int)來放,字串(string)不行放入switch

2、for(有條件的迴圈)

for(初始變數;判斷式;遞增式)
舉例:
for(int i=0;i<3;i++)//給定初始整數i=0,當小於3時則開始這區塊內的動作
                              //當i=3的時候就停止
{
要執行的動作
}
以這個例子來看,它的動作會作3(因為i012)到i=3的時候,它就停了

3、if(判斷式)

舉例來說:
int i=0;
if(i<3)
{
i++;
}
這個結果會出現i=1(因為i=0,然後因為i++, i加了一次變成1)
請注意:這個過程你會覺得跟for的範例幾乎一樣,但結果就是不同!!

4、while(迴圈)

跟上面的if用同樣的例子來比較
舉例:
i=0;
while(i<3)
{
i++;
}
這個結果會出現i=3(因為i=0,然後i++,一直加到i=3,迴圈共走3)
請注意:這裡的範例跟for很像,也是迴圈,但是~它們出現的結果不太一樣
如果你將i的結果show出來:
for      :i=2(由0、1、2)
if        :i=1(只加1次)
while :i=3(由1、2、3)
上面四種指令是常容易搞混的,因為很多時候它們是通用的(寫法不一樣
而已
),所以在使用時先想清楚,要做判斷還是要做迴圈,這樣子在用時比
較不會出錯
~

2012年7月5日 星期四

Eclipse無法更新!


今天要用很久沒開的筆電寫一些範例程式,結果進入Eclipse時提示我要更新,
卻發現我無法更新這些ADT?原來google將更新網址改變了,所以提醒一下自
已這個新網址https://dl-ssl.google.com/android/eclipse/,免得突然又找不到了@@

2012年7月1日 星期日

開發 android app(模擬器篇)


       還記得當初開始學習開發android時,好不容易將eclipse安裝好 (當時,連安裝都有問題,這個問題初學者常發生,而且是看著市售的書照做時常發生的事,但相信現在這個問題已被解決了),然後很開心的照書抄了1Hello Android的基本code(連這個都用1個個字母打出來的,就知道我多蠢了!!不對,應該說我很認真= =!),然後很快樂的設了2個模擬器,第1個還好(android2.1),大約等個10分鐘就出來了,第2(android3.0)等不出來,然後我很用心的上網找,看見有人說他曾開了1天才出來,所以我就很放心的去睡,過了4小時真的出來了~然後第2次要開它,又再等個4小時(所以很久很久的時間,我沒用過android3.0),直到android4.0出來後,為了不想等1天開它(真的等1天,而且還開不出來)才發現了原因……模擬器的ram要設的愈大愈好(當然不能超過你的電腦負荷)

  說了那麼多,回到主題~

Android 的模擬器,我們依據它的版本來看:
android 2.x.x的為手機專用
android 3.x.x為平板專用
android4.x.x則為手機、平板兩者適用
所以基本上在現在的開發都以4.x.x的模擬器來做比較好(如果電腦跑的動)

下面為sdk路徑的設定,以及模擬器設定的圖解

1、先從Windows/Preference設定sdk的路徑


  

2、進入Android設定sdk的路徑,此時你會看到能使用的API(要常常update才有新版本)


3、一旦sdk路徑好了之後,我們就能從Windows/AVD Manager設定模擬

android4.0.3的設定來看


最後仍然建議初學時以android2.1 2.2來使用就好


不論在我們怎麼設定模擬器,2點一定要設定
1、Snapshot一定要勾選
2、Device ram size設的愈大愈好
這麼一來保證開啟時一定快很多(但不保證第一次一定很快)

2012年6月25日 星期一

初學android必先了解的五大語法觀念


記得初學android時所看到一堆的程式碼,心中就在想,這麼多奇怪的函數要全記起來要花多久呀@@!什麼都不懂的我只好照書本寫的程式一個一個抄,每個語法一個一個去找解釋,然後抄原文解釋來看(結果抄完後,隔天也看不懂它代表什麼意思),一直苦練半年(抄了上百個程式)才對程式一知半解,也才發現自已浪費了許多時間背程式碼、抄程式碼(程式碼的背誦不是android要我們去學的,還有更多重要的內容學習),為了不讓想學android的初學者跟我走一樣浪費時間的路,下面幾個重要觀念一定要先記起來,才不會耗費不必要的時間。





一、口語化的函數或指令

        在android生命周期中有onCreateonPauseonDestory…等等
由這些函數可知道其中所代表的意思或做法:onCreate(創建期間)onPause(暫停期間)
onDestory(毀滅期間),許多預設的函數,它的字義就是如此,所以如果你看到很長的函數或指令,拆開來看就能了解它的意思,比如:StartActivityForResult
你可以拆成Start Activity For Result,這代表依照不同結果來開始一個活動。
         在android程式設計中,空白代表一個程式碼或一個定義的結束,所以我們在命名或定義時才會將名稱連在一起而不留空白。

二、函數的執行

         android是一種物件導向,也就是說每個函數、每個動作、每個元素都可當作一個物件,在物件中又有許多不同的類別與執行動作,所以我們要讀取或執行物件中的函數或動作時,都用“.”來執行所要的指令。
例如:Button.onClickListenr() ,這代表是在Button類別中執行on click listener(按下的監聽器

三、大、小寫的差別

       如果常接觸java,有時候會覺得是不是自已寫錯程式碼了(大小寫不同),但這些程式碼卻偏偏可以執行而沒有出現錯誤?
其實這些大小寫的意義不相同,但常常會混淆,例如:int,Integer ; double,Double ; float,Float,這些看似相同,但其實有它的意義在(不然的話,開發程式者寫這種無聊的東西出來做啥)
小寫是基本類型,也就是說它可以直接存數值。
例如:int i=1(定義 i 為整數1)
而大寫可以代表1object(物件)
例如:Integer i=new Integer(1);(定義i為一個整數物件,而此物件為整數1)
那為什麼要這麼麻煩的做法呢,因為當我們遇到某些函數,它的參數無法直接放入數值,只能放入物件,所以我們才必須把數值包在物件之中,例如:ArrayListHashMap等函數…

四、父子關係

        在函數中有許多類別,而這些類別中又分許多子類別出來,當我們在使用函數時就 注意這些差別。通常每個類別只能有一個父類別,而在子類別中可以用“extends”來繼承父類別,繼承後可以擁有父類別的所有函數、變數。
例如:class test extends Activity{}:這代表我們新建一個testclass,而它繼承了父類別Activity的所有函數、變數。所以當我們在testclass中使用onCreate(){super.onCreate();}
這代表我們可以用“super”這個方法來讀取父類別中onCreate()的功能。

五、變數

在很多函數或方法中我們都必須代入參數,而這些參數的類型我們可以分為常用的幾種類型
1、Object:物件
2、String:字串
3、Value:數值(int double float……不同的數值是不互通的)
這些變數彼此之間是無法直接通用,必須通過轉換才可以使用,所以在引用參數時,我們都必須清楚知道他們之間的關聯才可以,為什麼這邊要特別講變數呢?因為在android之中,我們常用R.java中的參數來代入,在R.java中的參數都是數字,但是它們可以代表物件、字串或數值,所以有時候引用時一旦沒注意,就會形成例外出錯…

Android的起源與認識

Android操作系統於200711月公開發表,它是由google手機開放聯盟(Open Handset Alliance, OHA)共同發展。在短短的5年之間,Android的系統不斷的開發更新,更新版本如 Cupcake Donut Eclair Froyo Gingerbread Honeycomb 以及 Ice Cream Sandwich等等, 這些版本不斷地擴張手機所能支援的功能 ,甚至到了 匪夷所思的的地步。下面這張圖可以詳細說明每次版本更新所帶來的新功能。

究竟Android是什麼呢?

        它是移動操作設備系統,只要是移動設備的硬體,都可以用Android植入系統來達到所要的效果,而我們今日所見的移動設備大多以手機與平板為主,可是實際上它的功能會比我們想像的還要多很多…


在這邊我們先由軟體支援開始,Android系統中的應用程式框架,裡面有包含4個基本元件(活動、服務、廣播與內容提供)、資源管理、視窗這些都能以API的方式取得,然後建構出各式各樣的app,當然也有許多函式庫可以取得(這裡的函式庫是以C/C++建構),在google play上所有軟體都由應用程式框架與函式庫互相配合取用而創造出來~到這裡,好像創造出一個程式,感覺不會太困難~實際上真的不困難,因為google已經利用Android系統幫你取得了多數軟硬體設備的控制權(如:多媒體、藍芽、wifigps3DSQLite web)而我們所需要做的就是熟讀文件並且將正確的參數代入即可得到我們要的效果。


        可是這些功能applewindows也能做到,而且apple做的也比android來的簡約、便利,為什麼還要學Android??相信這是許多人的疑問~我只學Andorid,沒寫apple(當然不是程式難學的關係)Android最大的特點在於開放!!!他不一定只能用在特定硬體,你可以自製硬體,然後與Android互相結合成你要的東西,看下面的影片你就知道它的威力在那!





相信由這兩部影片你可以發現,他們都是用手機去控制的(廢話!!!!),更正確的說法~他們是用android去控制的,這也就是我們要說的第2個部份,硬體支援~只要你想做自已的電子設備,用你的手機去控制硬體,那就用android~這是windowsapple所不容易做到的。

2012年6月19日 星期二

開始你的android app(安裝篇)


    記得開始寫android之前,安裝需要的環境(java、eclipse及android sdk還有開啟它的模擬器)時,等待的時間有夠漫長,長到令人狂打瞌睡(自已的電腦等級不夠,又不能打電玩只能看看網誌、新聞,一直等待並打哈欠…)整個過程花費約2個小時左右,所以請耐心依以下步驟安裝並更新。





第一步:下載java jdk(這裡提供java下載網址,請找適合自已電腦的安裝)

 

下面為詳細步驟說明提供操作參考




第二步:安裝eclipse開發程式,並且設定其ADT(eclipse下載網址)

 

安裝詳細說明



第三步:下載android sdk並且設定模擬器
 (這裡的步驟是最耗時的地方,下一篇會詳細介紹這部份的模擬器)


下載android sdk 並且執行模擬器的詳細介紹

整個更新過程至少要3小時以上,請耐心等待,而模擬器的開啟,建議先用android2.1
一開始會比較快速,如果用android4.0以上,要確定你的電腦ram至少2G,否則不建議
使用andoid4.0以上的模擬器。


1116補充:
尋找更新時,新增site: http://dl-ssl.google.com/android/eclipse