本節通過一個游戲登錄界面的Demo,講解了如何在SurfaceView中實現兩個或多個Activity之間的切換和數據交互。由於意在講解功能的實現,所以本Demo中登錄界面的布局並沒有進行深入設計和美化,但大家可以自己在xml中或者使用代碼去美化布局,改善組件的外觀等。
下面就先演示游戲登錄界面的相關圖片:
由於代碼中一共寫了三個類,這裡不再全部貼出來,不過給出了代碼的重要部分。
兩個activity之間切換我概括的分為兩步:
1、代碼實現切換操作。
2、配置中聲明另外一個acitivity。
我們先看第一步:這裡是觸屏處理中的一段代碼:
Java代碼
- public boolean onTouchEvent(MotionEvent event) {
- float pointx = event.getX();
- float pointy = event.getY();
- if (pointx > bp_x + 14 && pointx < bp_x + 14 + 117) {
- if (pointy > bp_y + 43 && pointy < bp_y + 43 + 15) {
- // 帳號
- Intent i = new Intent();// 得到一個意圖的實例
- i.putExtra("count", 1);// 寫出數據
- i.putExtra("himi", str_zh);
- i.setClass(MainActivity.instance, Register.class);// 設置當前activity以及將要操作的類
- MainActivity.instance.startActivity(i);// 用當前activity來啟動另外一個activity
- }
- }
- }
顯示定義一個Intent 對象,Intent這個類的機制是協助交互的,詳細的說明這裡不多講。
Intent 中的putExtra()函數是起到兩個activity之間交互交互的,這個方法類似 hashtable 或者hashmap中的put是一樣的,第一個參數是key(索引),後一個參數volue(值),根據key我們可以得到對應的volue了。那麼後面我也附上接受的處理。
Intent 中的setClass()函數也是傳入兩個參數,第一個是傳入當前實例的activity對象,後面一個參數指需要打開的activity這個類!然後我們就可以利用當前activity對象來啟動另外一個activity了。然後我們看下在另外一個activity是如何創建並且怎麼接收數據的。
Java代碼
- package com.himi;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- /**
- * @author Himi
- *
- */
- public class Register extends Activity {
- private Button button_ok;
- private EditText et;
- private TextView tv;
- private LinearLayout ly;
- private Register rs;
- private byte count;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- rs = this;
- ly = new LinearLayout(this);
- button_ok = new Button(this);
- button_ok.setWidth(100);
- button_ok.setText("確定");
- button_ok.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- if (count == 1) {
- MySurfaceView.str_zh = et.getText().toString();
- } else if (count == 2) {
- MySurfaceView.str_pass = et.getText().toString();
- }
- rs.finish();
- }
- });
- Intent intent = this.getIntent();
- count = (byte) intent.getIntExtra("count", 0);
- String temp_str = "";
- String temp_str2 = "";
- et = new EditText(this);
- tv = new TextView(this);
- if (count != 3) {
- temp_str = intent.getStringExtra("himi");
- if (count == 1) {
- rs.setTitle("請輸入帳號!");
- } else {
- rs.setTitle("請輸入密碼!");
- }
- ly.addView(tv);
- ly.addView(et);
- ly.addView(button_ok);
- if (temp_str != null) {
- et.setText(temp_str);
- }
- } else {
- temp_str = intent.getStringExtra("himi_zh");
- temp_str2 = intent.getStringExtra("himi_pass");
- rs.setTitle("您輸入的信息:");
- tv.setText("帳號:" + temp_str + "/n" + "密碼" + temp_str2);
- ly.addView(tv);
- ly.addView(button_ok);
- if (temp_str != null) {
- et.setText(temp_str);
- }
- }
- setContentView(ly);
- }
- }
以上代碼可以看出,新建一個activity其實只需要繼承Activity以及重寫onCreate()方法即可。當然創建的還需要一步很重要的步驟,那麼在第二步中會詳細說明,這裡我們看下是如何接收之前的activity傳來數據的。
Intent intent = this.getIntent();
count = (byte) intent.getIntExtra(“count”, 0);
接收也是很簡明易懂,創建一個Intent 意圖對象,調用來去getIntExtra函數得到之前傳來的數據,根據key!當然還有getStringExtra()等等函數都是類似,只是根據你傳入的數據不同選擇不同函數罷了。童鞋們應該注意的是getIntExtra中第二個參數是什麼意思,其實就是一個對於找不到key相匹配的時候會默認return 0 ;
那麼下面介紹第二步:在配置中聲明。
當創建一個activity的時候我們必須去在AndroidMainFeset.xml中去聲明我們創建的這個類是個Activity。下面附上xml中的code:
XML/HTML代碼
- <activity android:name="com.himi.Register" android:theme="@android:style/Theme.Dialog"
- android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation">
- </activity>
- <!--我是注釋-->
- <activity android:name="com.himi.Register"></activity>
注:<!—->此符號是注釋
這裡我們有兩個聲明方法,用注釋隔開了,上面一個聲明中還設定了一些屬性,theme顯示的形式,等等,其實最簡單的聲明也是可以的就像注釋下面那一句聲明就足以起到作用了。
當有新的activity的時候一定要去聲明;千萬不要忘記這一步。
備注:配置中有一屬性 -> android:screenOrientation 這是設置橫屏,所以豎屏中點擊會有問題,如果想豎屏顯示正常那麼可以自行刪除xml中的 android:screenOrientation=”landscape”就可以了。
本文轉自:http://www.himigame.com/android-game/301.html