2015年7月12日 星期日

[Android Studio]入門筆記 Part 2 - Activity


上一篇的筆記 [Android Studio]入門筆記 Part 1介紹了基本的Android編程,例如使用Button, TextView 等。 今回的文章主要是介紹如何使用和切換Activity。

關於 Activity 的說明: http://developer.android.com/guide/components/activities.html
Activity的API: http://developer.android.com/reference/android/app/Activity.html

Activity是什麼呢? 簡單的來說,Activity在android裡面,是提供一個畫面以及畫面內相關操作的元件。在一些比較複雜的程序裡面,通常需要用到多過一種畫面的,這種情況下,則需要多過一種Activity。

以下例子,則介紹如何寫一個多畫面的程序,以及用上多過一個Activity。




在這個程序裡面,主要有兩個畫面。

第一個畫面,用在預設的MainActivity裡,主要是一個用來開啟另一個畫面(Activity)的按鈕,還有顯示文字結果:





第二個畫面,用在一個新建立的畫面裡面,Activity名稱為 TestAnotherActivity。主要是用來給用家輸入文字。



例如,我在第一個畫面(MainActivity) 按“START ANOTHER ACTIVITY”按鈕, 則會切換為第二個畫面(TestAnotherActivity)。在第二個畫面(TestAnotherActivity)輸入“ABC”,然後按“OK”的話,則會切換回第一個畫面(MainActivity) ,並且顯示“ABC”。

關於Activity的切換,以及數值的傳遞,主要會用到 Intent (android.content.Intent) 這個class。
詳細可看API: http://developer.android.com/reference/android/content/Intent.html

主要用到的代碼如下:


1. 開始一個新的Activity
Intent intent_another_activity = new Intent(this, TestAnotherActivity.class);
startActivityForResult(intent_another_activity, 0);

2. 把數值傳入新的Activity裡面。在這個例子裡面,數值的名稱為“inputText”, 要傳入的數值則為“ABC
intent_another_activity.putExtra("inputText", "ABC");

利用同樣方法,也可以傳遞多個數值:
intent_another_activity.putExtra("inputText1",  "ABC");
intent_another_activity.putExtra("inputText2",  "DEF");

3. 取回被傳入的數值。
Intent intent_current = getIntent();
String input_text = intent_current.getStringExtra("inputText");

4. 提交新開的Activity的結果,並且關閉Activity
Intent result = getIntent();
result.putExtra("inputText", tf_input.getText().toString());
setResult(Activity.RESULT_OK, result);

finish();

5. 取回Activity提交的結果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            String input_Text = data.getStringExtra("inputText");
            txt_result.setText(input_Text);
        }
    }


以下為詳細的步驟: 

源代碼: Github

1. 開一個新Project,以下為新Project的設定例子。




2. 設計MainActivity的layout (activity_main.xml) , TextView的id為 txt_result,Button的id為btn_start_another_activity


3. 開一個新的Blank Activity, 名稱為 TestAnotherActivity, 步驟和設定如下:








4. 設計TestAnotherActivity的layout (activity_test_another.xml) , EditText的id為 tf_input,Button的id為btn_ok



5. MainActivity.java 的代碼如下:

 
package com.example.test_activity;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.content.Intent;
import android.app.Activity;

public class MainActivity extends ActionBarActivity {

    TextView txt_result;
    Button btn_start_another_activity;
    MainActivity currentActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        currentActivity = this;
        // Assign the TextView defined in layout XML to variable txt_result
        txt_result = (TextView) findViewById(R.id.txt_result);

        // Assign the Button defined in layout XML to variable btn_start_another_activity
        btn_start_another_activity = (Button) findViewById(R.id.btn_start_another_activity);

        //Add OnClick Listener to button
        btn_start_another_activity.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                Intent intent_another_activity = new Intent(currentActivity, TestAnotherActivity.class);

                //Send current txt_result's value to new Activity(TestAnotherActivity)
                intent_another_activity.putExtra("inputText", txt_result.getText());
                //Start Activity
                startActivityForResult(intent_another_activity, 0);


            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            //get input text from TestAnotherActivity
            String input_Text = data.getStringExtra("inputText");
            txt_result.setText(input_Text);
        }
    }


    @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);
    }
}


6. TestAnotherActivity.java 的代碼如下:

    @Override
package com.example.test_activity;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class TestAnotherActivity extends ActionBarActivity {


    EditText tf_input;
    Button btn_ok;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_another);

        //Assign the EditText(Text Field) defined in layout XML to variable tf_input
        tf_input  = (EditText) findViewById(R.id.tf_input);

        // Assign the Button defined in layout XML to variable btn_ok
        btn_ok = (Button) findViewById(R.id.btn_ok);



        //Add OnClick Listener to button
        btn_ok.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                Intent result = getIntent();
                //Put input text to result intent
                result.putExtra("inputText", tf_input.getText().toString());
                setResult(Activity.RESULT_OK, result);
                //Exit this Activity
                finish();
            }
        });

        //Set input text field's value passed from MainActivity
        Intent intent_current = getIntent();
        tf_input.setText(intent_current.getStringExtra("inputText"));
    }

    @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_test_another, 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);
    }
}



沒有留言:

張貼留言