程式功能 :
在主畫面的兩個 EditText 欄位中分別輸入座標值 X 與 Y,按『執行』鈕後,將預設的小圖示顯示在指定的座標位置上。
程式運作簡略說明 :
我們要由 MainActivity 中把座標資料傳給 SecondActivity,然後再由 SecondActivity 接收到座標資料後透過 DrawBitMap 將小圖示顯示出來。我們要借助 Intent 與 Bundle 這兩個物件來達到 Activity 之間資料傳送的目的。
特別注意幾個重點 :
1 . 在 AndroidManifest.xml 中加入第二個 Activity 的名稱敘述
為了讓第二個 Activity 能正常運做,還必須在 AndroidManifest.xml 定義檔中加入第二個 Activity 的名稱 (此範例為 SecondActivity),敘述的位置要放在 <application> ... </ application> 之中,請參考下方 AndroidManifest.xml 定義檔 : Practice2/AndroidManifest.xml 中的紅色字體。留意這行敘述的 .SecondActivity 前方的點 " . " 千萬不要漏掉了 ! android:name=".SecondActivity" 那個點 "." 的意義你可以想成是放置在 package="a.b.c" 包裹之中的意思,其全名可表示為 a.b.c.SecondActivity 由於定義檔開頭已經明確宣告 package="a.b.c",所以可以只用 "." 來表示 Activity 所放置的位置就是在 "a.b.c" package 之中。(package 的名稱請依照您自己為 Project 所設定的為準)
2 . 使用 Intent 與 Bundle 來傳送資料
重點請參考下方程式碼中以紅色字體標示的部份,已加上註解說明,這邊我就不再贅述囉 !
PS : 程式中並沒有對超出座標範圍的資料做進一步的處理,有興趣者請自行加上。
佈局檔 : Practice2/res/layout/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" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" android:textAppearance="?android:attr/textAppearanceSmall" android:textSize="22sp" tools:context=".MainActivity" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText2" android:layout_alignParentRight="true" android:layout_marginTop="50dp" android:ems="10" android:inputType="number" > <requestFocus /> </EditText> <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/editText1" android:layout_toRightOf="@+id/textView1" android:ems="10" android:inputType="number" /> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText2" android:layout_below="@+id/editText2" android:text="@string/make_sure" /> <Button android:id="@+id/btn_end" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/btn_start" android:layout_alignBottom="@+id/btn_start" android:layout_alignParentRight="true" android:text="@string/end" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editText2" android:layout_alignBottom="@+id/editText2" android:text="@string/location_y" android:textSize="25sp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editText1" android:layout_alignBottom="@+id/editText1" android:layout_alignParentLeft="true" android:text="@string/location_x" android:textSize="25sp" /> </RelativeLayout>
字串資源檔 : Practice2/res/values/strings.xml
<resources> <string name="app_name">定點PO圖</string> <string name="hello_world">指定座標並顯示圖片</string> <string name="menu_settings">Settings</string> <string name="title_activity_main">定點PO圖</string> <string name="make_sure">執行</string> <string name="end">結束</string> <string name="location_x">請輸入 X 座標</string> <string name="location_y">請輸入 Y 座標</string> </resources>
AndroidManifest 定義檔 : Practice2/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="a.b.c"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/app_name" >
</activity>
</application>
</manifest>
Java 程式碼的部份 :
(MainActivity) : Practice2/src/a/b/c/MainActivity.java
package a.b.c; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class MainActivity extends Activity implements OnClickListener { Button btn_start, btn_end; EditText editText1, editText2; int x,y; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WidgetSetting(); //設定元件 } private void WidgetSetting() { btn_start = (Button)findViewById(R.id.btn_start); btn_end = (Button)findViewById(R.id.btn_end); editText1 = (EditText)findViewById(R.id.editText1); editText2 = (EditText)findViewById(R.id.editText2); //設定兩個按鈕的監聽 btn_start.setOnClickListener(this); btn_end.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub //利用元件的 Id 來判別是哪個按鈕被按下了 switch(v.getId()) { case R.id.btn_start: //執行鈕被按下 TransferData(); //進行資料傳送 break; case R.id.btn_end: //結束鈕被按下 finish(); //直接結束 break; } } private void TransferData() { //按下 [執行] 鈕進行傳送資料的程序 //判斷兩個輸入欄位是否有資料輸入 //若無輸入則給予 0 //這是一種偷懶的做法 XD //攔截到錯誤時就給予 0 數值 //若有輸入則把兩個輸入欄位的資料 //轉換成數值後再指定給 x,y try { x = (int)Integer.parseInt(editText1.getText().toString()); } catch (Exception e) { x = 0; } try { y = (int)Integer.parseInt(editText2.getText().toString()); } catch (Exception e) { y = 0; } //透過 Bundle 夾帶資料並隨著 Intent //傳送到下一個 Activity 的 4 個步驟 //1. 宣告 Intent 並指定去向 //由 MainActivity 傳到 SecondActivity Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); //2. 利用 Bundle 物件來夾帶資料 Bundle bundle = new Bundle(); //LOCATION_X(Y) 為識別字, x 為資料(值) //接收方可透過識別字來提取資料(值) bundle.putInt("LOCATION_X", x); bundle.putInt("LOCATION_Y", y); //3. 接著利用 intent 的 putExtras 方法 //將 bundle 物件附加到 intent 上 intent.putExtras(bundle); //4. 傳送到下一個 Activity startActivity(intent); } }
(SecondActivity) : Practice2/src/a/b/c/SecondActivity.java
package a.b.c; import android.app.Activity; import android.os.Bundle; //第二個 Activity public class SecondActivity extends Activity { int X,Y; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(new DrawBitMap(this)); //接收並處理 MainActivity 傳過來的資料 ReceiveXY(); } private void ReceiveXY() { //接收由 MainActivity 傳過來的資料 Bundle bundle = this.getIntent().getExtras(); //透過識別字將值取出 this.X = bundle.getInt("LOCATION_X"); this.Y = bundle.getInt("LOCATION_Y"); } }
(DrawBitMap) : Practice2/src/a/b/c/DrawBitMap.java
package a.b.c; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.MotionEvent; import android.view.View; //這個 DrawBitMap 類別主要是用來顯示圖片 public class DrawBitMap extends View { SecondActivity activity; Bitmap bp; Paint paint; //建構子 public DrawBitMap(Context context) { super(context); //引用 SecondActivity this.activity = (SecondActivity)context; paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(25); //指定圖檔 bp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); canvas.drawColor(Color.BLACK); canvas.drawText("座標 X : " + activity.X, 5, 30, paint); canvas.drawText("座標 y : " + activity.Y, 5, 55, paint); canvas.drawText("碰觸螢幕回到上一頁", 5, 100,paint); //依照座標將圖 PO 出來 canvas.drawBitmap(bp, activity.X, activity.Y, null); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_DOWN){ //碰觸螢幕結束 SecondActivity 程序 activity.finish(); } return true; } }
您好
回覆刪除我想請問如果xy座標要用藍芽得到的座標來移動,那我在xy座標要如何更改定義?
您好 ^_^
刪除由於本人還未涉足『藍牙』這方面的應用,所以無法提供任何意見給您。
只能提供 Android Reference 相關連結,請自行由 API 中尋找您要的資訊。
http://developer.android.com/reference/android/bluetooth/package-summary.html
未能直接解惑,尚請海涵
您好
刪除請問如果我只是想單純的接收並顯示圖示座標的話,只需要作SecondActivity和DrawBitMap?
而我的座標是透過電腦來的,這樣的話還是需要用到Intent和Bundle嗎?
不知道是否能跟您要個電子信箱,能跟您說明我的目前的問題(因為用圖示解釋比較清楚XD)
這是我的電子信箱:andy9873212000@yahoo.com.tw
希望能收到您的回覆或回信
已經透過您的 Email 寄信給您了 ~
刪除願聞其詳 ~ 但不一定能幫上忙
請多包涵