40
OnActivityResult kyobashi.dex #4 おまえら!もうonActivityResultswitchif書く時代は終わりだぞ!

OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Embed Size (px)

Citation preview

Page 1: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

OnActivityResult

kyobashi.dex #4

おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Page 2: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

About Me

Shinobu Okano

@operandoOS

Mercari, Inc.

Souzoh, Inc.

Page 3: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
Page 4: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Do you know onActivityResult?

Page 5: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Do you know onActivityResult?

https://developer.android.com/training/basics/intents/result.html

Getting a Result from an Activity

Page 6: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Getting a Result from an Activity

// Start the Activitystatic final int PICK_CONTACT_REQUEST = 1; // The request code

private void pickContact() { Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")); pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);}

// Receive the Result@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PICK_CONTACT_REQUEST) { if (resultCode == RESULT_OK) { // ... } }}

Page 7: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

某フリマアプリから拝借した

onActivityResult

※定数名とかそこら辺は変えてます

Page 8: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

某フリマアプリ onActivityResult

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case LOGIN: if(resultCode == RESULT_OK) { success(); } else { failed(); } break; }}

Page 9: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode != RESULT_OK) return; switch (requestCode) { case REQUEST_MUGAMUGA: successItemPost(); break; }}

某フリマアプリ onActivityResult

Page 10: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK || data == null) { mugemuge(); return; } if (requestCode == Request.UMUUMU) { umuumu(); } }

某フリマアプリ onActivityResult

Page 11: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_CANCELED) { cancel(); } else if (requestCode == REQUEST_CODE_SELECT_IMAGE) { // .... } else if (requestCode == REQUEST_CODE_TRIMMING) { // .... } else { super.onActivityResult(requestCode, resultCode, data); }}

某フリマアプリ onActivityResult

Page 12: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_MUGAMUGA && resultCode == Activity.RESULT_OK) { if (data != null) { mugamuga(); } }}

某フリマアプリ onActivityResult

Page 13: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != Activity.RESULT_OK) { return; } switch (requestCode) { case REQUEST_CODE_CATEGORY: // ... break; case REQUEST_CODE_LOCATION: // ... break; case REQUEST_CODE_CONDITION: // ... break; default: super.onActivityResult(requestCode, resultCode, data); break; }}

某フリマアプリ onActivityResult

Page 14: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

onActivityResultの悪さ

• switchとifが多い

• requestCodeとresultCodeをチェックしないといけない

• switchとifの書き方がまちまち

• switch使わない勢 + if else勢😇

• requestCodeとresultCodeどっちに先に判定するか問題

• 人間が書くにはつらい...

Page 15: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Do you know OnActivityResult?

Page 16: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

OnActivityResult

OnActivityResult annotation compiler for Android

https://github.com/vanniktech/OnActivityResult

Page 17: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

アッテの

onActivityResultの実装は

すべてOnActivityResultです!

Page 18: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

onActivityResultの実装がこれだけ!!

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); ActivityResult.onResult(requestCode, resultCode, data).into(this);}

Page 19: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

すぎょい😆

Page 20: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

受け取ったあとの実装は??

• それぞのたパターンにあったメソッドを定義して@OnActivityResultをつける

• @OnActivityResultのrequestCodeとresultCodesでどういう結果の場合に呼び出してほしいかを定義する

Page 21: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

受け取ったあとの実装は??

@OnActivityResult(requestCode = REQUEST_TAKE_PHOTO, resultCodes = RESULT_OK)void onTakePhoto(@ExtraString(name = CameraActivity.RESULT_TAKE_PHOTO) final String takePhoto) { Intent resultIntent = new Intent(); resultIntent.putExtra(RESULT_TAKE_PHOTO, takePhoto); setResult(RESULT_CODE_TAKE_PHOTO, resultIntent); finish();}

Page 22: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

受け取ったあとの実装は??

// result codeに何が返ってきても処理するメソッド@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE)void onHumuHumu() { Toast.makeText(this, "onHumuHumu", Toast.LENGTH_SHORT).show();}

@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE, resultCodes = RESULT_CANCELED)void onCancel() { Toast.makeText(this, "cancel select image.”, Toast.LENGTH_SHORT).show();}

Page 23: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

すぎょくない?

Page 24: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

(みんな)

すぎょい😍

Page 25: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

onActivityResultの受け取り先のオブジェクトを指定する• intoに受け取り先オブジェクトを指定する

• ActivityResult.onResult().into(obj);

• onActivityResultで返ってくるIntentのデータをViewModelとかPresenterで受け取る

• 設計によっては嬉しい

Page 26: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

onActivityResultの結果をViewModelで受け取る

private MySampleMainViewModel viewModel = new MySampleMainViewModel();

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); ActivityResult.onResult(requestCode, resultCode, data).into(viewModel);}

public class MySampleMainViewModel {

public ObservableField<String> location = new ObservableField<>("0,0");

@OnActivityResult(requestCode = MySampleMainActivity.REQUEST_SELECT_LOCATION, resultCodes = Activity.RESULT_OK) void onSelectedLocation(@Extra(name = LocationSelectActivity.RESULT_SELECT_LOCATION) Location location) { this.location.set(location.toString()); }}

Page 27: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

OnActivityResult sample Code

https://github.com/operando/OnActivityResult/tree/my_sample_code/onactivityresult-sample

https://github.com/operando/OnActivityResult/tree/my_sample_code/onactivityresult-sample/build/generated/source/apt/debug/com/vanniktech/onactivityresult/sample

布教活動のために適当にサンプルコード書いてます

annotation processorで作成されるコードも

入れてあります

Page 28: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Do you know Activity.RESULT_FIRST_USER?

• Start of user-defined activity results.

• Constant Value: 1 (0x00000001)

• https://developer.android.com/reference/android/app/Activity.html#RESULT_FIRST_USER

Page 29: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

どういう場合に使うか

• 画面Aから画面BへRequestをする時画面Bからの戻りが2パターン以上ある場合

• ???

Page 30: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

アッテの例)募集投稿画面から画像選択をする

• 画像選択画面ではギャラリーの画像を選択するか、カメラで撮影するかの 2パターンある

• カメラ撮影はまた別画面が起動して、その戻りを画像選択画面が受け取る

• 募集投稿画面への戻りが、ギャラリーの画像を選択、カメラで撮影の2パターンある

• = 募集投稿画面から画像選択画面に対しては1Requestだけど 2パターンの戻り(Resultパターン)がある

• = 独自のResult Codeを定義したい = Activity.RESULT_FIRST_USERを使って定義

Page 31: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

アッテの例で...

Page 32: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

アッテの例で...

Page 33: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

OnActivityResultで実装すると…

// ImageSelectActivitystatic final int RESULT_CODE_SELECT_IMAGE = Activity.RESULT_FIRST_USER;static final int RESULT_CODE_TAKE_PHOTO = Activity.RESULT_FIRST_USER + 1;

@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE, resultCodes = ImageSelectActivity.RESULT_CODE_SELECT_IMAGE)void onSelectImage(Intent intent) { ArrayList<String> selectImages = intent.getStringArrayListExtra(RESULT_SELECT_IMAGES); Toast.makeText(this, "onSelectImage selectImages : " + selectImages, Toast.LENGTH_SHORT).show();}

@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE, resultCodes = ImageSelectActivity.RESULT_CODE_TAKE_PHOTO)void onTakePhoto(@ExtraString(name = ImageSelectActivity.RESULT_TAKE_PHOTO) final String takePhoto) { Toast.makeText(this, "onTakePhoto takePhoto : " + takePhoto, Toast.LENGTH_SHORT).show();}

Page 34: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Support user defined result code

https://github.com/vanniktech/OnActivityResult/pull/86

俺が!

OnActivityResultでActivity.RESULT_FIRST_USER

使えるようにしてやったぞ!

Page 35: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Contributions

Page 36: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Contributions

Page 37: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Contributions

イヤッッホォォォオオォオウ!

Page 38: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

OnActivityResultの気に入ってるところ

• onActivityResultメソッドの実装はシンプルになる!

• startActivityForResultの呼び出しは既存のままでいい!

• 受け取り後の処理ごとにメソッド定義するので見通しがいい

• 結果受け取り先のオブジェクトを指定できる → into()

• ifとswitchからの開放…

Page 39: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

おまえら! もうonActivityResultで

switchとif書く時代は終わりだぞ!

Page 40: OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Thanks!!