在開始研究如何抓取 sensor 資訊前,我們來簡單瞭解一下 android app project 的組成。在MainActivity.java 中你的所有程式邏輯都從這邊開始,activity_main.xml 是存放及描述你的 UI 組成方式,你可以使用 eclipse 的 UI 編輯器,調整各種 UI 元件的位置、大小,亦或是到 XML 純文字編輯的方式,直接調整各元件的參數。
下面兩段 MainActivity.java 跟 activity_main.xml 是由empty sample project 修改而成的簡單倒數計時器:
這是 MainActivity.java code :
package com.example.test;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; //#
import android.view.View.OnClickListener; //# 監聽 onClick event
import android.widget.TextView; //# 拿來控制 UI 中的 TextView 元件
import android.widget.Button; // # 同上,控制 Button 元件
import android.os.CountDownTimer; // #使用 android os 中內建的倒數計時器
public class MainActivity extends ActionBarActivity {
private boolean timerHasStarted = false ;
private Button startB;
private ThisIsATimer CountDownTimer; // 拿我們寫的 ThisIsATimer Class 來用
private TextView TimeView;
private TextView ElapsedView;
private long timeElapsed;
private final long startTime = 50*1000;
private final long interval = 1*1000; // 1 sec. per time interval
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startB = (Button) this.findViewById(R.id.button1);
startB.setOnClickListener(new Button_Listener(this)); //拿我們寫的 Button_Linstener Class 來用
TimeView = (TextView) this.findViewById(R.id.timer);
ElapsedView = (TextView) this.findViewById(R.id.timeElapsed);
CountDownTimer = new ThisIsATimer(startTime, interval);
}
@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);
}
public class ThisIsATimer extends CountDownTimer{
// 建立一個 Timer class , 繼承自 CountDownTimer
public ThisIsATimer(long startTime, long interval) {
super(startTime, interval);
}
@Override
public void onFinish(){
TimeView.setText("Time's Up");
ElapsedView.setText("Time Elapsed:" + String.valueOf(startTime));
}
@Override
public void onTick(long millisUntillFinished){
TimeView.setText("Time remain : "+ millisUntillFinished);
timeElapsed = startTime - millisUntillFinished;
ElapsedView.setText("Time Elapsed : " + String.valueOf(timeElapsed));
}
}
class Button_Listener implements OnClickListener {
//建立一個 Button_Lintener Class 繼承自 onClickListener , 觸發 onClick event
public Button_Listener(MainActivity activity) {
// this.activity = activity;
}
@Override
public void onClick(View view) {
if(!timerHasStarted){
CountDownTimer.start();
timerHasStarted = true;
startB.setText("RESET ME!");
}else{
CountDownTimer.cancel();
timerHasStarted = false;
startB.setText("Start Counting... 50 Sec.");
}
}
}
}
這是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="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="com.example.test.MainActivity" >
<TextView
android:id="@+id/timer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/Time" />
<!-- Call Resource String,
需要到./res/values/strings.xml
建立 Name => Value 對照
-->
<TextView
android:id="@+id/timeElapsed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/timer"
android:layout_below="@+id/timer"
android:text="@string/Time_elasped" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/timeElapsed"
android:layout_below="@+id/timeElapsed"
android:text="Start Counting... 50 Sec." />
<!-- Hardcode string 方式 -->
</RelativeLayout>
建議練習時一個字一個字打完,可以加深對於各種不同程式語言的掌握程度。這類型的學習方式可以參考 google keyword "Learn Python the Hard Way" 這是我自己學習各種不同程式語言習慣的方式,順便分享給大家參考。
今天就到這一段落,我們明天見。應該可以進入怎拿感應器資料了 (吧?)