手機的頁面轉換與資料傳遞
簡介 每個activity負責一個螢幕的內容,螢幕畫面之間的切換就涉及到activity的切換
獨立的兩個頁面的轉換 當手機的畫面僅簡單的如同兩個網頁畫面的切換: 單一Activity中多個layout的切換: setContentView 多個Activity之間的切換: Intent類別
單一Activity的畫面切換 練習:請設計兩個Layout,並且在.java中利用setContentView指定要載入的Layout 建立兩個Layout的xml,兩個Layout中各自置放一個按鈕 在按鈕的OnClick事件中呼叫setContentView載入必須的Layout
配置新的.xml螢幕畫面
setContentView() private void goNextPage(){ setContentView(R.layout.next_layout); //載入名為「next_layout」的畫面檔 Button btn2=(Button)findViewById(R.id.btn2); btn2.setOnClickListener(new Button.OnClickListener(){ public void onClick(View arg0) { // TODO Auto-generated method stub goHomePage(); } }); private void goHomePage(){ setContentView(R.layout.main); //載入名為「main」的畫面檔 Button btn1=(Button)findViewById(R.id.btn1); btn1.setOnClickListener(new Button.OnClickListener(){ goNextPage();
多個Activity之間的切換 一般而言,一個Android activity連結至一個layout,因此不同layout之間的轉換,就是兩個activity之間的轉換 Intent: 傳統視窗程式中強調「事件」發生要有對應的「事件處理器」。在android中,則是提升為「程式的意圖(intent)」或者是「使用者操作的意圖」。 Intent.setClass(): 使用者意圖切換至另一個activity
練習 設計兩個頁面,並讓頁面透過各自的按鈕可以切換畫面 設計兩個layout 設計兩個activity,並且各自指定正確的layout 註冊activity於AndroidManifest.xml 初始化intent物件
建立新的activity類別 啟動「New Java Class」對話框
設定New Java Class
配置新的.xml螢幕畫面 在res/layout目錄下新增一個xxx.xml檔案 在.java檔中新增OnCreate() 「New」->「other」->「Android」->「Android XML File」 在.java檔中新增OnCreate() public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.page2); //指定必須連結的xml }
在AndroidManifest.xml中宣告新活動 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="demo.android" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Test" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="Page2"></activity> </application> <uses-sdk android:minSdkVersion="7" /> </manifest>
撰寫啟動activity的程式碼 從首頁切換到第二頁 - 「下一頁」 private Button.OnClickListener btnOK=new Button.OnClickListener(){ public void onClick(View v){ Intent intent=new Intent(); intent.setClass(Test.this, Page2.class); startActivity(intent); } };
撰寫啟動activity的程式碼 從第二頁切換回首頁 - 「上一頁」 private Button.OnClickListener btnOK=new Button.OnClickListener(){ public void onClick(View v){ Intent intent=new Intent(); intent.setClass(Page2.this, Test.class); startActivity(intent); } };
相依性activity傳遞資料
練習 主畫面輸入文字資料,按下按鈕後將字串顯示於第二頁 先依照上述步驟完成兩個頁面透過按鈕互相切換 主畫面佈置一個文字輸入方塊以及一個按鈕 第二頁佈置一個標籤,以及一個「上一頁」按鈕 先依照上述步驟完成兩個頁面透過按鈕互相切換
Bundle 利用bundle機制來傳遞資料 A mapping from String values to various Parcelable types – 用於將String值對應至各個「可包裹」型別 .putString(String key, String value): Inserts a String value into the mapping of this Bundle, replacing any existing value for the given key. Bundle bundle=new Bundle(); bundle.putString("KEY_STRING", “Hello"); //將字串「Hello」封裝成一個名為「KEY_STRING」的包裹
Intent.putExtras() putExtras(Bundle extras): add a set of extended data to the intent private Button.OnClickListener btnOK=new Button.OnClickListener(){ public void onClick(View v){ Intent intent=new Intent(); intent.setClass(Test.this, Page2.class); Bundle bundle=new Bundle(); bundle.putString("KEY_STRING", edtString.getText().toString()); intent.putExtras(bundle); startActivity(intent); } };
利用Bundle接收資料 private void showResult(){ Bundle bundle=this.getIntent().getExtras(); txtDisplay.setText(bundle.getString("KEY_STRING")); } double a=Double.parseDouble(edt1.getText().toString()); double height=0; if(option1.isChecked()) height=((a-80)*0.7); if(option2.isChecked()) height=((a-70)*0.6); double Standard1=height-(height*0.1); double Standard2=height+(height*0.1); DecimalFormat df=new DecimalFormat(); Intent intent=new Intent(); intent.setClass(Ashywolf.this, Page2.class); Bundle bundle=new Bundle(); Bundle bundle1=new Bundle(); bundle.putString("KEY_STRING",df.format(Standard1) ); bundle.putString("HEIGHT",df.format(Standard2)); intent.putExtras(bundle); startActivity(intent);
練習 請試著完成一個可輸入半徑的首頁,然後第二頁可以計算並請顯示其圓面積 private void showResult(){ Bundle bundle=this.getIntent().getExtras(); txt2.setText(bundle.getString("KEY_STRING")+ bundle.getString("HEIGHT")); }