2015年2月14日 星期六

Activity

Activity就是代表一個畫面所有的動作和內容,它也是一個被繼承的母類別,一但繼承了它就可以是一個被執行且啟動的畫面,畫面的切換也是Activity的切換,在Android中Activity的切換分為幾種,一種是單純的切換,一種是帶有資料的切換,還有一種是切換以後還要切換回原來的Activity,以下範例展是單純切換,還有帶資料並且切換原來的Activity。

主要功能
主畫面配置兩個按鈕,兩個按鈕都會切換到新的Activity並且載入新的Layout不同的是一個有登記回呼的方法,有登記回呼的Button可以在Activity結束的時候傳遞資訊回到原本Activity中並且將資訊顯是在畫面上。

重點觀念
開啟一個新的Activity主要有兩種方法,一種是只有傳遞資料與狀態給下一個Activity,另一種還可讓下一個Activity傳遞資料回到原本的Activity,這兩種方法為呼叫startActivity()方法與呼叫startActivityForResult()方法。

startActivity():啟動另一個活動可以說是一去不復返,單純啟動另一個活動

startActivityForResult():是透過覆寫onActivityResult()方法,當這個方法被覆寫了以後,新的Activity呼叫setResult()方法及finish()方法以後就會被回呼,並根據setResult()方法呼叫時所傳遞的參數來接收新的Activity所回傳的資料或資訊,來做後續的動作。


程式碼中建立新的 Activity 類別檔案

其實很簡單需做以下三件事
1.新增一個java (在src/ 下面)  
2.新增一個.xml (在res/layou/ 下面)
3.在AndroidManifest.xml (裡面加入一段敘述)
1.新增java
首先在專案目錄上點右鍵,選擇「New->Class」選項,會出現一個New Java Class的視窗
在Package那爛的右邊Browse點取,選取我們的路徑(一開始我們所創的路徑)
在Name輸入新的檔案名(注意第一個字母需大寫)
接下來在Superclass那欄右手邊的Browse點開
在Choose a type 輸入activity 將會出現Activity-android.app選取 按OK  Finish 。
2.新增.xml
首先在專案目錄上點右鍵,選擇「New->Other->Android->Android XML File」選項
會出現New Android XML File 的視窗
首先選取你的Project  ,File輸入你的檔案名稱(注意後面需+.xml    EX:test.xml)
在下面選取Layout  在點Finish  。
3.AndroidManifest.xml
在我們左邊Navigator(預設的位置)  專案下會有一個名為AndroidManifest.xml 的檔案
雙擊開啟它,在點選下面AndroidManifest.xml模式,下入下面這段敘述
加入:<activity android:name="Activitysample2"></activity>//新增的JAVA檔

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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="呼叫 Activity1"
        android:id="@+id/btn_Call_Activity1"
        android:layout_below="@+id/textView"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="呼叫 Activity2"
        android:id="@+id/btn_Call_Activity2"
        android:layout_below="@+id/btn_Call_Activity1"
        android:layout_alignParentStart="true" />

</RelativeLayout>

MainActivity.java

package com.example.win7.helloworld;
/*appMain*/
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


/*繼承Activity類別*/
public class MainActivity extends Activity {
    private  Button btn_Call_Activity1;
    private  Button btn_Call_Activity2;
    static final int REQUEST_CODE=1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupViewComponent();
    }

    private void setupViewComponent(){
        btn_Call_Activity1=(Button)findViewById(R.id.btn_Call_Activity1);
        btn_Call_Activity2=(Button)findViewById(R.id.btn_Call_Activity2);
        btn_Call_Activity1.setOnClickListener(Call_Activity1);
        btn_Call_Activity2.setOnClickListener(Call_Activity2);
    }
    private Button.OnClickListener Call_Activity1=new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            /*實體化Intent物件,第一個參數載入目前所在的context,第二個參數傳入頁面切換的目的地的class*/
            Intent intent1 = new Intent(MainActivity.this,SampleActivity1.class );
            /*呼叫Intent類別的putExtra方法,第一個字串參數是參數名稱,第二個字串參數是參數值*/
            intent1.putExtra("FromAppMain","appMain");
            /*呼叫Activity的startActivityForResult方法,將前面實體化的Intent物件參考傳入,並且將從Activity繼承而來的REQUEST_CODE變數參考傳入,以記錄一些狀態在返回以後取出使用*/
            startActivityForResult(intent1,REQUEST_CODE);
        }
    };
    private Button.OnClickListener Call_Activity2=new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
           setTitle("目前是由Activity2所返回");
            Intent intent2=new Intent(MainActivity.this,SampleActivity2.class);
            /*切換Activity*/
            startActivity(intent2);
        }
    };
    /*onActivityResult()方法是覆寫用來當新的Activity結束以後被自動回呼,如此一來就可以透過傳遞回來的參數來取得新的Activity,
            要注意的事覆寫onActivityResult()方法的同時,起動新的Activity要使用startActivityForResult()方法,否則就無法自動會呼,
            另外第一個參數用來承載新的Activity的狀態,第二個參數用來承載新的Activity要傳遞給原來的Activity的資料*/
    protected void onActivityResult(int requestCode,int resultCode,Intent date){
        if(requestCode==REQUEST_CODE)
        {
            if(resultCode==RESULT_OK){
                String temp=null;
                /*呼叫Intent的getExtras()方法取得Bundle物件可以用來裝載其他的物件,這些物件經過適當的轉型就可以拿來使用*/
                Bundle extras=date.getExtras();
                if(extras!=null){
                    temp=extras.getString("FromActivity1");
                }
                setTitle(temp);
            }
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
sample_activity1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="match_parent">


    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent">

        <TextView
            android:layout_width="369dp"
            android:layout_height="112dp"
            android:id="@+id/txv_Activity1" />

        <Button
            android:layout_width="288dp"
            android:layout_height="wrap_content"
            android:text="返回主畫面"
            android:id="@+id/btn_Activity1_BackTo_MainActivity" />
    </LinearLayout>

</LinearLayout>
SampleActivity1.java
package com.example.win7.helloworld;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

/**
 * Created by win7 on 2015/2/14.
 */
public class SampleActivity1 extends Activity{
        private Button btn_Activity_BackTo_MainActivity;
        private TextView txv_Activity1;
        Bundle bul_Extra;
        String s_ActivityDate=null;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_activity1);
        setTitle("目前是由Activity1");
        setupViewComponent();
    }
    private void setupViewComponent(){
        txv_Activity1=(TextView)findViewById(R.id.txv_Activity1);
        btn_Activity_BackTo_MainActivity=(Button)findViewById(R.id.btn_Activity1_BackTo_MainActivity);
        btn_Activity_BackTo_MainActivity.setOnClickListener(Activity1);
        /*呼叫getIntent()方法取得用來啟動這個Activity的Intent物件,再對其呼叫getExtras()方法取得其中用來傳遞資料的bundle物件*/
        bul_Extra=getIntent().getExtras();

        if(bul_Extra!=null){
            /*呼叫Bundle的getSting()方法取得放在裡面的字串,並且指派給s_ActivityDate變數*/
            s_ActivityDate=bul_Extra.getString("FromAppMain");
        }
        txv_Activity1.setText("資料是由"+s_ActivityDate+"所傳入");
    }
    private Button.OnClickListener Activity1=new Button.OnClickListener(){

        @Override
        public void onClick(View view) {
            /*實體化Bundle物件,呼叫其putSttring()方法將文字傳入,用Buundle物件作韋Activity切換時候傳遞資訊的載具*/
            Bundle bundle=new Bundle();
            bundle.putString("FromActivity1","目前是由Activity1所返回");
            /*建立一個Intent物件,使用期作為Activity轉換工具物件*/
            Intent mIntent = new Intent();
            /*使用bundle物件來裝載要在Activity間傳遞資料,呼叫putExtra()方法將Bundle物件放入Intent物件中*/
            mIntent.putExtras(bundle);
            /*呼叫setResult()方法,第一個參數傳入目前Activity執行的結果,第二個參數放入要傳回給原來的Activity的Intent物件*/
            setResult(RESULT_OK,mIntent);
            finish();//結束目前的Activity
        }
    };
}

sample_activity2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回主畫面"
        android:id="@+id/btn_Activity2_BackTo_MainActivity" />
</LinearLayout>
SampleActivity2.java
package com.example.win7.helloworld;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Created by win7 on 2015/2/14.
 */
public class SampleActivity2 extends Activity {
        private Button btn_Activity2_BackTo_MainActivity;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_activity2);
        setTitle("目前是由Activity2");
        setupViewComponent();
    }

    private void setupViewComponent(){
        btn_Activity2_BackTo_MainActivity=(Button)findViewById(R.id.btn_Activity2_BackTo_MainActivity);
        btn_Activity2_BackTo_MainActivity.setOnClickListener(Activity2);
    }
    private  Button.OnClickListener Activity2=new Button.OnClickListener() {
        @Override
        public void onClick(View view) {
            /*與第一個Activity不同的是這個Activity就直接結束,並沒有處理回呼所要傳遞的資料,也沒有呼叫setResult()方法去設定執行的結果狀態*/
            finish();
        }
    };
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.win7.helloworld" >

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            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=".SampleActivity1"></activity>
        <activity android:name=".SampleActivity2"></activity>
    </application>

</manifest>

沒有留言:

張貼留言