65965


kotlinはまったく初めての者ですが、googleのandroidデベロッパーズサイト掲載のkotlinコードについての質問です。  
ダイアログの解説ページ( <https://developer.android.com/guide/topics/ui/dialogs#kotlin>
)に、kotlinのコードで下記のように "activity?" というものが記述されています。  
「nullでなければActivityが存在している」ということと思います。  
一方、Android Studioでkotlinでのプロジェクトを作って activity?.println("OK") と書くと unresolved
reference となります。  
デベロッパーズサイトのようにactivityを使うにはどうすればよいのでしょうか？

[code]

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        return activity?.let {
          ....
        } ?: throw IllegalStateException("Activity cannot be null")
    }
    
[/code]

OOPer様、ありがとうございます。

「activityと言うのは、DialogFragmentのプロパティ(親クラスのFragmentから継承したもの)です。(JavaのgetterメソッドgetActivity()が、Kotlinではプロパティとして扱われています。)」についてですが、デベロッパーズサイトを見ると、  
"Activity! getActivity() Return the Activity this fragment is currently
associated with." とありますが、activityフィールドについての記述はありません。  
「activity?ってなんだろう？」と思った時、どうやって調べればよいのでしょうか？

自分で書いてみたコードは下記の単純なものです。activityプロパティの無いクラスですね。

[code]

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            activity?.println("OK")
        }
    }
    
[/code]


CC BY-SA 4.0
2020-04-25T13:08:41.753
65960
2020-04-26T00:47:17.427
2020-04-26T00:21:23.510
32105
32105
question
android kotlin
android kotlinでのactivity?.let{ }のactivityについて


## _「nullでなければActivityが存在している」ということと思います。_

正直、この書き方ではあなたが正しく理解できているのかどうかが見えてこないのですが、Kotlin学習において「null安全なコードの書き方」は肝になるところなので、「思います」なんて、あやふやなまま放置されない方がいいでしょう。

まず、`activity`と言うのは、`DialogFragment`のプロパティ(親クラスの`Fragment`から継承したもの)です。(Javaのgetterメソッド`getActivity()`が、Kotlinではプロパティとして扱われています。)

その値は`FragmentActivity?`と言うNullableな型ですので、`?.`と言う[safe
call演算子](https://kotlinlang.org/docs/reference/null-safety.html#safe-
calls)を使っています。

  * `activity`が非`null`なら`let`を呼ぶ、`null`なら何もせず`null`を返す

と言う動作になります。

* * *

## _activity?.println("OK") と書くと unresolved reference となります。_

コードを示される場合には、コードの一部分をそれだけ示されても意味を持ちません。できるだけ、そのコードが呼び出される文脈(少なくともどのクラスのどのメソッド、できればそのクラスやメソッドがどう使われるのかわかる情報も)を示してください。

上に書いたように、`FireMissilesDialogFragment`というクラスは、`activity`というプロパティを(継承して)持っています。したがって、メソッド(メンバ関数)中で`activity`と書けば、そのプロパティの値を表すことになります。

「Android
Studioでkotlinでのプロジェクトを作って」としか書いていないので、どこにそのコードを書かれたのかがわからないのですが、`activity`なんてプロパティを持たないクラスの中に書かれたのではないですか?

また、`println`はKotlinではトップレベル関数ですから、呼び出しにドット記法は使いません。

`activity`という名称のプロパティを持つクラス中であれば、

[code]

        activity?.let {
            println(it)
        }
    
[/code]

という書き方なら動くでしょう。

* * *

こちらもKotlinに関しては、ざっくり基本を学んだばかりなので、何もかもに詳しくお答えすることは難しいですが、上記の説明で分かりにくいところなどあれば、コメントしてください。

* * *

追記部分について。

### _デベロッパーズサイトを見ると、"Activity! getActivity() Return the Activity this fragment
is currently associated with." とありますが、activityフィールドについての記述はありません。_

その通りですね。現在のAndroidサイトのKotlin用リファレンスでは、そこら辺がうまく表現できていないようです。

KotlinからJavaのクラスを使う場合、次の記事も意識しておかないといけません。  
[Calling Java from Kotlin](https://kotlinlang.org/docs/reference/java-
interop.html#calling-java-code-from-kotlin)

[Getters and Setters](https://kotlinlang.org/docs/reference/java-
interop.html#getters-and-setters)

要はJavaのクラスに`get〜()`と言うgetterと`set〜(...)`と言うsetterメソッドがある場合(setterはなくても良いんですが)、それらは(メソッドではなく)Kotlinのプロパティになる、ってことが書いてあります。

AndroidのKotlin版ドキュメントについては、改善要望など出されると良いと思いますが、その辺が完全に反映されるまで、`activity...`と言う式を見つけたら、`activity`と言うプロパティ定義がないかだけでなく、`getActivity()`と言うgetterメソッドがないかも一緒に探さないといけないと言うことになります。


CC BY-SA 4.0
2020-04-25T19:54:05.747
65965
2020-04-26T00:47:17.427
2020-04-26T00:47:17.427
13972
13972
65960
answer