show code block

2017年7月24日 星期一

Android元件(小專題一) — startActivityForResult、onActivityResult activity之間的資料傳遞

前言:

有感而發整理一下之前的資料。
startActivityForResult、onActivityResult之間的關西


先來進入八奇思考領域的第一步吧

情境:A activity 要到B activity (以下簡稱A和B),並且B 結束之後會回到 A

 1、startActivityForResult用這個會將畫面帶到B,結束之後B 將會返回A,並帶值過來
2、onActivityResult這個是在應付B回到A之後,要如何接應你的數據在這之間Bundle就像郵差。

A就是你的老闆,你不想回信都還不行。
B就是職員,一定要回老闆信。
而中間的Bundle就是傳遞員
startActivityForResult 就是郵筒,
而你要把信寄到onActivityResult就像秘書,秘書會處理一切收到的回信。

但假如A老闆有很多位員工C、D、E、F呢?
這就是傳令識別碼的功用了,你可以設定成任何你想設的模樣,只要A老闆 和其他員工之間特別的號碼,也就像員工編號一樣。


解釋完畢。END。好拉開玩笑的,讓我們來看看這是怎麼運作的。




程式碼:

這邊做一個顏色和文字間的傳遞作為示範

activity_main.xml (慣老闆)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hello.kaiser.colorpickertest.MainActivity">

    <TextView
        android:id="@+id/tv_color"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:text="顏色未色定" />

    <Button
        android:onClick="selectColor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_color"
        android:layout_centerHorizontal="true"
        android:text="選擇顏色" />

</RelativeLayout>
 

activity_color_picker.xml(員工A)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.hello.kaiser.colorpickertest.ColorPicker">


    <RadioGroup
        android:id="@+id/icon_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:orientation="vertical">

        <RadioButton
            android:id="@+id/radio_holo_red_light"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@android:color/holo_red_light"
            android:checked="true"
            android:onClick="clickColor"
            android:text="holo_red_light"
            android:textColor="@android:color/holo_red_light" />

        <RadioButton
            android:id="@+id/holo_orange_dark"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@android:color/holo_orange_dark"
            android:onClick="clickColor"
            android:text="holo_red_light"
            android:textColor="@android:color/holo_orange_dark" />

        <RadioButton
            android:id="@+id/holo_green_light"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@android:color/holo_green_light"
            android:onClick="clickColor"
            android:text="holo_red_light"
            android:textColor="@android:color/holo_green_light" />

        <RadioButton
            android:id="@+id/holo_blue_dark"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:buttonTint="@android:color/holo_blue_dark"
            android:onClick="clickColor"
            android:text="holo_red_light"
            android:textColor="@android:color/holo_blue_dark" />
    </RadioGroup>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/icon_group"
        android:gravity="center"
        android:orientation="horizontal">

        <Button
            android:onClick="canncel"
            android:id="@+id/cancel_action"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="canncel" />

        <Button
            android:onClick="ok"
            android:id="@+id/ok"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="ok" />
    </LinearLayout>
</RelativeLayout>



BundleKey.java (傳遞員)
package com.hello.kaiser.colorpickertest;

/**
 * Created by kaiser on 2017/7/24.
 */

public class BundleKey {
    public static final String BUNDLE_KEY_COLOR_INT = "com.daniel.android.colorint";
    public static final String BUNDLE_KEY_COLOR_NAME = "com.daniel.android.colorname";
}

 
MainActivity.java(老闆)
package com.hello.kaiser.colorpickertest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //傳令識別碼(這就像員工編號,只要信上的員工編號不是指你,你都不能開信。當然也不會想開xd)
    private static final int SELECT_COLOR_REQUEST = 0;

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

    public void selectColor(View view) {
        //信箱寄信囉,員工編號顯示為 SELECT_COLOR_REQUEST
        startActivityForResult(new Intent(this, ColorPicker.class), SELECT_COLOR_REQUEST);
    }

    //老闆秘書,處理老闆一切收到的信件
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SELECT_COLOR_REQUEST) {//員工編號等於SELECT_COLOR_REQUEST,秘書開始處理事情
            if (resultCode == RESULT_OK) {//收到的結果是result_ok的話
                TextView textview = (TextView) findViewById(R.id.tv_color);

                Bundle bundle = data.getExtras();
                int mColorInt = bundle.getInt(BundleKey.BUNDLE_KEY_COLOR_INT);
                CharSequence mColorNmae = bundle.getCharSequence(BundleKey.BUNDLE_KEY_COLOR_NAME);

                textview.setText(mColorNmae);
                textview.setBackgroundColor(mColorInt);
            }
            if (resultCode==RESULT_CANCELED){//如果收到的結果是result_canceled的話
                Toast.makeText(this, "取消選擇", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
 


ColorPicker.java(員工A)
package com.hello.kaiser.colorpickertest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.RadioButton;

public class ColorPicker extends AppCompatActivity {

    private int mColorInt;
    private CharSequence mColorName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_color_picker);
        initColorData();
    }

    private void initColorData() {
        RadioButton radio = (RadioButton) findViewById(R.id.radio_holo_red_light);
        mColorName = radio.getText();
        mColorInt = radio.getCurrentTextColor();
    }

    public void clickColor(View view) {
        RadioButton radio = (RadioButton) view;
        mColorInt = radio.getCurrentTextColor();
        mColorName = radio.getText();
    }


    public void ok(View view) {//員工選擇好要回信囉
        Intent intent = new Intent();
        intent.putExtra(BundleKey.BUNDLE_KEY_COLOR_NAME, mColorName);
        intent.putExtra(BundleKey.BUNDLE_KEY_COLOR_INT, mColorInt);
        setResult(RESULT_OK, intent);
        finish();
    }

   public void canncel(View view) {//取消
        setResult(RESULT_CANCELED);
        finish();
    }
}
 







複製貼上就出來了,不提供demo囉,有問題可以提出討論。

沒有留言:

張貼留言

協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...