20201010のAndroidに関する記事は8件です。

難読化されたメソッド名を特定する

Androidアプリを難読化して動かすと、例外が発生することがあります。
スタックトレースを見ても難読化により、どのメソッドで例外が発生したのかわかりません。
そんなとき、例外発生したメソッドを特定する方法です。

難読化

Androidでは、セキュリティやサイズ縮小を目的に以下の設定を行うことがあります。

build.gradle
minifyEnabled true
shrinkResources true

この設定で動かしてみると、例外が発生することがあります。

難読化で例外発生して困ること

以下の実装があるとします。

Calc.java
package com.example.myapplication;

public class Calc {
    public int divide(int param1, int param2) {
        return param1 / param2;
    }
}
MainActivity.java
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Calc calc = new Calc();
        int result = calc.divide(10, 0);
        System.out.println(result);
    }
}

これを実行すると、ゼロ除算で例外が発生します。

スタックトレース
Caused by: java.lang.ArithmeticException: divide by zero
    at b.a.a.a.a(:5)
    at com.example.myapplication.MainActivity.onCreate(:13)
    at android.app.Activity.performCreate(Activity.java:7009)
    at android.app.Activity.performCreate(Activity.java:7000)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)

難読化により、例外発生したメソッド名がb.a.a.a.aとなり、どこで例外発生したかわかりません。

難読化された文字列からメソッドを特定する

難読化前後のマッピングを見れるファイルがあります。
Androidのプロジェクトフォルダに移動し、検索欄で「mapping」と検索してみてください。
検索結果に「mapping.txt」が表示されます。このファイルを開きます。
1.png

例外発生したメソッド名b.a.a.a.aは、パッケージ名.クラス名.メソッド名で表現されています。
パッケージ名とクラス名(b.a.a.a)でmapping.txtを検索します。以下該当箇所がヒットします。

mapping.txt
com.example.myapplication.Calc -> b.a.a.a:
    3:3:void <init>() -> <init>
    5:5:int divide(int,int) -> a

マッピングを見ると、例外発生したメソッド名(a)がdivideであることがわかります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(Win版AndroidStudioを使っている)Android開発者に贈る 俺流最高のショートカットキーカスタマイズ 

概要

Windows版AndroidStudioを使っている全アプリ開発者に贈る、俺流最高のショートカットキーカスタマイズを紹介します。

はじめに

Windowsのショートカットキーは貧弱過ぎる。
MacとかLinuxなら、十字キーに手を伸ばさなくても済むショートカットキーが標準で用意されているのに、なんでWindowsには無いんだ。ほんと、十字キーに手を伸ばすのが面倒。PageUpもPageDownもHomeもendもctrl+左右も何もかも面倒。はーストレス。

ん、AndroidStudioでは、ショートカットキーのカスタマイズができるのか。
でもそうは言っても特定の機能とか、ウィンドウ表示とかそういうのだけで
俺がストレスに感じているこういうのは、解決できないんでしょ。知ってる知ってる。

...え、できるの...!?まじで...!?

AndroidStudioのショートカットキーは何でも有りなんです

まずはAndroidStudioのショートカットキーの一覧を確認しましょう。

File > Setting > KeyMap でショートカット一覧を確認できます。

Keymap.png

機能ごとにTree形式でショートカットキー一覧が表示されています。
そして右上にある検索窓(①)に知りたいショートカットを入力すれば、関連するショートカットキーがフィルタリングされて表示されます。
そしてうれしいことにショートカットキーからの逆引きもできます。虫眼鏡(②)をクリックして、ショートカットキーを入力すると、該当の項目が表示されます。

では実際に設定してみましょう(読み飛ばし可)

例えば「left」(左)と入力してみます。

keymap_left.png

Leftを含むショートカットキー一覧が出てきました。
カーソルの左移動は「Left」の項目をダブルクリック > 「Add Keyboard shortcut」を選択し、設定したいショートカットキーを入力すれば登録することができます。

例えば、左移動として「ctrl + B」を割り当ててみましょう。
「Add Keyboard shortcut」を選択し「ctrl + B」を入力します。

keymap_left_input.png

警告が出てますね。
Win版AndroidStudioを使っている人ならほとんどの方がお気づきかと思いますが、「ctrl + B」はクラス・メソッド定義にジャンプするショートカットキーなので、「既に割り当てられてるよ」という警告が出ています。
気にせずOKをクリックすると今度は「もとの割り当てはどうする? 消す?残す?」という警告が出ます。
今回はRemoveで消しましょう。 // あとでリセットして復活させます。

さて、これで「OK」で設定画面を閉じれば設定が反映されるはずです。
やってみてください。。。どうでしょう。「Ctrl + B」でカーソルが左に移動するでしょうか。

とりあえずリセットしよ リセット(読み飛ばし可)

お試しで割り当てを実践してもらいましたが、まったく意に反したお試しなのでとりあえずもとに戻しましょう。
先ほどのショートカットキー一覧の画面を再度開いてください。

リセット_windows_copy.png

左上のKeyMapが「Windows」から「Windows copy」になっていると思います。
実は「ctrl + B」の設定を変更したときに、AndroidStudioが自動的にWindows copyを生成して、こちらの設定として「ctrl + B」をLeftに割り当ててくれています。

というわけで、こちらの「Windows copy」を「Windows」に変更して「OK」をクリックすれば設定が元に戻ります。
先ほど自動生成された「Windows copy」は削除して問題ありません。
「Windows copy」を選択した状態ですぐ右にある歯車マークをクリック > Delete を選べば削除できます。

一番いいショートカットキーを頼む(ここからが本題)

さて、Macと同じようにキー割り当てをするなら、先ほどの「Windows」を「Emacs」とか「macOS」とか設定すればいいのですが、AndroidStudioを使い慣れた人だと「いやいや ctrl + N はカーソル移動じゃなくてクラス検索でしょ。」ってなると思います。

ワカル。ワカルヨ。キミノキモチ。

標準でよく使ってるショートカットキーは残しつつ、いい感じの設定がほしい!!!!

見つけたよ。最高の設定を。
私個人観点ではありますが、ショートカットキー設定を紹介したいと思います。

カーソル移動

ショートカット名 割り当てショートカット
up ctrl + u
left ctrl + j
right ctrl + ;
down ctrl + m

まずはシンプルに上下左右をケアします。
左手でctrl, 右手でそれぞれ入力することで、ホームポジションを崩すことなくカーソル移動ができます。

左移動は j 、右移動は;と、進ませたいカーソル方向と合致しているので、直感的かなと思います。

ショートカット名 割り当てショートカット
move caret to Previous Word ctrl + h
move caret to Next Word ctrl + :

ctrl + ←/→ でちょっとだけ早くカーソルを動かす操作、プログラミングに限らず結構あると思うのですが、これについてもケアできます。
左がh、右が:なので、単純なカーソル移動よりも一歩左/右という具合で、こちらも直感的だと思います。

ショートカット名 割り当てショートカット
page up ctrl + alt + u
page down ctrl + alt + m

PageUp/Downについてもケアします。
上がu,下がmなので、こちらも直感的だと思います。
左右は人差し指/小指でしたが、上下操作は人差し指だけです。

PageUp/Downボタン、マスクでスクロールする生活とおさらばしましょう。

タブ移動

ショートカット名 割り当てショートカット
left tab ctrl + alt + j
right tab ctrl + alt + ;

デフォルトだと Alt + ←/→ ですが、とにかくホームポジション維持、十字キーを使いたくないのでこちらもケアします。

(VCS使用時のみ)差分

ショートカット名 割り当てショートカット
Previous Difference shilft + ctrl + alt + u
Next Difference shilft + ctrl + alt + m

こちらは開発時に(Gitなどの)VCSを使っている場合のみですが、編集による差分に対してカーソルを移動させることができます。
よーし。これでだいたいケアできたな。

カーソル移動+選択状態

ショートカット名 割り当てショートカット
up with Selection shift + ctrl + u
left with Selection shift + ctrl + j
right with Selection sift + ctrl + ;
down with Selection shift + ctrl + m
move caret to Previous Word with Selection ctrl + h
move caret to Next Word with Selection ctrl + :

そんな馬鹿な。ただカーソル移動させるだけ?
選択しながらカーソル移動するケースだってあるでしょ。
というわけで、選択状態+カーソル移動もケアします。

表示分割/移動

ショートカット名 割り当てショートカット
split vertically shift + ctrl + s

ここからはカーソル移動ではなく、使っていて便利だった機能を(ホームポジションを極力崩さない)ショートカットキーに割り当てたものです。
これは、現在開いているEditerに対して表示を分割させるもの。

ほら、同じクラス内の実装個所を見ながら別の個所の実装するとか、あるじゃん?
でもスクロールしながら実装するとかダルイじゃん?
そんな時に、分割表示させればスクロールする手間が省けて、あーら楽ちんっ、てことです。

※他の個所を見ながら、ってそれ結合度観点でどうなんよって突っ込みは受け付けていません。

ショートカット名 割り当てショートカット
go to next splitter shift + ctrl + alt + ;
go to previous splitter shift + ctrl + alt + j

さて、上記で分割したのはいいけど、いざ分割した表示を使わなくなった時には分割先にフォーカスを移動させないと ctrl + f4 で閉じることができません。
そんな時、上記を割り当てておくことでカーソルを移動ができるようになるので、カーソル移動 → ctrl+F4 でタブを閉じる。といった具合に操作することができます。

FileStructure

ショートカット名 割り当てショートカット
File Structure ctrl + i

Ctrl + F12 で File Structure ウィンドウを表示できます。
そのファイル内に定義されている定数・変数・メソッド定義の一覧表示ですね。
フィルタ機能もあるウィンドウです。
が、F12って遠くね?
あなたの小指、誤タイプなしで正確にF12を狙い打つことできる?
それでミスタイプして、「はーF12遠いわー」ってストレス感じるのだったらもう近くに置けばいいじゃん。
ってことで割り当てを変更しています。

Gradle sync

ショートカット名 割り当てショートカット
sync project with gradle file shift + ctrl + alt + F9

Gradleを変更したときに、エディタ上部に出てくる「Gradle変更したならsyncしてね sync」が出てくるあのsyncです。
マウスを握りたくないので、こちらもショートカットキーを割り当てました。

clean

ショートカット名 割り当てショートカット
clean project shift + ctrl + f9

クリーンです。
これもショートカットキーを設定しておくと何かと役に立ちます。

注意

私はこれらのショートカットキーでかなり満足していますが、
実はデフォルトの設定を削除して割り当てています。
「いやいやそのショートカットキーを割り当ててる**はめっちゃ使うでしょ」
という人がいたら、そのショートカットキーを削除しないように割り当てを考える必要があります。

最後に

マウス、十字キーとサヨナラして
快適なコーディングライフをおくろう!!!

でもAndroid Studio以外では、やっぱり十字キーと仲良くしないとね。涙。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(Win版AndroidStudioを使っている)Android開発者に贈る 俺流最高のショートカットキーカスタマイズ

概要

Windows版AndroidStudioを使っている全アプリ開発者に贈る、俺流最高のショートカットキーカスタマイズを紹介します。

はじめに

Windowsのショートカットキーは貧弱過ぎる。
MacとかLinuxなら、十字キーに手を伸ばさなくても済むショートカットキーが標準で用意されているのに、なんでWindowsには無いんだ。ほんと、十字キーに手を伸ばすのが面倒。PageUpもPageDownもHomeもendもctrl+左右も何もかも面倒。はーストレス。

ん、AndroidStudioでは、ショートカットキーのカスタマイズができるのか。
でもそうは言っても特定の機能とか、ウィンドウ表示とかそういうのだけで
俺がストレスに感じているこういうのは、解決できないんでしょ。知ってる知ってる。

...え、できるの...!?まじで...!?

AndroidStudioのショートカットキーは何でも有りなんです

まずはAndroidStudioのショートカットキーの一覧を確認しましょう。

File > Setting > KeyMap でショートカット一覧を確認できます。

Keymap.png

機能ごとにTree形式でショートカットキー一覧が表示されています。
そして右上にある検索窓(①)に知りたいショートカットを入力すれば、関連するショートカットキーがフィルタリングされて表示されます。
そしてうれしいことにショートカットキーからの逆引きもできます。虫眼鏡(②)をクリックして、ショートカットキーを入力すると、該当の項目が表示されます。

では実際に設定してみましょう(読み飛ばし可)

例えば「left」(左)と入力してみます。

keymap_left.png

Leftを含むショートカットキー一覧が出てきました。
カーソルの左移動は「Left」の項目をダブルクリック > 「Add Keyboard shortcut」を選択し、設定したいショートカットキーを入力すれば登録することができます。

例えば、左移動として「ctrl + B」を割り当ててみましょう。
「Add Keyboard shortcut」を選択し「ctrl + B」を入力します。

keymap_left_input.png

警告が出てますね。
Win版AndroidStudioを使っている人ならほとんどの方がお気づきかと思いますが、「ctrl + B」はクラス・メソッド定義にジャンプするショートカットキーなので、「既に割り当てられてるよ」という警告が出ています。
気にせずOKをクリックすると今度は「もとの割り当てはどうする? 消す?残す?」という警告が出ます。
今回はRemoveで消しましょう。 // あとでリセットして復活させます。

さて、これで「OK」で設定画面を閉じれば設定が反映されるはずです。
やってみてください。。。どうでしょう。「Ctrl + B」でカーソルが左に移動するでしょうか。

とりあえずリセットしよ リセット(読み飛ばし可)

お試しで割り当てを実践してもらいましたが、まったく意に反したお試しなのでとりあえずもとに戻しましょう。
先ほどのショートカットキー一覧の画面を再度開いてください。

リセット_windows_copy.png

左上のKeyMapが「Windows」から「Windows copy」になっていると思います。
実は「ctrl + B」の設定を変更したときに、AndroidStudioが自動的にWindows copyを生成して、こちらの設定として「ctrl + B」をLeftに割り当ててくれています。

というわけで、こちらの「Windows copy」を「Windows」に変更して「OK」をクリックすれば設定が元に戻ります。
先ほど自動生成された「Windows copy」は削除して問題ありません。
「Windows copy」を選択した状態ですぐ右にある歯車マークをクリック > Delete を選べば削除できます。

一番いいショートカットキーを頼む(ここからが本題)

さて、Macと同じようにキー割り当てをするなら、先ほどの「Windows」を「Emacs」とか「macOS」とか設定すればいいのですが、AndroidStudioを使い慣れた人だと「いやいや ctrl + N はカーソル移動じゃなくてクラス検索でしょ。」ってなると思います。

ワカル。ワカルヨ。キミノキモチ。

標準でよく使ってるショートカットキーは残しつつ、いい感じの設定がほしい!!!!

見つけたよ。最高の設定を。
私個人観点ではありますが、ショートカットキー設定を紹介したいと思います。

カーソル移動

ショートカット名 割り当てショートカット
up ctrl + u
left ctrl + j
right ctrl + ;
down ctrl + m

まずはシンプルに上下左右をケアします。
左手でctrl, 右手でそれぞれ入力することで、ホームポジションを崩すことなくカーソル移動ができます。

左移動は j 、右移動は;と、進ませたいカーソル方向と合致しているので、直感的かなと思います。

ショートカット名 割り当てショートカット
move caret to Previous Word ctrl + h
move caret to Next Word ctrl + :

ctrl + ←/→ でちょっとだけ早くカーソルを動かす操作、プログラミングに限らず結構あると思うのですが、これについてもケアできます。
左がh、右が:なので、単純なカーソル移動よりも一歩左/右という具合で、こちらも直感的だと思います。

ショートカット名 割り当てショートカット
page up ctrl + alt + u
page down ctrl + alt + m

PageUp/Downについてもケアします。
上がu,下がmなので、こちらも直感的だと思います。
左右は人差し指/小指でしたが、上下操作は人差し指だけです。

PageUp/Downボタン、マスクでスクロールする生活とおさらばしましょう。

タブ移動

ショートカット名 割り当てショートカット
left tab ctrl + alt + j
right tab ctrl + alt + ;

デフォルトだと Alt + ←/→ ですが、とにかくホームポジション維持、十字キーを使いたくないのでこちらもケアします。

(VCS使用時のみ)差分

ショートカット名 割り当てショートカット
Previous Difference shilft + ctrl + alt + u
Next Difference shilft + ctrl + alt + m

こちらは開発時に(Gitなどの)VCSを使っている場合のみですが、編集による差分に対してカーソルを移動させることができます。
よーし。これでだいたいケアできたな。

カーソル移動+選択状態

ショートカット名 割り当てショートカット
up with Selection shift + ctrl + u
left with Selection shift + ctrl + j
right with Selection sift + ctrl + ;
down with Selection shift + ctrl + m
move caret to Previous Word with Selection ctrl + h
move caret to Next Word with Selection ctrl + :

そんな馬鹿な。ただカーソル移動させるだけ?
選択しながらカーソル移動するケースだってあるでしょ。
というわけで、選択状態+カーソル移動もケアします。

表示分割/移動

ショートカット名 割り当てショートカット
split vertically shift + ctrl + s

ここからはカーソル移動ではなく、使っていて便利だった機能を(ホームポジションを極力崩さない)ショートカットキーに割り当てたものです。
これは、現在開いているEditerに対して表示を分割させるもの。

ほら、同じクラス内の実装個所を見ながら別の個所の実装するとか、あるじゃん?
でもスクロールしながら実装するとかダルイじゃん?
そんな時に、分割表示させればスクロールする手間が省けて、あーら楽ちんっ、てことです。

※他の個所を見ながら、ってそれ結合度観点でどうなんよって突っ込みは受け付けていません。

ショートカット名 割り当てショートカット
go to next splitter shift + ctrl + alt + ;
go to previous splitter shift + ctrl + alt + j

さて、上記で分割したのはいいけど、いざ分割した表示を使わなくなった時には分割先にフォーカスを移動させないと ctrl + f4 で閉じることができません。
そんな時、上記を割り当てておくことでカーソルを移動ができるようになるので、カーソル移動 → ctrl+F4 でタブを閉じる。といった具合に操作することができます。

FileStructure

ショートカット名 割り当てショートカット
File Structure ctrl + i

Ctrl + F12 で File Structure ウィンドウを表示できます。
そのファイル内に定義されている定数・変数・メソッド定義の一覧表示ですね。
フィルタ機能もあるウィンドウです。
が、F12って遠くね?
あなたの小指、誤タイプなしで正確にF12を狙い打つことできる?
それでミスタイプして、「はーF12遠いわー」ってストレス感じるのだったらもう近くに置けばいいじゃん。
ってことで割り当てを変更しています。

Gradle sync

ショートカット名 割り当てショートカット
sync project with gradle file shift + ctrl + alt + F9

Gradleを変更したときに、エディタ上部に出てくる「Gradle変更したならsyncしてね sync」が出てくるあのsyncです。
マウスを握りたくないので、こちらもショートカットキーを割り当てました。

clean

ショートカット名 割り当てショートカット
clean project shift + ctrl + f9

クリーンです。
これもショートカットキーを設定しておくと何かと役に立ちます。

注意

私はこれらのショートカットキーでかなり満足していますが、
実はデフォルトの設定を削除して割り当てています。
「いやいやそのショートカットキーを割り当ててる**はめっちゃ使うでしょ」
という人がいたら、そのショートカットキーを削除しないように割り当てを考える必要があります。

最後に

マウス、十字キーとサヨナラして
快適なコーディングライフをおくろう!!!

でもAndroid Studio以外では、やっぱり十字キーと仲良くしないとね。涙。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

#4 Kotlin Koans Introduction/Lambdas 解説

1 はじめに

Kotlin公式リファレンスのKotlin Koans/Lambdasの解説記事です。

Kotlin Koansを通してKotlinを学習される人の参考になれば幸いです。

ただし、リファレンスを自力で読む力を養いたい方は、
すぐにこの記事に目を通さないで下さい!

一度各自で挑戦してから、お目通し頂ければと思います:sunny:

2-1 無名関数

Kotlinでは、変数に関数を代入できる特徴があります(このとき関数を関数オブジェクトと呼びます。)。

代入するには、

fun example(){
  val x = ::plus
  val y = ::minus
}

fun plus(x:Int, y:Int) = x + y
fun minus(x:Int, y:Int) = x - y

このように関数を定義して、それに::という記号をつけます。

また以下のように、変数への代入と関数の定義を同時に行うことができます。

val x = fun(x:Int, y:Int) = x + y

この関数を見てみると関数に名前がありません。

まさにこれが無名関数です。

無名関数とは、変数への代入と関数の定義が同時に行われるものなのです。

無名関数にはいくつかの書式があります。

val f1 = fun(x:Int, y:Int) = x + y
val f2 = fun(x:Int, y:Int) : Int = x + y
val f3 = fun(x:Int, y:Int) : Double{
   return x + y
}
val f4 : (Int,Int) -> Int = fun(x:Int, y:Int) : Int{
  return x + y
}
val f5 : (Int,Int) -> Int = fun(x,y) = x + y

変数f4とf5の(Int,Int) -> Intは変数の型を表しており、

Int型の引数を2つ受け取り、Int型の戻り値を返す型を意味しています。

実際に変数f5に代入された無名関数を利用してみましょう。

fun example(){
  val f5 : (Int,Int) -> Int = fun(x,y) = x + y
  calculatorPlus(f5)
}

fun calculatorPlus(calculator: (Int,Int) -> Int){
  val result = calculator(2,3)
}

変数f5がcalculatorPlus()関数の引数calculatorに渡されています。

それにより、引数calculatorはInt型の引数を2つ受け取り、その2個の値を足した値(Int型)を返す

という役割の関数として利用できるようになります。

なので、calculator(2,3)では5が返ってきます。

やさしいKotlin入門を参考にさせていただきました。)

2-2 ラムダ式

ラムダ式とは関数オブジェクト(無名関数)の略記です。

(無名関数を変数に代入)
val f1 : (Int,Int) -> Int = fun(x:Int,y:Int) = x + y

(ラムダ式を変数に代入)
val f2 : (Int,Int) -> Int = {x,y -> x + y}

{}の部分がラムダ式で、x,yが関数が受ける引数、x + yが関数の戻り値です。

xとyそれぞれに型が指定されていないのは、(Int,Int) -> Intから型を推論しているからです。
(この場合だと、xとyともにInt型であることがわかる。)

また、ラムダ式を引数として渡すときには、いくつかの書式があります。

psss()関数にラムダ式を渡す場合

pass({x,y -> x + y})
pass(){x,y -> x + y}
pass{x,y -> x + y}

今までのラムダ式の説明はラムダ式の受ける引数の種類が2種類(xとy)の説明をしてきました。

ラムダ式の受ける引数が1種類である場合、ラムダ式をさらに省略することができます。

ラムダ式が引数x(String型)を受けて、戻り値としてx + "ラムダ"を返すとします。
このラムダ式を変数に代入します。

val f1 : (String) -> String = {x -> x + "ラムダ"}        //省略無しのラムダ式
val f2 : (String) -> String = {it + "ラムダ"}          //省略有りのラムダ式

引数xがitに置き換わり、戻り値の記述のみに省略することができます。

引数が1種類の場合、全てitに置き換わります。

やさしいKotlin入門を参考にさせていただきました。)

3 Introduction/Lambdasの解説

Kotlin Koans Introduction/Lambdasの解説です。
随時本サイトの内容を引用させていただきます。

右側の本文を見てみましょう。

Kotlin supports a functional style of programming. Read about higher-order functions and function literals (lambdas) in Kotlin.
Pass a lambda to any function to check if the collection contains an even number. The function any gets a predicate as an argument and returns true if there is at least one element satisfying the predicate.

Kotlinは関数型(関数オブジェクト)をサポートしている。Kotlinの高級関数とラムダについて読みなさい。
any()関数にラムダ式を渡し、collectionに偶数が含まれるかを調べなさい。
any()関数は引数としてラムダを受け取り、もし1つでもラムダの条件を満たす要素があればtrueを返す。

とあります。
(高級関数とは、関数を引数として受け取るもしくは戻り値として返す関数のことです。)

左側の

fun containsEven(collection: Collection<Int>): Boolean = collection.any { TODO() }

のTODO()の箇所を書き換え、collectionの要素に偶数があるか(any()関数がtrueを返すか)調べればよいということになります。

偶数がtrueの真偽値をとるには、(要素) % 2 == 0のように、要素の余りが0か調べます。

また、collection.any { TODO() }に関して、any()関数では引数として受けとったラムダ式にcollection内の各要素を1つずつ渡していきます。

以上のことから、

fun containsEven(collection: Collection<Int>): Boolean = collection.any { it % 2 == 0 }

とすれば、引数(collectionの要素)を受けて、それが偶数ならtrueを返すというラムダ式をany()関数に渡すことができますね。

高級関数とラムダについて
any関数について

4 最後に

次回はKotlin Koans Introducion/Stringsの解説をします:muscle:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Android / Java】表示Fragmentによりイベントを切り替える

はじめに

Android Studio(java)でアプリを開発していて、「表示しているフラグメントに応じて端末の戻るボタンを押した時の処理を切り替える」という実装をしたい場面があった。
そのときに学んだ内容を投稿します。

学んだ内容

コードの一部を記載

ActivityからFragmentを表示

このアクティビティxmlファイルにフラグメントを表示させる

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

    <FrameLayout
        android:id="@+id/fl_activity_main"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

フラグメントの表示処理はこのように行う

MainActivity.java
// 指定したフラグメントを表示するメソッド。引数のfragmentに表示したいフラグメントのインスタンスを渡す。
    public void showFragment(Fragment fragment, FragmentManager fragmentManager) {

        fragmentManager
                .beginTransaction()
                .replace(R.id.fl_activity_main, fragment)
                .addToBackStack(null)
                .commit();
    }

表示しているFragmentを取得してイベント(処理)を行う

今回は例として、端末の戻るボタンを押したときに表示されているフラグメントがFooFragmentまたはBarFragmentであれば、アクティビティを終了させる、という実装にしている。

MainActivity.java
// onBackPressed()は端末の戻るボタンを押した時に呼ばれるメソッド
@Override
    public void onBackPressed() {
        // ここで現在表示しているフラグメントを取得
        // findFragmentById()の引数にはフラグメント表示のreplace()で表示先のレイアウト部品のid(コンテナ)を入れる。
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fl_activity_main);

        // FooFragmentまたはBarFragmentを表示しているときにはアクティビティを終了(finish)
        if (fragment instanceof FooFragment || fragment instanceof BarFragment) {
            finish();
        }
        super.onBackPressed();
    }

最後に

どのように表示しているフラグメントを判断させるか、意外と簡単に実装ができた。
今後も学習した内容を積極的にアウトプットしていきます。

参考資料

ありがとうございました!!

Android 初めてのFragment イベント編

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Google Play Consoleで APK拡張ファイル(.obbファイル)をアップロードする方法

Google Play Consoleで
APK拡張ファイル(.obbファイル)をアップロードしようとしたところ
ハマったので、書き残しておく

注意

  • APKファイルを一番初めにアップロードする時しか、OBBファイルは追加できない
    • もしOBBファイルを追加忘れても、あとから追加はできない
    • 同じバージョンのAPKファイルは再アップできない
    • アップロードしたAPKファイルを削除もできない
    • よって、VersionCodeの値を変更後、再アップロードするしか方法がない (←つらい)
  • 新しいUI(2020/11/2〜デフォルトになるらしい)では既存のUIと指定場所が違う
    • 今回は新しいUIの画面です

手順

  1. Google Play Consoleにログイン
  2. アプリの画面に移動
  3. リリース > ご希望のテスト > 新しいリリース作成 (通常のリリース作成手順)
  4. APKファイルをアップロードする
  5. アップロードが環境すると、APKファイルが表示されるので、その一覧の右の点をクリック スクリーンショット 2020-10-10 11.16.14.png
  6. APK拡張ファイル(.obbファイル)追加メニューが表示されるので、選択
  7. OBBファイルを指定してアップロード
雑感

UIわかりやすくしてほしい…。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「端末の戻るボタン・画面クリック」でダイアログを終了させない方法

AlertDialog.Builder(activity, R.style.Dialog)
            .setTitle("タイトル")
            .setMessage("メッセージ")
            .setCancelable(false) // setCancelableでfalseをセット
            .show()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

firebaseのCrashlyticsの移行

「2020 年 11 月 15 日以降も引き続き Firebase コンソールでクラッシュ レポートを取得するには、一般提供版の Firebase Crashlytics SDK にアップグレードしてください。 」

と言う割に、gradleの設定に手こずったのでメモ。

公式の導入手順はiOS版の設定しか見れない...。なぜか、Androidの方を見ようとしてもiOSの手順が表示されてしまう。ブラウザの問題かなー。
2020/10時点では、バージョンもシビア?(多分レポジトリ 設定が足りてないせい)で、crashlytics:17.2.2が見つからなく、バージョンをあげるとビルドできなかった....。

プロジェクトのbuild.gradle

dependencies {
    classpath 'com.google.gms:google-services:4.3.3'
    classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0'
}

アプリケーションのbuild.gradle

apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'


android {
    productFlavors {
        production {
            manifestPlaceholders = [crashlyticsEnabled: true]
        }
        development {
            manifestPlaceholders = [crashlyticsEnabled: false]
        }
    }

    buildTypes {
        release {
            manifestPlaceholders = [crashlyticsEnabled: true]
        }

        debug {
            manifestPlaceholders = [crashlyticsEnabled: false]
        }
    }
}

dependencies {
    // firebase
    implementation 'com.google.firebase:firebase-analytics:17.4.4'
    implementation 'com.google.firebase:firebase-messaging:20.2.3'
    implementation 'com.google.firebase:firebase-crashlytics:17.1.1'
}

AndroidManifest.xml

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="${crashlyticsEnabled}"
        />

変数の優先度は、buildTypes < productFlavors の順なので、productionのreleaseビルドの時だけ、有効になってあとは無効化される。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む