李華明Himi 原創,轉載務必在明顯處註明:
轉載自【黑米GameDev街區】 原文連結: http://www.himigame.com/android-game/301.html
很多童鞋說My Code運行後,點擊home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完Himi的博文,第十九篇Himi專門寫了關於這些錯誤的原因和解決方案,這裡我在部落格都補充說明下,省的童鞋們總疑惑這一塊;請點擊下面聯絡進入閱讀:
【Android遊戲開發十九】(必看篇)SurfaceView運行機制詳解—剖析Back與Home按鍵及切入後台等異常處理!
今天講下在Surfaceview中如何?兩個或者多個Activity之間的切換與資料互動,為了更形象一些我做了一個遊戲登入介面的demo,其中對於輸入介面的布局這些我也是隨意寫了下,主要是實現功能並沒有花時間去美化,所以大家可以自己去xml或者代碼中去改變布局,每個小工具的寬高等。好了,下面先(本人超愛~哆啦A夢,所以少不了用哆啦A夢的圖了,娃哈哈)
由於代碼中一共寫了三個類,這裡不再全部貼出來,不方便;大家可以在文章的末尾去下載源碼;
兩個activity之間切換我概括的分為兩步:
1. 代碼實現切換操作。2.配置中聲明另外一個acitivity!
我們先看第一步:這裡是觸屏處理中的一段代碼:
public boolean onTouchEvent(MotionEvent event) {<br />float pointx = event.getX();<br />float pointy = event.getY();<br />if (pointx > bp_x + 14 && pointx < bp_x + 14 + 117) {<br />if (pointy > bp_y + 43 && pointy < bp_y + 43 + 15) {<br />// 帳號<br />Intent i = new Intent();// 得到一個意圖的執行個體<br />i.putExtra("count", 1);// 寫出資料<br />i.putExtra("himi", str_zh);<br />i.setClass(MainActivity.instance, Register.class);// 設定當前activity以及將要操作的類<br />MainActivity.instance.startActivity(i);// 用當前activity來啟動另外一個activity<br />}<br />}<br />}
顯示定義一個intent 對象,Intent 這個類的機制是協助互動的,詳細的說明這裡不多講;
Intent 中的putExtra()函數是起到兩個activity之間互動互動的,這個方法類似 hashtable 或者hashmap中的put是一樣的,第一個參數是key(索引) ,後一個參數volue(值),根據key我們可以得到對應的volue了。那麼後面我也附上接受的處理。
Intent 中的setClass()函數也是傳入兩個參數,第一個是傳入當前執行個體的activity對象,後面一個參數指需要開啟的activity這個類!然後我們就可以利用當前activity對象來啟動另外一個activity了。然後我們看下在另外一個activity是如何建立並且怎麼接受資料的。
/**<br /> *<br /> */<br />package com.himi;<br />import android.app.Activity;<br />import android.content.Intent;<br />import android.os.Bundle;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.Button;<br />import android.widget.EditText;<br />import android.widget.LinearLayout;<br />import android.widget.TextView;<br />/**<br /> * @author Himi<br /> *<br /> */<br />public class Register extends Activity {<br />private Button button_ok;<br />private EditText et;<br />private TextView tv;<br />private LinearLayout ly;<br />private Register rs;<br />private byte count;<br />@Override<br />protected void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />rs = this;<br />ly = new LinearLayout(this);<br />button_ok = new Button(this);<br />button_ok.setWidth(100);<br />button_ok.setText("確定");<br />button_ok.setOnClickListener(new OnClickListener() {<br />public void onClick(View v) {<br />if (count == 1) {<br />MySurfaceView.str_zh = et.getText().toString();<br />} else if (count == 2) {<br />MySurfaceView.str_pass = et.getText().toString();<br />}<br />rs.finish();<br />}<br />});<br />Intent intent = this.getIntent();<br />count = (byte) intent.getIntExtra("count", 0);<br />String temp_str = "";<br />String temp_str2 = "";<br />et = new EditText(this);<br />tv = new TextView(this);<br />if (count != 3) {<br />temp_str = intent.getStringExtra("himi");<br />if (count == 1) {<br />rs.setTitle("請輸入帳號!");<br />} else {<br />rs.setTitle("請輸入密碼!");<br />}<br />ly.addView(tv);<br />ly.addView(et);<br />ly.addView(button_ok);<br />if (temp_str != null) {<br />et.setText(temp_str);<br />}<br />} else {<br />temp_str = intent.getStringExtra("himi_zh");<br />temp_str2 = intent.getStringExtra("himi_pass");<br />rs.setTitle("您輸入的資訊:");<br />tv.setText("帳號:" + temp_str + "/n" + "密碼" + temp_str2);<br />ly.addView(tv);<br />ly.addView(button_ok);<br />if (temp_str != null) {<br />et.setText(temp_str);<br />}<br />}<br />setContentView(ly);<br />}<br />}<br />
以上代碼可以看出,建立一個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!
<activity android:name="com.himi.Register" android:theme="@android:style/Theme.Dialog"<br />android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation"><br /></activity><br /><!--我是注釋--><br /><activity android:name="com.himi.Register"></activity>
<!---->此符號是注釋
這裡我們有兩個聲明方法,用注釋隔開了,上面一個聲明中還設定了一些屬性,theme顯示的形式,等等,其實最簡單的聲明也是可以的就像注釋下面那一句聲明就足以起到作用了。
當有新的activity的時候一定要去聲明;千萬不要忘記這一步。
備忘:配置中有一屬性 -> android:screenOrientation 這是設定橫屏,所以豎屏中點擊會有問題,如果想豎屏顯示正常那麼可以自行刪除xml中的 android:screenOrientation="landscape" 就可以了。
(推薦大家訂閱本部落格,因為咱的更新速度可是很快的~娃哈哈)
源碼: http://www.himigame.com/android-game/301.html